サブディレクトリにインストールしたWordPressのマルチサイトをマルチドメインで運用するとき


この記事の所要時間: 549

普通、マルチサイトを作成して、それぞれに独自ドメインを割り当てる場合、WordPress Multisite Domain Mappingプラグインを使用します。これは公式でも推奨されている方法です。しかし、このプラグインはサブディレクトリにインストールしたWordPressのマルチサイトには対応していません。


public_html/blog/blog/wp-content等

このようなサイトでこのプラグインを有効化すると、wp_die関数が呼ばれエラーメッセージが表示されます。
そこで、仕方ないので今回はこのプラグインをカスタマイズしてなんとか表示されるようになったので、やり方をメモしておきます。

前提知識

WordPressではWordPress アドレス (URL) とサイトアドレス (URL)を、環境変数を用いて、動的に定義すると複数のドメインでアクセスできるようになります。それぞれの詳しい説明は以下を参照下さい。

[wp-config.php の編集 – WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86#WordPress_.E3.82.A2.E3.83.89.E3.83.AC.E3.82.B9_.28URL.29)

しかし、この方法はマルチサイトでは機能しないそうです。なので、マルチサイト起動時にサイトとブログを判別する部分をカスタマイズして、マルチドメインを実現します。
サイトとブログの判別はwp-includesのms-settings.phpで行われていますが、その前に以下のような分岐があり、これを事前に設定しておくことで、デフォルトの判定ロジックを回避することができます。

また、この条件分岐の前に

という記述がありwp-confing.phpに

がありwp-content/にsunrise.phpがあればそれを先に読み込んでくれます。つまり、ここで$current_site, $current_blogに何かがはいっていればWordPressのデフォルトの判定を回避し、サイトURLとブログURLにデフォルト以外のものを設定できるということです。
デフォルトだとwp-config.phpに記述しているサイトURLが入ってしまうため、これを行わないとマルチドメインには対応できません。

WordPress Multisite Domain Mappingの使い方と対処方法

このプラグインはインストールするだけではダメで、プラグイン内に入っているsunrise.phpをwp-content/に置く必要があります。

普通のマルチサイトならこれで動きます。設定画面からブログIDとドメインを対応付けるだけです。
今回のような場合には設定画面を開くとエラーメッセージが表示されます。
そこで、まずはエラーになる部分をコメントアウトします。

これで、設定画面が使えるようになります。
次に設定画面からブログIDとドメインを対応付けてみると、パスがおかしいため、WordPressファイルを何も読み込んでくれません。
ソースを確認すると

のような感じになっていました。本当は、

のようになって欲しいはずなので、その部分をカスタマイズします。

(実は、この時点でも、プラグインを停止にすると正常に表示されます。でも、有効化するとパスがおかしくなるため、サイト追加の際に一瞬崩れてしまうので頑張って直しましょう。)

ずっと、グローバル変数の$current_blogの中身が原因だと思ってたのですが、違いました。試しに
var_dumpで、$current_blog,$current_siteの中身をプラグインを有効化したときと停止したときで比べてみました。

すると一緒だったので、ここが原因じゃないのが分かりました。
それ以外であるとしたら、フックをかけている部分だと思ったので見てみると、以下の様なものを見つけました。

これだ!このフックで全部、URLを指定されてたみたいです。
ここをコメントアウトでも条件をfalseにしちゃうでもなんでもいいですが、無効にすればいけます。
最後のadd_actionもちゃんとコメントアウトしないと管理画面で何か更新するとリダイレクトとかされちゃいますのでご注意!

原因追求で思い込みはよくないですね。。。
とりあえず、表示されたのでメモ。

追記

上記だけのやりかただと、プラグインの中に正常に動作しないものがあり、原因の調査と対応を行いました。

問題

動かなかったプラグインを見てみると、ライブラリの呼び出しにグローバル変数を使用していて、それには/blog/が入っていませんでした。

もう一度$current_site, $current_blogの中身を確認してみました。
すると$current_blogの中身がメインのドメインのサイトとマッピングしたドメインのサイトでは異なっていました。
メインがDBの内容を使っているのに対して、マッピングしたドメインでは’/’だけになっていました。

(↑var_dump結果)

修正内容

修正箇所は2箇所です。

1. sunrise.phpで以下の様な記述があります。これでは、データベースの中身を使われずに$current_blogのpathが全て’/’になってしまいます。ここをコメントアウトしてください。

2. 次にdomain-mapping.phpです。template_redirectにフックをかけてURLを独自に設定していたみたいですね。こををコメントアウトしましょう。しないとリダイレクトループとかになっちゃいます。

以上です。

投稿者紹介

疋田駿
Unicast Inc. ソフトウェアエンジニアRuby,Rails,React,Redux,ReactNative,Android,Elasticsearch,Dockerとか触りながら生計を立ててる。Thinkpad×fedora。ErgoDox愛好家な一児の父。

人気の記事

コメント

  1. […] グURLにデフォルト以外のものを設定できるということです。 [紹介元] サブディレクトリにインストールしたWordPressのマルチサイトをマルチドメインで運用するとき | ユニキャストラボ […]

コメントを残す

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

PAGE TOP