本文约 3,918 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:备份插件解决不了”只导出一部分数据”
完整备份有 UpdraftPlus 这类工具,但实际工作里更常见的需求是”只导出一部分”:把 2024 年之后发布的产品导出给客户核对价格;把某个分类下的 500 篇文章连自定义字段一起导出,准备迁到新站;每月导出一次订单数据给财务。
WordPress 自带的「工具 → 导出」只能导出默认的文章/页面/自定义类型,格式是 WXR(XML),不含自定义字段,也不能按字段值筛选。WP All Export 补的就是这块:它把导出拆成”选什么数据 → 选哪些列 → 什么格式 → 什么时候跑”四步,配置可以存成模板反复用。
原理分析:导出其实是”查询 + 列映射”
导出的底层逻辑可以理解成两条 SQL 加一层映射:
- 选数据:按文章类型、分类、作者、状态、日期区间、自定义字段条件筛出一个 ID 集合;
- 取列:对每个 ID,按你拖好的列配置逐个取值(标题、内容、特色图 URL、某个 meta、某个分类名)。
这个结构决定了两件事:
- 筛选条件越精确,导出越快;不加任何条件导出十万条数据,内存和超时都会出问题。
- 列的取值方式决定了迁移难度。比如特色图导出成”附件 ID”在新站毫无意义,导出成”图片 URL”才可能被 WP All Import 重新下载;分类导出成 slug 比导出成 ID 更安全。
| 导出格式 | 适用场景 | 注意 |
|---|---|---|
| CSV | 给客户看、进 Excel、给财务 | 中文需 UTF-8 BOM,否则 Excel 乱码 |
| XML | 配合 WP All Import 迁移 | 结构可自定义,字段嵌套友好 |
| JSON | 给程序/接口消费 | 字段类型保持较好 |
| Excel(XLS/XLSX) | 客户直接改完回传 | 通常需付费扩展 |
另外一个关键设计:导出的”列配置 + 筛选条件”可以保存为模板。模板复用意味着每月的例行导出不需要重配,也让”导出 → 导入”的迁移链路可重复验证。
保姆级实操
第一步:新建导出并选择数据源
「All Export → New Export」,选择 Post Type(如 product)。之后进入「Choose Data to Export」:
- Specific Post Type:带可视化筛选器,最常用;
- WP_Query Results:直接贴 WP_Query 参数(PRO 版),适合复杂条件;
- Custom Query:直接写 SQL(PRO 版),适合跨表聚合。
第二步:配置筛选条件
常用筛选器:
- Taxonomy:等于 / 不等于某个分类;
- Author、Post Status、Date Range(Publish date / Modified date);
- Custom Field:
price大于 1000,或stock等于 0。
想做”库存为 0 且价格大于 1000 的产品”,用 WP_Query 模式更直观:
array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
'meta_query' => array(
'relation' => 'AND',
array( 'key' => 'stock', 'value' => 0, 'compare' => '=', 'type' => 'NUMERIC' ),
array( 'key' => 'price', 'value' => 1000, 'compare' => '>', 'type' => 'NUMERIC' ),
),
'tax_query' => array(
array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => 'ventilation' ),
),
)
需要跨表统计(比如”导出评论数超过 10 的文章”)时用 Custom Query:
SELECT p.ID, p.post_title, COUNT(c.comment_ID) AS comment_count
FROM wp_posts AS p
LEFT JOIN wp_comments AS c ON c.comment_post_ID = p.ID AND c.comment_approved = '1'
WHERE p.post_type = 'post' AND p.post_status = 'publish'
GROUP BY p.ID
HAVING comment_count > 10
ORDER BY comment_count DESC;
第三步:拖列并调整取值格式
右侧列编辑器把可用字段列出来,拖到中间即可。几个高频调整:
- 特色图:默认可能导出 ID,改成导出 URL(列设置里选
Export the image URL),迁移时才能被重新下载; - 分类:选
Export the term names(名字)或Export the term slugs(slug),多值可设分隔符; - 自定义字段:在列编辑器底部「Add Custom Field」填 meta_key,例如
_price; - 内容:可勾选
Export the post content as HTML,否则会剥掉标签。
顺序即 CSV 列顺序,导出前在预览区核对一遍表头。
第四步:保存模板并试跑
点「Export」前先确认右上角行数合理。第一次建议只导出前 10 条验证格式:在筛选里加「Limit to 10 records」。确认无误后点「Save Template」存为”月度产品导出”。
第五步:定时导出
PRO 版在「Manage Exports → Scheduling」里开启自动导出,会生成一段 cron URL:
# 每月 1 号凌晨 3 点触发一次导出
0 3 1 * * /usr/bin/wget -q -O - "https://mimangfei.com/wp-cron.php?export_key=XXXX&export_id=2&action=processing" >/dev/null 2>&1
导出文件可以配置输出到 FTP/SFTP 或亚马逊 S3,避免堆积在站点目录里被人直接下载。若你已用系统 crontab 接管了 WP-Cron,调度机制的原理和取舍参见 WP-Cron 改用系统 crontab。
第六步:把导出结果喂回导入
迁移场景的标准流程是:本站 WP All Export 导出 XML → 新站 WP All Import 导入(唯一标识用 SKU 或 slug,图片勾”下载远程图片”)→ 导入后核对数量与随机抽 10 条比对字段 → 最后统一替换域名(见 批量替换文章内容)。
常见踩坑
- Excel 打开 CSV 中文乱码。 导出时勾选 UTF-8 BOM,或让客户用”数据 → 从文本导入”并指定 UTF-8。
posts_per_page => -1导致超时。 大数据量分批导出(按年份、按分类),或直接加fields => ids减小内存占用。- 导出了 meta ID 而不是值。 自定义字段若存的是附件 ID、用户 ID,直接导出在新站是废数据,必须先转成 URL / 用户名 / slug。
- 内容里的短代码没展开。 导出的是原始内容,短代码会以
形式存在,迁移到不同主题的新站后可能失效。 - 定时导出 URL 泄露。 该 URL 不需要登录即可触发导出,别提交到公开仓库;必要时限制 IP 或加一层 Basic 认证。
- 导出的文件留在
wp-content/uploads/可公开访问。 里面可能含未发布的草稿内容或客户数据,务必改到非 Web 可访问目录,或加.htaccess限制。 - 案例: 客户要求”每月导出一次全站产品含价格”。管理员建好导出后忘了设行数上限,导出脚本一次遍历 3 万条并逐条取 20 个 meta,PHP 内存打到 512M 上限直接 500,导出失败还把站点拖慢了两分钟。改成按分类分 6 次导出、每次 5000 条,并把内存限制提到 1G 后稳定。教训:导出的成本随”行数 × 列数”增长,务必分批处理并监控内存。
总结
用 WP All Export 的口诀是”筛选先行、格式对齐、模板复用”:先把条件收紧到真正需要的那部分数据,再把每列的取值格式调成”可迁移”的形态(URL 而非 ID、slug 而非 ID),最后把配置存成模板让重复导出不再重配。
判断导出是否成功的三条标准:行数与后台筛选结果一致;随机抽 10 条在新环境能完整还原(含图片与分类);过程不把站点拖慢。例行导出建议输出到站外存储并加访问控制。数据出口整理好之后,导入侧的映射配置可以参考 WP All Import 批量导入配置。
