SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

WordPressのURL変更

問題

WordPressのURL変更を伴う引っ越し、どうするとよい?

答え

簡単なWordPressならMySQLのダンプファイルの文字列置換でも引っ越せるが、WordPressのデータはシリアライズされたphp変数のデータなどを含むため、単純に置換するとアンシリアライズに失敗してエラーが発生したり、正常に動作しなくなったりする。

wp-cli にはそのあたりも考慮して置換してくれる機能がある。

WordPressをインストールしたディレクトリで以下を実行。

$ wp search-replace 'https://移転元/のURL/' 'https://移転先/のURL/'

結果は以下のような出力で教えてくれる。(記事がほとんどない環境でテストしたのでReplacementsの数がとても少ないけど。)

+------------------+-----------------------+--------------+------+
| 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            | PHP  |
| 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                  | 10           | 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: Made 14 replacements.

同じサーバー内でディレクトリだけ変更するような場合は、データベースはそのままで、WordPress設置場所だけ変更して、移転先で wp search-replace で引っ越せる。

$ wp search-replace 'https://example.com/移転元ディレクトリ/' 'https://example.com/移転先ディレクトリ/'

サーバー移転を伴う場合は、移転元でダンプ取得、移転先でリストア、移転元のWordPressのファイル一式を移転先にコピー、wp-conifg.php を書き換えてデータベースにはつながる状態にしてから wp- search-replace .

$ wp search-replace 'https://移転元/のURL/' 'https://移転先/のURL/'

どうなってしまうのか結果が怖いときは –dry-run でどのテーブルがどのくらい書き換わるのか件数だけだが確認できる。

$ wp search-replace --dry-run 'https://移転元/のURL/' 'https://移転先/のURL/'

機能としては単純に文字列の置換のようなので、以下のようなことも一応可能だが、予定外の箇所が書き換えられる可能性がある。

$ wp search-replace 'http://' 'https://'
$ wp search-replace '.com' '.net'

「移転元URL → 移転先URL」のような、予定外のものを巻き込まないようなキーワードで実行するのがよいと思われる。

参考

wp-cliのインストールはこちらを参照

https://make.wordpress.org/cli/handbook/guides/installing/

wp-cliのリファレンスはこちら

https://developer.wordpress.org/cli/commands/

関連するメモ

コメント