--- title: "WordPress 使用 WP-CLI 批量更换域名" tags: ['WordPress', 'WP-CLI', 'Debian'] published: 2022-03-22 20:13:54 updated: 2022-03-22 00:00:00 excerpt: "本文将指导如何在 Debian 11 和 Ubuntu 20.04 下 WP-CLI 更换 WordPress 域名。" --- > 本文件是烧饼博客文章的 Markdown 原文,正式版本见 https://u.sb/wordpress-wp-cli-change-domain/ > 全站文章与页面索引见 https://u.sb/llms.txt,建议先读索引再继续抓取。 本文将指导如何在 Debian 11 和 Ubuntu 20.04 下 WP-CLI 更换 WordPress 域名。 *PS:本文同时适用于任意 Linux 系统,请自行承担使用风险* ## 前提背景 有时候我们需要给 [WordPress](https://wordpress.org/) 更换域名,大多数网上的教程是要你从 [phpMyAdmin](https://www.phpmyadmin.net/) 提交 SQL 语句,而且大多数教程要你修改的表就两个,实际上有三个。 对于本站的读者来说,我们都有 `root` 权限了,不需要这货,此时我们直接拿出大杀器,WordPress 官方的 [`WP-CLI`](https://wp-cli.org/) 工具。 ## 安装 WP-CLI 按照[官方教程](https://wp-cli.org/#installing),直接安装: ```bash 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` 信息: ```bash root@wordpress ~ # sudo -u www-data 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 域名 首先,按照本站的 [LEMP](/debian-install-nginx-php-mysql/) 或 [LAMP](/debian-install-apache-php-mysql/) 教程,复制一份 Nginx 或 Apache 的配置,让其同时生效新旧域名,记得 SSL 证书也需要更新。 然后,进入 WordPress 的安装目录,假设目录为 `/var/www/example.com` 旧的 URL 为 `https://old.example.com`,需要替换的新的 URL 为 `https://new.example.com`: ```bash cd /var/www/example.com sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run ``` 此时并不会真正施行替换命令,因为我们加了 `--dry-run` 参数,你可以看到需要替换的条目数是否和预估的匹配: ```bash 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_content`,`post_content` 和 `guid` 需要替换,没有问题的话就直接执行: ```bash 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`,加入下面两行代码来完成新的域名替换: ```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)` ![WordPress 后台常规设置中修改站点地址](https://s.bh.sb/uploads/2022/03/22/iYnw2gzFRc96dUm.png) 这两种方法治标不治本,仅对新的文章参数生效,旧的文章和评论地址里都是旧域名,所以我们还是推荐使用 `WP-CLI` 直接替换新的域名。 最后别忘了更新 `Nginx` 或 `Apache` 配置,让旧的域名跳转到新的域名: Nginx 配置如下 ```nginx server_name old.example.com; return 301 https://new.example.com$request_uri; ``` Apache 配置如下 ```apache RewriteEngine On RewriteCond %{HTTP_HOST} ^old.example.com [NC] RewriteRule ^(.*)$ https://new.example.com$1 [R=301,L] ```