サイトアイコン Capital P

WordPress のドメイン名やURLを変える際の GUID 問題のちゃんとした話

WordPress サイトの URL を変更することってよくあると思います。たとえば開発環境から本番環境にデプロイする時とか、サイトを SSL 化するときとかですね。

その時に Search and Replace 系のプラグインだったり WP-CLI だったりがデータベース内に保存されている URL を置換するために活躍するわけですが、WordPress のデータベース内にシリアライズ化されたデータとして保存されている GUID は、Codex にはどんな事情があっても変換しないでと書かれています。

ドメイン名はどこに保存されている?

WordPress サイトのホスト名は、だいたい以下の3箇所に保存されています。

ダッシュボードの [設定] – [一般]

ここに保存されている 「WordPress アドレス」と「サイトアドレス」っていう2項目の変更が必要になりますが、ドメイン名を移行するとそもそも管理画面にアクセスできなかったりするので、wp-config.php に以下のように記述しましょう。

define( 'WP_HOME','http://example.com' );
define( 'WP_SITEURL','http://example.com' );

個人的には、管理画面で触るよりも wp-config.php に書いておく方法を強く推奨します。

記事やウィジェットの中

たとえば投稿や固定ページからサイト内の別のページにリンクを貼ったり、画像を読み込んだりすると、それらはその作業をした時点でのホスト名が使用されますので、ドメイン名等がかわるとリンク切れになりますので置換する必要があります。

記事がそれほど多くなくコマンドラインが苦手な場合は DB をまさぐるよりも手作業でやったほうが安全だと思います。

コマンドラインが使える人は後述する WP-CLI で一発で置換できます。

GUID

これが本題ですね。WordPress は記事や画像などのオブジェクトに GUID という一意な ID をつけており、これは URL っぽい文字列で保存されています。

https://capitalp.jp/?p=1028

なぜかというと GUID は、RSS フィードなどで使われるためにインターネット全体で一意である必要があって、そのために WordPress ではたまたまドメイン名を混ぜているんです。(つまり URL っぽいフォーマットじゃなくてもいいということ。)

で、インターネット上で一意である必要があるということは逆にいうと簡単にほいほい変わるべきじゃないということも意味しています。

たとえば WordPress の設定でパーマリンク構造を変えるとしますよね。それでもこの値は変わりませんし、変わるべきではないと考えられています。

GUID を変えてはいけないとき

たとえば最近ならウェブサイトをSSL化したときですね。この時に URL が HTTP から HTTPS に変わるわけですが、だからといって GUID を https:// にかえるべきではありません。

ドメイン名がなんらかの事情によって変わったけど、これまでと同じウェブサイトとしてリダイレクトとかする際にも同様です。GUID は変更するべきではありません。

これを変えてしまうとたとえば RSS リーダー等でみなさんのブログを購読しているユーザーに既読のはずの記事が大量に復活することになります。

WP-API でも GUID は使われていますので、GUID の変更でクライアント側で何らかの問題が生じることは可能性としてありえます。

GUID を変えてもいいとき

たとえば開発用のホスト名 127.0.0.1:8080 みたいなのから本番環境にデプロイする時には変えた方がいいかもしれませんが、変えなかったからといって実害もありません。

そもそも公開直後のサイトは投稿もそれほどないでしょうし、フィードにせいぜい1件記事があるかどうかっていう程度でしょうから GUID はほとんど表に出ない内部的な処理で使われるだけの存在です。

なので、WordPress の Codex では、「Never, ever, change the contents of the GUID column, under any circumstances」と変更しないことを推奨しています。

https://codex.wordpress.org/Changing_The_Site_URL

個人的には、これだけのためにプラグインをインストールして、ブラウザからボタンを押して明らかに処理が重そうで途中でタイムアウトしそうなことをやるぐらいなら、コマンドラインツールでやるか、諦めることをおすすめします。

誰かに教えるときは、きちんとこの弊害も教えた上で、スルーしても実害はないよと教えてあげましょう。

わかってる人が確信犯でまるごと置換するぶんには問題ないとは思います。

WP-CLI による URL の変更方法

WP-CLI を使えば比較的簡単にできます。

GUID を変えないとき

$ wp search-replace 'http://example.dev' \
'http://example.com' --skip-columns=guid

 GUID を変えるとき

$ wp search-replace 'http://example.dev' \
'http://example.com'

WP-CLI であれば、多くの場合 PHP のタイムアウト設定が長め、もしくは無制限になっている等、プラグインでブラウザからやるよりもはるかに安全にやることができます。

Wordmoveは丸ごと変えてしまいますので要注意

Movefileの構造的にあきらかに開発環境から本番環境へのデプロイを想定しているので、その場合には問題ありませんが、それなりにトラフィックがあるメディアで SSL を導入する等の事情で wordmove pull して wordmove push する際には注意が必要です。

WP-CLI のような公式なプロジェクトでは、WordPress 本体の開発者もその開発に携わっており、本体側の意図を反映した仕様になりますが、サードパーティーのツールはそうではありませんので、特に DB を触っちゃう系は使用する前に十分にクオリティ等を確認するためのスキルが必要となります。

結論

コマンドラインとか MySQL に不慣れで、この置換作業であたふたするぐらいなら変えなくても実害はないです。

いやいやそれでも僕はやりますよというのは全然問題ないですが、Codex の趣旨も理解した上で初心者の人に教えてあげていただけると世の中がちょっと平和になるんじゃないかと思います。

モバイルバージョンを終了