WordPress で利用しているドメイン名を変更する方法のメモ書きです。
今回、このブログの WordPress データを (開発目的で) 丸ごと別環境にコピーして動かしたいと思ったのでちょっとやってみることに。
必要な手順をざっと組み立てるとこんな感じになると思います。
- DB のダンプ、画像ファイルのコピー
- 移行先環境の準備とデータ展開
- wp_options でドメイン名の変更
- 投稿データに静的に記述された内部リンクの修正
1 と 2 は SSH で CLI から操作するなり、phpMyAdmin と FTP で操作するなりすれば良いので割愛しますが、3 と 4 については今後の為にちょっと書いておきたいと思います。
スポンサーリンク
wp_options でドメイン名の変更
WordPress で吐き出される各種 URL は wp_options の中に入っているドメイン名より生成されているので、これを最初に変更する必要があります。
通常は管理画面から簡単に変更できますがリストア直後はこれが不可能なので、今回は DB を直接編集して利用するドメイン名を変更してみました。
変更するテーブルは「wp-options」で編集する箇所は下記。
select * from wp_options where option_name = 'home'; +-----------+-------------+-----------------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+-------------+-----------------------------+----------+ | 39 | home | http://example.com/hoge | yes | +-----------+-------------+-----------------------------+----------+ select * from wp_options where option_name = 'siteurl'; +-----------+-------------+-----------------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+-------------+-----------------------------+----------+ | 3 | siteurl | http://example.com/hoge | yes | +-----------+-------------+-----------------------------+----------+
これをこんな感じにアップデート。
UPDATE wp_options SET option_value='https://worklog.be' WHERE option_name = 'home'; UPDATE wp_options SET option_value='https://worklog.be' WHERE option_name = 'siteurl';
これで管理画面にアクセスできるようになり、大体の内部リンクは新しいドメイン名で表示できるようになります。
後から知りましたが、wp-config.php に下記を設定すれば DB を修正しなくてもいける様子。
define('WP_HOME', 'https://worklog.be'); define('WP_SITEURL', 'https://worklog.be');
この設定は wp_options に対してフィルターフックかけ値を上書きしているようです。
どちらでも目的は達成できると思いますが、wp-config.php で変更すると管理画面からの変更ができなくなるそうなので DB を編集しとくのが無難なのかもしれないです。変更箇所も少ないですし。
投稿記事で静的に記述した内部リンクの変更
上記の修正で大体は移行できたと思うのですが、記事内に貼られた画像や静的に記述したアンカーテキストは別の方法で変更する必要があります。(動的に生成していない URL の部分)
今回はお手軽にフィルターフックを使ってこんな感じの処理を functions.php へ追加。
function domain_replace( $content ) { $dom1 = '/example.com\/hoge/'; $dom2 = 'worklog.be'; $content = preg_replace( $dom1, $dom2, $content ); return $content; } add_filter( 'the_content', 'domain_replace' );
もし、ドメイン名の引っ越し目的であれば、DB 内を書き換えておく方が良いとは思いますので、その場合は文字列を置換してくれるプラグインとかを使って修正する感じになると思います。
簡単ですが、こんな具合に割りと簡単にドメイン名の変更ができました。