为什么每个 WordPress 站长都该学会 wp-cli
只要你用 WordPress 建过站,就一定经历过这样的场景:后台点一个插件更新,转圈半天最后白屏;批量删除几千条垃圾评论,翻页翻到手抽筋;想改一下数据库里的站点地址,却不知道怎么下手。这些操作在 WordPress 后台里往往又慢又危险,而 wp-cli 就是为解决这些问题而生的。
wp-cli 是 WordPress 的官方命令行工具。它把几乎所有后台能做的事情——发布文章、更新插件、清理数据库、批量改选项、导出导入、搜索替换——都变成了可以在 SSH 里一行命令完成的操作。对个人站长来说,它带来的最大价值有三个:速度快(不受 PHP 超时限制)、可脚本化(能写进 cron 定时执行)、可远程(不用登录后台,SSH 连上就能管)。
这篇文章会从安装开始,一步步带你掌握 wp-cli 在日常运维中的核心用法,重点讲那些真正能帮你省时间的场景,而不是把命令手册照抄一遍。
安装 wp-cli:三种方式与推荐做法
wp-cli 底层是一个 PHP 脚本(phar 包),只要服务器有 PHP CLI 就能运行。以下三种安装方式,我推荐优先级从高到低:
方式一:下载 phar 到系统路径(推荐)
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp这一步做完,wp 命令就全局可用。验证一下:wp --info,能看到 PHP 版本、wp-cli 版本和 WordPress 相关路径就说明装好了。
方式二:包管理器安装
# Debian/Ubuntu
curl -sS https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -o /tmp/wp-cli.phar
chmod +x /tmp/wp-cli.phar
mv /tmp/wp-cli.phar /usr/local/bin/wp也可以用 distro 自带的包,但版本往往偏旧,不建议在生产环境使用。
方式三:Docker 环境
如果你的 WordPress 跑在 Docker 里,直接在容器内执行即可:
docker exec -it wordpress wp --info注意:wp-cli 必须能在 WordPress 根目录找到 wp-config.php 才能工作。有两种做法,一是 cd 到站点根目录再执行,二是用 --path=/var/www/html 参数指定路径。多站点服务器上,我建议始终显式指定 --path,避免在错误目录里执行改了别的站。
日常运维:插件与主题批量管理
这是 wp-cli 最实用的部分。后台更新插件时,PHP 请求会因为执行时间过长被掐断,导致更新卡在"维护模式"。用 wp-cli 就没有这个烦恼,因为它不受 web 服务器的 max_execution_time 限制。
# 列出所有插件及其状态
wp plugin list --path=/var/www/html
# 更新单个插件
wp plugin update akismet --path=/var/www/html
# 更新所有有新版可用的插件
wp plugin update --all --path=/var/www/html
# 停用并删除某个插件
wp plugin deactivate old-plugin --path=/var/www/html
wp plugin delete old-plugin --path=/var/www/html主题同理:wp theme update --all。升级前的标准动作是先备份数据库和 wp-content 目录,升级后再跑一次 wp plugin list 确认没有插件被意外停用。
还有一个经常被忽略的点:升级后验证。很多人更新完就不管了,其实应该用 wp core verify-checksums 校验核心文件完整性,用 wp plugin verify-checksums --all 检查插件文件是否被篡改。这对发现被植入的后门特别有用。
数据库与内容批量操作
WordPress 站跑久了,数据库里会堆积大量无用数据。用 wp-cli 清理比装一堆"数据库优化插件"干净得多:
# 删除所有已标记为垃圾的评论
wp comment delete $(wp comment list --status=spam --format=ids) --force
# 删除所有修订版本
wp post delete $(wp post list --post_type=revision --format=ids) --force
# 删除所有待审核且超过 90 天的评论
wp comment list --status=hold --format=ids批量搜索替换是迁移搬家时的救命功能。WordPress 的序列化数据(比如主题选项里的数组)如果用普通 SQL 直接替换,很容易把序列化结构改坏导致配置全部丢失。wp-cli 会正确处理序列化数据:
# 先干跑(dry-run)看会改多少处,不实际写入
wp search-replace 'old-domain.com' 'new-domain.com' --all-tables --dry-run
# 确认无误后再真正执行
wp search-replace 'old-domain.com' 'new-domain.com' --all-tables --precise--dry-run 一定要养成习惯,先用它数清楚影响范围,再摘掉它正式执行。--precise 会让替换以 PHP 层面逐行处理,更安全但稍慢。
用户、选项与定时任务
用 wp-cli 管理用户和选项,可以完全绕开易受攻击的后台登录:
# 新建管理员(后台被锁时救命)
wp user create admin2 admin2@example.com --role=administrator --user_pass='强密码'
# 重置某人密码
wp user update 1 --user_pass='新密码'
# 查看/修改站点 URL(迁移必备)
wp option get siteurl
wp option update siteurl 'https://www.example.com'
# 查看伪静态规则并刷新
wp rewrite list --format=csv
# 处理定时任务(wp-cron)
wp cron event list
wp cron event run --due-nowWordPress 默认的 wp-cron 是"有人访问才触发"的模式,流量小的站会经常错过定时任务。用 wp-cli 配合系统 crontab 才能真正可靠:在系统 crontab 里加一行 */5 * * * * cd /var/www/html && wp cron event run --due-now >/dev/null 2>&1,再把 wp-config.php 里的 DISABLE_WP_CRON 设为 true,定时发布和备份任务就不会再漏。
生产环境的注意事项
wp-cli 权限等同于 WordPress 的 PHP 进程,用好了是利器,用错了能毁站,几点务必注意:
- 执行用户要对。如果用 root 执行,生成的文件属于 root,之后 PHP-FPM 以 www-data 身份运行时可能没有写权限。正确做法是
sudo -u www-data wp ...。 - 关键操作前先备份。
wp db export backup.sql一条命令就能全库导出,配合wp db import恢复,比任何插件都快。 - 不要在 wp-content 里乱删。删除插件要用
wp plugin delete,别手动 rm 目录,否则数据库里会留下孤儿数据。 - 插件更新可以定时化。在 crontab 里加一条每周执行的
wp plugin update --all,让安全补丁自动跟上,但记得同步做好备份。
定时化与自动化:把重复劳动交给 cron
wp-cli 真正拉开和后台操作差距的地方,是它能被脚本和定时任务调用。下面几个自动化场景,几乎每个认真运营的 WordPress 站都用得上。
每日自动备份数据库
写一个备份脚本,配合 crontab 每天凌晨执行,把数据库导出并保留最近 7 天:
#!/bin/bash
DATE=$(date +%Y%m%d)
cd /var/www/html
wp db export /backup/db_$DATE.sql --path=/var/www/html
find /backup -name "db_*.sql" -mtime +7 -delete然后 crontab -e 加一行 0 3 * * * /root/backup.sh,凌晨三点自动跑。比任何"定时备份插件"都可靠,因为它不依赖网站被访问、也不占用 PHP 资源。
批量发布与定时发布
如果你需要批量导入文章,wp-cli 可以直接从 CSV 或 SQL 导入,也可以逐条创建:
wp post create --post_title="标题" --post_content="正文" --post_status=publish --post_category=3配合 --post_date="2026-11-01 09:00:00" 还能设置未来发布时间,实现内容提前排期。
站点健康巡检脚本
把几项检查串成一个脚本,每周跑一次,及早发现问题:
wp core version
wp plugin list --update=available
wp theme list --update=available
wp db check
wp site health status常见报错与排查思路
用 wp-cli 过程中会遇到几个典型报错,这里给出原因和解决办法:
- "Error: This does not seem to be a WordPress installation.":说明当前目录没有 wp-config.php,或没加
--path。进对目录或用--path=指定即可。 - "Error: YIKES! It looks like you're running this as root.":出于安全考虑,wp-cli 默认拒绝以 root 运行。加
--allow-root可以绕过,但更推荐sudo -u www-data wp ...换成正确用户。 - 命令卡住不动:多见于开启了维护模式(.maintenance 文件残留)。手动删掉站点根目录下的
.maintenance文件即可。 - 插件更新后站点白屏:多半是新版插件与当前 PHP 版本不兼容。用
wp plugin deactivate 插件名在命令行里停用(此时后台进不去也能操作),站点就恢复了。 - search-replace 后序列化错乱:说明没加
--precise,或直接用了 SQL 替换。以后务必用 wp-cli 处理而非裸 SQL。
多站点批量管理:一条 for 循环管所有站
如果你手上不止一个 WordPress 站,wp-cli 的价值会翻倍。把所有站点路径列出来,用一个循环批量执行,几分钟就能完成几十个站的操作:
#!/bin/bash
SITES="/var/www/site1 /var/www/site2 /var/www/site3"
for s in $SITES; do
echo "=== $s ==="
sudo -u www-data wp core update --path=$s
sudo -u www-data wp plugin update --all --path=$s
sudo -u www-data wp db optimize --path=$s
done这段脚本可以挂进 crontab 每周执行一次,等于给你的全部站点配了一个"自动运维管家"。要注意的是:批量操作时最好加 --quiet 减少输出,并把日志重定向到文件,方便出问题时回溯。
批量检查插件版本也是个常见需求。下面这行能列出每个站需要更新的插件数量,一眼看出哪台服务器"欠更新":
for s in /var/www/*/; do
n=$(sudo -u www-data wp plugin list --update=available --format=count --path=$s)
echo "$s 待更新插件: $n"
donewp-cli 的安全性:别把后门留给自己
wp-cli 功能强大,也意味着它是一条"绕过所有后台安全措施"的通道。它直接以服务器用户身份操作数据库和文件,不经过登录验证、不经过插件防火墙。所以使用它的前提是:SSH 本身必须足够安全。几点建议:
- SSH 禁用密码登录,只用密钥;禁用 root 直连,改用普通用户加 sudo。
- 服务器上不要把 wp-cli 设为全局可写,防止被入侵后篡改。
- 多用户服务器上,确保每个站的文件属主分离,wp-cli 用对应属主执行,避免跨站读写。
- 如果站点同时开放 XML-RPC,务必给它限速或加上额外的认证,否则它会是比 SSH 更弱的入口。
换句话讲,wp-cli 之于 WordPress,就像终端之于图形界面——效率更高,但操作失误的代价也更大。把 SSH 安全做扎实,wp-cli 才是一个放心使用的好工具。
小结
wp-cli 不是什么高深技术,它只是把 WordPress 后台的功能搬到了命令行。但正是这种"朴素",让它成为个人站长运维 WordPress 时最值得掌握的工具之一。建议你从今天开始,把"登录后台点按钮"的习惯逐步换成"SSH 里敲 wp 命令",你会发现维护一个 WordPress 站的效率能提升好几倍——尤其是当你要管理多个站点,或者需要定时批量处理内容的时候。