WordPressのマルチサイトのトラブル解消
特殊な条件でマルチブログ化したはいいけど、実際に使ってみたらなんか挙動が怪しいときがある。
自分が遭遇したマルチブログ関係のトラブルと解消方法を掲載します。
ネットワーク管理画面がリダイレクトループ
俺が一番よく遭遇する現象。大概の人はこれで悩むのではないか。
これが起きる状況としては以下となる。
現象
ネットワーク管理者画面がリダイレクトループしてしまう。
発生条件
- さくらさんとかで簡単インストールしてwpディレクトリ(ドメイン→子ディレクトリならディレクトリ名はwpやろうがblogやろうが関係なし)にインストール。
- 管理画面より、ホームページURLをドメインを直下に設定。
- wp-header.phpと.htaccessをwpディレクトリ外に追加で置いて、wpディレクトリ内を擬似的にドメインで表示するようにしている。
- マルチブログ化している。
原因と対処方法
上記の発生条件を全て満たすとき、wp-header.phpから実体であるwp/wp-admin/network/に一度つながり、wp/wp-admin/network/はwp-admin/network/へ転送する。
ただし、wp-admin/network/は実体ディレクトリとしては存在していないので、404で元のディレクトリwp/wp-admin/network/に戻り、更にそこからwp-admin/network/をリクエストするのでリダイレクトループが発生する。
そもそも、wp-admin/network/から直接呼び出されるファイルはadmin.phpとなっており、こいつには上記のループを作り出すコードがまんま条件で存在している。これが条件を満たしたときに途端にいたずらしてくる。
なので「wp-admin/network/admin.php」のリダイレクトを外してやれば解決。
27行目付近:
$redirect_network_admin_request = apply_filters( 'redirect_network_admin_request', $redirect_network_admin_request ); if ( $redirect_network_admin_request ) { //←件の条件 //wp_redirect( network_admin_url() ); //←こいつをコメントアウト exit; } unset( $redirect_network_admin_request );
弱点は、Wordpressのアップデートでこの設定は元に戻ること。
ただ、シンプルな書き方がされているadmin.phpは早々中身が変わることはないと思われるので、ローカルにこれを残しておいて、アップデートの際にそのまま入れ替えれば当面は問題ないと思われる。
子サイトの管理画面でInternal Error 500が発生する
発生は割とない・・・と思いたい(汗
WordPressの公式コミュニティでも話題があったが、結局解決せずに終わっていたのでピックアップした。
というのも、普通にドメイン直下にインストールやサブディレクトリにインストールをしただけではこの現象は発生しない。
現象
子サイトの管理画面 (ドメイン)/zzz/wp-admin/をリクエストした際に500エラーが発生する。
発生条件:
- サブディレクトリにWordpressをインストールしている。
- 公開用のルートディレクトリが上記とは別に設定されており、ドメインを持っている(仮にxxxx.netとする)。
- サブディレクトリ(仮にyyyy)をメインサイトと異なるドメイン(仮にyyyy.netとする)に設定している。
- yyyy.netにマルチサイト設定を行っている。
- マルチサイトでの子サイトのサイト及びホームページ設定がyyyy.net/zzzとなっている
原因と対処方法
複数ホームページを所有するために、同じサーバーのサブディレクトリyyyyにメインディレクトリのドメインとは異なる別ドメイン(サブドメインかどうかは問題ではない)を設定することで発生する。
WordPressにかかわらず大体のCMSは常にLinuxの公開ディレクトリをベースに稼働しています。
根幹であるhttpサーバーApacheの仕様です。
マルチサイト設定の際に、.htaccessとwp-config.phpのマルチサイト用のコードが管理画面上に出力され、恐らくそれをまんまコピペして設定していると思います。
発生条件を満たした場合、出力されたマルチサイト用のコードは、.htaccessに間違った(けど、サーバー的に見れば正しい)設定を含んでしまう。
そのため、.htaccessには公開用のルートディレクトリ(xxxx.net)を根っことした、サブディレクトリ(=yyyy.netとして設定したディレクトリであるyyyy)が出てくるわけです。
それを踏まえて、.htaccessは以下のように修正を行います。
.htaccessの内容:
RewriteEngine On #以下はサブディレクトリのドメインルートである /=yyyy.net RewriteBase / RewriteRule ^index\.php$ - [L] # add a trailing slash to /wp-admin RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] #以下の「yyyy/」はルートディレクトリ(xxxx.net)から辿って参照されているため修正 #RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) yyyy/$2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] #上記と同様の理由で下記のように変更 #RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ yyyy/$2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L]
以上で、子サイトのInternal Error 500は解除されると思われます。