如何批量导出 WordPress 的文章?

作者: 王炳明 分类: 工具库 发布时间: 2021-12-05 22:14 热度:977

做程序员四年多的时间里,写了 400 多篇的博客和笔记,全部发表在自己的个人网站上,本地很多都没有存档。

今天突发奇想,想把网站上的所有文章全部导出到本地,方便本地的查阅和内容更新。

但是找了一圈,至今都没有专门插件可以做这件事,最后没办法只能自己研究一下。

把任务梳理拆解一下:

  1. 第一步:理清数据库表关系
  2. 第二步:导出 csv 数据到本地
  3. 第三步:编写脚本 将csv 的数据内容进行分门别类的整理生成 md 文件

1. 理清库表关系

首先明确我们的目标,是要将文章的 md 原文保存到本地,这就决定了我们需要这些数据:

  • 文章标题:用做 md 文件名
  • 文章内容:文件保存的内容
  • 文章分类:同一类的文章置于同一目录下

文章的标题和内容,很容易就可以在 wordpress.wp_posts 表中查到,字段名分别是:

  • post_title
  • post_content_filtered

最麻烦的要属文章的分类。

我找了一圈才知道 wordpress 是如何管理这些文章的。

原来在 wp_term_relationships 表中记录了每篇文章的 term_taxonomy_id,一篇文章会可能会有多个 term_taxonomy

如何批量导出 WordPress 的文章?

为什么会有多个 term_taxonomy ?这个 term_taxonomy 又如何理解 呢?

taxonomy 中文解释就是分类的意思。

在 wordpress 中,term_taxonomy 有多种,包括类别(category)、标签(tag)和导航菜单(nav_menu)

它们都用的同一张表记录,存于 wp_term_taxonomy 表中。

如何批量导出 WordPress 的文章?

这个库表理顺后,写 SQL 语句的逻辑就清晰了

use wordpress;
select 
    p.post_title,t.name,p.post_content_filtered 
from wp_posts p, wp_term_relationships r,wp_terms t, wp_term_taxonomy tt 
    where p.id=r.object_id 
    and r.term_taxonomy_id=t.term_id 
    and tt.term_id=t.term_id 
    and tt.taxonomy='category';

2. 导出 csv 数据

从 MySQL 中导出 csv 数据,可以使用 into 语法,但这个语法需要设置 –secure-file-priv ,我嫌麻烦就没用使用它。

于是我打开我的数据库连接管理软件(DBeaver),输入上面的 SQL 语句,将查询的结果直接导出到本地的 posts.csv 文件中

如何批量导出 WordPress 的文章?

3. 整理数据成md文件

posts.csv 就三个数据

"post_title","name","post_content_filtered"

编写一个 Python 脚本来处理一下

import os
import csv

WORK_DIR = os.getcwd()


def set_post_dir():
    post_dir = os.path.join(WORK_DIR, category)
    if not os.path.exists(post_dir):
        os.mkdir(post_dir)
    os.chdir(post_dir)


with open('posts.csv', newline='') as csvfile:
    posts = csv.reader(csvfile)
    for post in posts:
        if post[1] == "name":
            continue
        post_title, category, post_content = post

        set_post_dir()
        try:
            with open(post_title+".md", "w") as post_file:
                post_file.write(post_content)
        except Exception as exp:
            print(exp)
            print(f"category: {category}")
            print(f"title: {post_title}")
            print(f"content: {post_content}")

运行完成后,在本地查看一下,每个分类都有一个目录

如何批量导出 WordPress 的文章?

而每个分类下都有各自文章的 markdown 原文

如何批量导出 WordPress 的文章?

导出后,有一些特殊符号可以发生变化,比如

左尖括号  变成   <
左尖括号  变成   >
双引号   变成   "
单引号   变成   '

需要你再使用特定的工具进行全局的查找替换

文章有帮助,请作者喝杯咖啡?

发表评论