【WordPress】既存ドメインを新ドメインへ変更してサイトを公開する

こんにちは

今回は既存の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 以外にも色々と機能があるので、そちらも今度は試したみたいと思いました

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA