type
status
date
slug
summary
tags
category
icon
password
URL
🌱 背景:为什么我要重新开始?
最近,我发现自己的 WordPress 网站越来越“沉重”——后台响应迟缓、数据库膨胀、插件冲突频发。虽然站点内容不多,但因为早期安装了大量实验性插件,导致数据库中残留了许多无用表和冗余选项。久而久之,网站性能明显下降,维护成本反而上升。
于是,我决定采取一个经典但有效的策略:彻底清零,从头再来。
目标很明确:
- 部署一个全新的、干净的 WordPress 环境;
- 只迁移真正需要的内容(文章、分类、标签);
- 彻底摆脱历史包袱,轻装上阵。
然而,问题来了:我的文章总量不小,导出的 XML 文件超过 15MB。通过 WordPress 后台“工具 → 导出”功能下载时,由于服务器带宽有限(仅 1Mbps),浏览器频繁因超时中断,文件总是在下载到 10MB 左右时失败。
怎么办?这时候,我想到了一个更高效、更可靠的方案——使用 WP-CLI 命令行工具直接在服务器端导出 XML。
⚙️ 为什么选择 WP-CLI?
WP-CLI 是 WordPress 官方推出的命令行工具,被誉为“WordPress 开发者的瑞士军刀”。相比传统的后台操作,它有以下显著优势:
- 不依赖 Web 界面:即使后台卡顿甚至无法访问,只要能 SSH 登录,就能操作;
- 执行效率高:直接调用 PHP 和数据库,绕过 HTTP 请求和浏览器限制;
- 支持自动化:可集成到脚本中,实现批量或定时任务;
- 输出稳定可靠:生成的 XML 是标准 WXR(WordPress eXtended RSS)格式,与官方导入器完全兼容。
对于像我这样需要导出大文件、又受限于网络环境的用户来说,WP-CLI 几乎是唯一可行的方案。
🛠️ 准备工作
在动手前,需确保以下条件满足:
- 拥有服务器的 SSH 访问权限(我使用的是 Ubuntu 22.04 LTS);
- 当前用户对网站目录有读取权限(通常需进入
wp-config.php所在目录);
- PHP CLI 环境已安装且可用(可通过
php -v验证);
- WP-CLI 尚未安装(大多数生产环境默认不包含)。
🔒 注意:出于安全考虑,本文已对服务器 IP、域名、路径等敏感信息进行脱敏处理。
📝 操作步骤详解
第一步:安装 WP-CLI
由于直接从 GitHub 下载常因网络问题失败,我改用清华大学开源镜像站提供的国内加速链接:
仍然失败,那就手动下载:
安装完成后,验证是否成功:
如果看到 PHP 版本、WP-CLI 版本等信息,说明安装成功!
💡 提示:若遇到 proc_open() disabled 错误,需编辑 php-cli.ini,移除 disable_functions 中的 proc_open 和 proc_get_status。这是宝塔等面板环境的常见限制。
第二步:生成标准 WXR XML 文件
进入 WordPress 站点根目录(即
wp-config.php 所在位置),执行导出命令:该命令会:
- 自动识别 WordPress 配置;
- 遍历所有文章、页面、分类、标签、作者等;
- 生成一个标准命名的
.xml文件(如yoursite.2025-11-08.xml);
- 不包含插件数据或无用表结构,仅保留内容层信息。
✅ 重要说明:wp export 默认已包含附件(图片)的 URL 引用,无需额外参数。所谓“附件”是指媒体库中的文件链接,而非二进制数据本身,因此 XML 文件体积可控。
第三步:安全下载 XML 文件
由于文件较大(>15MB),不要通过浏览器下载!而是利用 SSH 协议直接拉取:
在本地电脑终端执行(非服务器内):
这种方式:
- 不受 PHP 超时或内存限制;
- 连接稳定,支持大文件传输;
- 无需暴露 Web 目录权限。
🧩 遇到的问题与解决方法
在整个过程中,我遇到了几个典型问题,记录如下供参考:
问题 | 原因 | 解决方案 |
wp: command not found | WP-CLI 未安装 | 通过清华镜像下载并安装 |
Permission denied 写入失败 | 在 Web 目录无写权限 | 改在家目录或 /tmp 下载 |
proc_open() disabled | PHP CLI 安全限制 | 修改 php-cli.ini,启用必要函数 |
--with-attachments 报错 | 参数名错误 | 正确写法为 --with_attachments,但通常可省略 |
浏览器下载中断 | 网络慢 + 超时 | 改用 scp 或 SFTP 工具下载 |
🎯 导入到新站点
拿到 XML 文件后,在全新安装的 WordPress 后台:
- 安装官方插件 “WordPress Importer”;
- 上传 XML 文件;
- 勾选 “下载并导入文件附件”(确保旧站图片仍可访问);
- 映射作者,完成导入;
- 删除 Importer 插件,保持系统干净。
至此,一个轻盈、高效、无历史负担的新站点就诞生了!
但是,我在运行导入器导入文章后,过20-30秒左右提示:HTTP ERROR 524,页面卡在:
https://www.hotelenglish.cn/wp-admin/admin.php?import=wordpress&step=2
我点击浏览器的返回键,回到后台,显示:
“抱歉,有错误发生。
文件是空的。请上传有内容的文件。这个错误也有可能是因为您的 php.ini 文件禁止了上传,或 php.ini 中 post_max_size 的值小于 upload_max_filesize 的值。”
1. HTTP ERROR 524(Cloudflare 特有错误)
524 = A timeout occurredCloudflare 在等待你的服务器响应时超时(默认 100 秒),导入过程耗时超过这个时间(尤其是大 XML 文件 + 下载附件),于是 Cloudflare 断开连接,返回 524。
✅ 这说明:导入其实还在后台继续运行,但浏览器“以为”失败了。
2. 返回后提示“文件是空的”
这是因为你点击“返回”后,浏览器重新提交了一次表单(或刷新了页面),但此时临时上传的 XML 文件已被清理,或者会话失效,导致系统找不到文件。
3. 部分文章已导入,但不完整
这进一步证明:导入进程确实执行了一部分,但被中断(或你以为中断了)。
既然前面能用
wp export,当然也能用 wp import —— 完全绕过 Web 界面和 Cloudflare!前提:
- 已安装官方导入器插件(或 WP-CLI 能识别 WordPress Importer)
- XML 文件已上传到服务器(比如在
/home/ubuntu/site.xml)
步骤:
📌 如果想同时下载图片,则去掉 --skip=attachment,但要确保:
- 旧站图片仍可公开访问;
- 服务器能联网抓取外部资源。
优点:
- 无超时限制(PHP CLI 默认不限时);
- 全程在终端输出进度,清晰可见;
- 不会因浏览器刷新而中断。
✅ 这是我最推荐的方式,尤其适合大站点迁移。
🧪 示例:完整 WP-CLI 导入命令
导入过程中你会看到类似输出:
完成后,直接去前台查看文章是否齐全!
💬 结语
技术的本质是解决问题。面对臃肿的旧系统,与其不断打补丁,不如勇敢地“推倒重来”。而 WP-CLI,正是我们实现这一目标的利器。
希望这篇记录能帮助到同样面临 WordPress 迁移困境的朋友。如果你也有类似经验,欢迎在评论区交流!
龚老师说:干净的系统,从新开始。
本文基于真实运维实践撰写,所有命令均在 Ubuntu 22.04 + WordPress 环境下验证通过。
- 作者:Miro
- 链接:http://miro.cx/article/tech-worpress-renew
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
