こんにちは
今回は既存のWordPressサイトをドメインを変更して、サイトを公開するまで流れをまとめたいと思います
なぜこんなことをするのかと言うと、これまでに何度かWordPressサイトを別のドメインで移管したことがあるのですが、
その際に割と毎回色々なところを調べまわるので、いっそのこと自分でまとめてある場所を作っておきたいと思ったからです
※WordPressサイトの構築手順や中身の詳細は記載しませんので、ご了承ください
■環境
プラットフォーム:Vagrant + Virtualbox
OS:AlmaLinux9
ミドルウェア:Apache 2.4、PHP 8.0
DB:MySQL8.4
サイトFQDN:www.example.com
■流れ
今回は既存FQDNの www.example.com を www.example.net として公開したいと思います
そのうえで、 流れとして下記を予定しています
0. 事前動作確認
1. Apacheのドキュメントルートパスの変更
2. Apacheの confファイルで ServerName、ドキュメントルートパス、confファイル名の変更
3. DBレコード内のURLを一括置換
4. サイト公開
■DBレコード内のURLを一括置換について
通常WordPressではDB内のレコードに投稿した記事が保存され、そのレコード内にサイトURLがハードコーディングされています
また、レコード内のサイトURLは文字数がシリアライズされており、単純にURLを書き換えるのみではシリアライズの数が変更されないので、プラグインなどの不具合に繋がります
なので、シリアライズも対応したURLへ置換するために wp search replace のようなツールを利用し、綺麗に置換する必要が出てきます
なお、今回はGUIから操作可能な Search Replace DB ではなく、サーバー上のCLI から実行可能な wp search replace で対応します
シリアライズ例:
s:19:”https://example.com”;
■手順
0. 事前動作確認
最初に www.example.com のドメイン名でWordPressのコンテンツ画面が見れることを確認します
下記は管理画面です
1. Apacheのドキュメントルートパスの変更
旧ドメイン名を利用して設定していたドキュメントルートパスを変更します
/var/www/vhosts/www.example.com/public_html
↓
/var/www/vhosts/www.example.net/public_html
mv www.example.com www.example.net
2. Apacheの confファイルで ServerName、ドキュメントルートパス、confファイル名の変更
次に諸々旧ドメイン名で設定していたところを変更します
conf名
/etc/httpd/conf.d/vhost.www.example.com.conf
↓
/etc/httpd/conf.d/vhost.www.example.net.conf
ServerName、ドキュメントルートパスなど
<VirtualHost *:80>
ServerAdmin test@example.com
ServerName www.example.com
DocumentRoot /var/www/vhosts/www.example.com/public_html
DirectoryIndex index.php index.html index.xml
<Directory /var/www/vhosts/www.example.com/public_html>
Options FollowSymLinks
AllowOverride All
</Directory>
<FilesMatch \.(php|phar|html)$>
SetHandler "proxy:unix:/run/php-fpm/wp-test-user.sock|fcgi://localhost"
</FilesMatch>
CustomLog "/var/log/httpd/www.example.com-access_log" combined
ErrorLog "/var/log/httpd/www.example.com-error_log"
</VirtualHost>
↓
<VirtualHost *:80>
ServerAdmin test@example.net ★
ServerName www.example.net ★
DocumentRoot /var/www/vhosts/www.example.net/public_html ★
DirectoryIndex index.php index.html index.xml
<Directory /var/www/vhosts/www.example.net/public_html> ★
Options FollowSymLinks
AllowOverride All
</Directory>
<FilesMatch \.(php|phar|html)$>
SetHandler "proxy:unix:/run/php-fpm/wp-test-user.sock|fcgi://localhost"
</FilesMatch>
CustomLog "/var/log/httpd/www.example.net-access_log" combined ★
ErrorLog "/var/log/httpd/www.example.net-error_log" ★
</VirtualHost>
シンタックスチェック
httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK
Apacheの再起動
systemctl restart httpd
systemctl status httpd
→ Active: active (running) になっていればOKです
念のため変更を確認します
httpd -S
→ port 80 namevhost www.example.net (/etc/httpd/conf.d/vhost.www.example.net.conf:1) が表示されていればOKです
一度このタイミングでローカルの host を変更し、http://www.example.net へアクセスしてみます
→ トップページは見れてそうです
次に各記事を押下してみます
→ DB内レコードに記載の旧ドメインが参照されるので、記事が見れない状態です
一応旧ドメインでも確認してみます
→ Apacheの ServerNameが異なるので 403 になりました
3. DBレコード内のURLを一括置換
それでは、大本命の DBレコード内のURLを一括置換してみます
まず最初に現状のレコード状態がどうなっているのかを確認します
テーブルの確認
mysql> show tables; +-----------------------+ | Tables_in_wp_test_db | +-----------------------+ | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_usermeta | | wp_users | +-----------------------+ 12 rows in set (0.01 sec)
homeurl と siteurl の確認
SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
+-----------+-------------+------------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+-------------+------------------------+----------+ | 3 | home | http://www.example.com | on | | 2 | siteurl | http://www.example.com | on | +-----------+-------------+------------------------+----------+ 2 rows in set (0.00 sec)
→ 旧ドメインのままです
記事内のURLを確認
mysql> SELECT guid FROM wp_posts;
mysql> SELECT guid FROM wp_posts; +-----------------------------------+ | guid | +-----------------------------------+ | http://www.example.com/?p=1 | | http://www.example.com/?page_id=2 | | http://www.example.com/?page_id=3 | | http://www.example.com/?p=4 | | http://www.example.com/?p=5 | | http://www.example.com/?p=6 | | http://www.example.com/?p=7 | | http://www.example.com/?p=8 | | http://www.example.com/?p=9 | | http://www.example.com/?p=10 | | http://www.example.com/?p=11 | +-----------------------------------+ 11 rows in set (0.02 sec)
→ すべて旧ドメインとなっています
現状の確認が完了したので、実際に wp search replace を利用して、ドメインの一括置換をしていきます
最初にこちらの公式手順に則りwp-cliをインストールします
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar.asc
curl -L https://raw.githubusercontent.com/wp-cli/builds/gh-pages/wp-cli.pgp | gpg --import
gpg --verify wp-cli.phar.asc wp-cli.phar
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info
[root@wpalma9 ~]# wp --info OS: Linux 5.14.0-427.28.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Aug 2 03:44:10 EDT 2024 x86_64 Shell: /bin/bash PHP binary: /usr/bin/php PHP version: 8.0.30 php.ini used: /etc/php.ini MySQL binary: /usr/bin/mysql MySQL version: mysql Ver 8.0.46 for Linux on x86_64 (MySQL Community Server - GPL) 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: phar:///usr/local/bin/wp WP-CLI packages dir: WP-CLI cache dir: /root/.wp-cli/cache WP-CLI global config: WP-CLI project config: WP-CLI version: 2.12.0
→ 上記のように表示されればインストール完了です
早速 wp search replace を利用してみます
なお、コマンドの構造は下記のようになっています
wp search-replace 'http://【旧ドメイン】' 'http://【新ドメイン】'
wp search replace を利用するためには WordPressが インストールされているドキュメントルートまで移動する必要があります
※wp search replace は wp-config.php 内に記載の DB_NAME を参照して実行されるので、もし新環境などで実行する場合は必ず wp-config.php を変更してください
cd /var/www/vhosts/www.example.net/public_html
・通常ユーザー
wp search-replace 'http://www.example.com' 'http://www.example.net' --dry-run
・rootユーザー(rootユーザーでの実行は –allow-root のフラグが必要です)
wp search-replace 'http://www.example.com' 'http://www.example.net' --dry-run --allow-root
・実行結果
+------------------+-----------------------+--------------+------+ | 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 | 0 | 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 | 0 | SQL | | wp_posts | post_content | 2 | 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 | 11 | 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 | 1 | SQL | | wp_users | user_activation_key | 0 | SQL | | wp_users | display_name | 0 | SQL | +------------------+-----------------------+--------------+------+ Success: 16 replacements to be made.
→ 変更対象のテーブル一覧と数が表示されます
それでは、一括置換してみます
・通常ユーザー
wp search-replace 'http://www.example.com' 'http://www.example.net'
・rootユーザー
wp search-replace 'http://www.example.com' 'http://www.example.net' --allow-root
・実行結果
+------------------+-----------------------+--------------+------+ | 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 | 0 | 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 | 0 | SQL | | wp_posts | post_content | 2 | 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 | 11 | 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 | 1 | SQL | | wp_users | user_activation_key | 0 | SQL | | wp_users | display_name | 0 | SQL | +------------------+-----------------------+--------------+------+ Success: Made 16 replacements.
→ 変更されたテーブル一覧と数が表示されます
最後にDBレコード内を確認してみましょう
homeurl と siteurl の確認
SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
+-----------+-------------+------------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+-------------+------------------------+----------+ | 3 | home | http://www.example.net | on | | 2 | siteurl | http://www.example.net | on | +-----------+-------------+------------------------+----------+ 2 rows in set (0.00 sec)
→ 新ドメインに変更されています
記事内のURLを確認
mysql> SELECT guid FROM wp_posts;
+-----------------------------------+ | guid | +-----------------------------------+ | http://www.example.net/?p=1 | | http://www.example.net/?page_id=2 | | http://www.example.net/?page_id=3 | | http://www.example.net/?p=4 | | http://www.example.net/?p=5 | | http://www.example.net/?p=6 | | http://www.example.net/?p=7 | | http://www.example.net/?p=8 | | http://www.example.net/?p=9 | | http://www.example.net/?p=10 | | http://www.example.net/?p=11 | +-----------------------------------+ 11 rows in set (0.00 sec)
→ こちらも新ドメインに変更されています
4. サイト公開
ブラウザ上からサイトの公開状況を確認してみます
→ トップページは大丈夫そうです
→ 各記事も http://www.example.net/?p=9 のように新ドメイン名で公開されていることを確認しました
■最後に
いかがでしたでしょうか
実際の移設では移管元サーバーから移管先サーバーへの rsync 実行などもあるかとは思いますが、最低限この辺りを認識しておけばある程度は移管先でもサイトが動くような気はしています
また、wp-cli は search replace 以外にも色々と機能があるので、そちらも今度は試したみたいと思いました






