跳到主要内容

WP-CLI 实战:WordPress 自动化的瑞士军刀

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 篇测试文章,包含一些代码块:

\\\javascript

console.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 主题到生产环境的完整流程。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注