烧饼博客

WordPress 使用 WP-CLI 批量更换域名

本文将指导如何在 Debian 11 和 Ubuntu 20.04 下 WP-CLI 更换 WordPress 域名。

PS:本文同时适用于任意 Linux 系统,请自行承担使用风险

前提背景

有时候我们需要给 WordPress 更换域名,大多数网上的教程是要你从 phpMyAdmin 提交 SQL 语句,而且大多数教程要你修改的表就两个,实际上有三个。

对于本站的读者来说,我们都有 root 权限了,不需要这货,此时我们直接拿出大杀器,WordPress 官方的 WP-CLI 工具。

安装 WP-CLI

按照官方教程,直接安装:

wget -O wp-cli.phar 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 命令查看 WP-CLI 信息:

root@wordpress ~ # wp --info
OS:	Linux 5.10.0-11-cloud-amd64 #1 SMP Debian 5.10.92-2 (2022-02-28) x86_64
Shell:	/usr/sbin/nologin
PHP binary:	/usr/bin/php8.1
PHP version:	8.1.3
php.ini used:	/etc/php/8.1/cli/php.ini
MySQL binary:	/usr/bin/mysql
MySQL version:	mysql  Ver 15.1 Distrib 10.7.3-MariaDB, for debian-linux-gnu (x86_64) using readline EditLine wrapper
SQL modes:	
WP-CLI root dir:	phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:	phar://wp-cli.phar/vendor
WP_CLI phar path:	/root
WP-CLI packages dir:	
WP-CLI global config:	
WP-CLI project config:	
WP-CLI version:	2.6.0

批量替换 WordPress 域名

首先,按照本站的 LEMPLAMP 教程,复制一份 Nginx 或 Apache 的配置,让其同时生效新旧域名,记得 SSL 证书也需要更新。

然后,进入 WordPress 的安装目录,假设目录为 /var/www/example.com 旧的 URL 为 https://old.example.com,需要替换的新的 URL 为 https://new.example.com

cd /var/www/example.com
sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run

此时并不会真正施行替换命令,因为我们加了 --dry-run 参数,你可以看到需要替换的条目数是否和预估的匹配:

root@wordpress /var/www/example.com # sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run
+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | SQL  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 15           | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 2            | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 1            | PHP  |
| wp_posts         | post_content          | 331          | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 0            | SQL  |
| wp_posts         | guid                  | 19315        | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+
Success: 19664 replacements to be made.

我们可以看到,基本上就 comment_contentpost_contentguid 需要替换,没有问题的话就直接执行:

cd /var/www/example.com
sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com'

执行完成后会出现类似 Success: Made 19664 replacements. 的提示。

注意,如果之前没有开启过 HTTPS,那么你可能需要使用 http://old.example.com 来替换,建议执行两次,不推荐直接执行替换 old.example.com

修改 wp-config.php

我们也可以打开 wp-config.php,加入下面两行代码来完成新的域名替换:

define('WP_HOME','https://new.example.com/');
define('WP_SITEURL','https://new.example.com/');

修改 WordPress 后台设置

我们也可以进入 WordPress 后台,在常规设置里更换新的域名,进入 https://new.example.com/wp-admin/options-general.php 然后更换 WordPress 地址(URL)站点地址(URL)

image.png

这两种方法治标不治本,仅对新的文章参数生效,旧的文章和评论地址里都是旧域名,所以我们还是推荐使用 WP-CLI 直接替换新的域名。

最后别忘了更新 NginxApache 配置,让旧的域名跳转到新的域名:

Nginx 配置如下

server_name old.example.com;
return 301 https://new.example.com$request_uri;

Apache 配置如下

RewriteEngine On
RewriteCond %{HTTP_HOST} ^old.example.com [NC]
RewriteRule ^(.*)$ https://new.example.com$1 [R=301,L]
WordPress 使用 WP-CLI 批量更换域名
无责任编辑
Showfom
发布时间
Mar 22nd, 2022
版权协议
人過留名,雁過留聲,翺翔的飛鳥總會尋到屬於自己的領地
記得,要讓簡樸而純粹的心靜靜地感受,你要相信,美好的世界總會自己尋路向你走來