WP-CLI 实战:WordPress 自动化的瑞士军刀
如果你还在通过浏览器手动点 wp-admin 来管理 WordPress 站点,那你每天都在浪费时间。这篇教程会带你用 WP-CLI 把日常运维任务从「分钟级」压缩到「秒级」。
WP-CLI 是什么
WP-CLI 是 WordPress 官方的命令行工具,提供 100+ 命令覆盖:
- 站点管理(安装、升级、备份)
- 内容管理(post、user、comment、taxonomy CRUD)
- 数据库管理(导出、导入、查询、optimize)
- 配置管理(option、rewrite、cron)
- 插件主题(plugin、theme 的安装/激活/卸载)
安装一行:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info
日常高频操作
1. 批量替换内容
比如要把所有文章里的 old-domain.com 换成 new-domain.com:
wp search-replace 'old-domain.com' 'new-domain.com' \
--dry-run # 先看看会改多少条
wp search-replace 'old-domain.com' 'new-domain.com' \
--all-tables --skip-columns=guid
--dry-run 会列出所有会被影响的行,但不会真正改。确认后再去掉 --dry-run 执行。
2. 一键备份
# 备份数据库
wp db export /backup/wp-$(date +%Y%m%d).sql
打包整个站点
tar czf /backup/wp-site-$(date +%Y%m%d).tar.gz \
--exclude='wp-content/cache' \
--exclude='wp-content/uploads/2024' \
/www/wwwroot/your-site/
3. 批量管理用户
# 给所有 author 角色升为 editor
wp user list --role=author --format=ids | xargs -I{} wp user set-role {} editor
列出 30 天没登录的用户(可清理)
wp user list --fields=ID,user_login,user_registered \
--format=table | head -20
4. 媒体文件处理
# 重新生成所有缩略图(换主题后必备)
wp media regenerate --yes
删除未使用的附件
wp post delete $(wp post list --post_type=attachment --post_status=inherit \
--format=ids) --force
高级技巧
5. wp eval:自定义 PHP 逻辑
wp eval 让你能执行任意 PHP 代码,访问完整的 WordPress API。比写临时插件快多了。
# 列出所有带 featured image 但没 alt 文本的文章
wp eval '
$posts = get_posts(["post_type" => "post", "posts_per_page" => -1]);
foreach ($posts as $p) {
$thumb_id = get_post_thumbnail_id($p->ID);
if ($thumb_id && empty(get_post_meta($thumb_id, "_wp_attachment_image_alt", true))) {
echo $p->ID . ": " . $p->post_title . "\\n";
}
}
'
6. wp shell:交互式 REPL
wp shell
进 wp shell 后可以像 Laravel tinker 一样交互式探索 WP 数据:
> $p = get_post(1);
// 返回 WP_Post object
> wp_get_post_terms(1, 'category', ['fields' => 'names']);
// ["技术", "教程"]
7. wp cron 替代 WP-Cron
WP-Cron 在低流量站点不准(依赖访问触发)。改用系统 cron:
# /etc/cron.d/wp-cron
/15 * www curl -s https://yoursite.com/wp-cron.php > /dev/null 2>&1
实战脚本:批量创建测试数据
在做主题开发时,需要快速造一些文章测试不同场景。我写了个脚本:
#!/usr/bin/env bash
seed-test-data.sh
DOMAIN="https://yoursite.com"
wp eval '
$categories = ["技术笔记", "教程", "随想"];
foreach ($categories as $cat) {
wp_create_category($cat); // 注意 wp_create_category 不存在, 用 wp_insert_term
}
'
更好的方式用 wp post create --prompt 交互式创建,或用脚本批量生成:
for i in {1..10}; do\wp post create \
--post_type=post \
--post_status=publish \
--post_title="测试文章 $i" \
--post_content="这是第 $i 篇测试文章,包含一些代码块:
\
\\javascriptconsole.log(\"hello $i\");
\
\" \
--porcelain
done
常见踩坑
1. wp 命令找不到 wp-config.php
WP-CLI 默认从当前目录向上找 wp-config.php。在 /root/ 跑会报错:
wp post list
Error: This does not seem to be a WordPress installation.
解法:先 cd /www/wwwroot/yoursite/,或加 --path=:
wp post list --path=/www/wwwroot/yoursite/
2. wp db query 中文乱码
默认连接字符集可能不是 utf8mb4:
wp db query "SET NAMES utf8mb4; SELECT ID, post_title FROM wp_posts LIMIT 5;"
3. wp search-replace 改完后站点 404
通常是因为没刷 rewrite rules:
wp rewrite flush --hard
4. wp eval 里的 $ 被 shell 吃掉
在 wp eval '...' 里写 PHP 双引号字符串时,$variable 会被 bash 解析。两种解法:
- 用单引号包整个 PHP 代码(
wp eval '...$var...',shell 不解析) - 转义美元符(
wp eval "...\\$var...")
总结
WP-CLI 是 WordPress 工程师的必备工具。从今天起,把所有能用命令完成的事自动化掉——备份、迁移、批量操作、内容生成——你会发现自己再也不想打开 wp-admin 了。
下一篇会讲用 WP-CLI + Acorn 部署 Sage 11 主题到生产环境的完整流程。