サブディレクトリに入れたマルチブログをサイトルートで運用する
ここに書いた方法はデータベースとwp-admin/network/admin.phpを触ります。一応、動作は制作済のサイトで確認してはいますがWPがぶっこわれた状態になっても知りません。 実行する場合、全て自己責任でお願いしますね!!!!><
リニューアルなどでサブディレクトリにWordpressをインストールした場合の話。
リニューアル後に大抵はドメインをそちら側へ切り替えるわけだが、過去の画像やPDF等のデータをそのまま残しておきたいなど、ファイルの関係でドメイン自体をサブディレクトリへ切り替えてしまうと都合が悪いこともある。
こういうの結構ありふれたケースだと思う。 サブディレクトリへドメインを設定せずに、サイトルートのように扱う。
この場合ならば、同じことを何人も思っているのか、他のサイト様でもよく掲載されている。
単純にサブディレクトリにインストールしただけのWordpressならこういう方法で上手いこといける。
非マルチブログならば。
ところが、サブディレクトリ型でマルチブログ化していたサイトに同じことを行なっても、果たしてうまくいかない。
ここの方法で.htaccessとwp-blog-header.phpの設定を行った上で、http://example.xxx/blogをhttp://example.xxx移そうとしてもうまくハマらない。
流れとしては以下だった。
- まず、最初にhttp://example.xxx/blogをhttp://example.xxxへすべく、サイトネットワーク管理画面からメインブログのHomeURLを変更しようとする。 だが、悲しきかなサイトネットワーク管理画面のブログIDの1番を確認すると・・・。 なんと管理画面からはHomeURLは変更できない。 最初からクライマックス。
- ここで、phpMyAdminを立ち上げて、wp_optionsテーブルを見る。 option_nameカラムのhomeに該当する行に設定されたoption_valueをhttp://example.xxx/blogをhttp://example.xxxに変更する。 よし、うまくいった!・・・なーんてことはなかったぜ!! http://example.xxxにアクセスした瞬間、データベース接続確立エラー。 人をおちょくってるとぶっ飛ばす。
- 今度はwp_blogsへ。ダメ元でpathのhttp://example.xxx/blogをhttp://example.xxxに変更。
うまく・・・・・いっったあああああああああああああ!!意気揚々と管理画面へいったところ・・・
サイトネットワーク管理画面「あ、今リダイレクトループ中だから、お前の席ねーしwww」
ハハハ・・・・おのれディケイドォォォォォオオオオ!!!!
とりあえずまぁこんな感じ。
リダイレクトループが発生するとそこに至るまでのフローがいかんせんわかりづらい。
wp-configの設定は間違っていないか?wp-blog-headerの設定は間違っていないか?
調べに調べた。しかしながら結果は全滅。
ここで一瞬詰みじゃないかと、本気で焦った。
まぁ・・・そんなことで泣き寝入りするのも嫌だったので・・・。
根本に返ってリダイレクトループがなぜ発生するかを調べた。
通常、同じURLへリダイレクトが何度も発生するとリダイレクトループとして吐き出される。
そもそも、wp-admin/network/にリダイレクトが走ってるからこうなっているのではないか。
ならば、wp-admin/network/を調べればいい。
wp-admin/network/には.htaccessなどは存在しない。
そんなこんなで最終的にwp-admin/network/へ呼びだされているであろうadmin.phpに辿り着いた。
28行目付近に怪しい箇所が見つかりましたよ。
boolean値を条件に取ってあり、その下は明らかにリダイレクトしてるような関数。
$redirect_network_admin_request = apply_filters( 'redirect_network_admin_request', $redirect_network_admin_request );<br />//↓こいつ if ( $redirect_network_admin_request ) {<br />wp_redirect( network_admin_url() );<br />exit;<br />}<br />unset( $redirect_network_admin_request );<br />[/php]
もしやと思って、サイトルートからマルチブログしておいたテスト環境とhttp://example.xxxとの条件を比較。 boolean値は・・・前者はfalse、後者はtrue。
きたああああああああああああああああああああああああああああああああああ!!!!!!!
全てが氷解。なんとも言えない達成感。
リダイレクト関数とexitをコメントアウトしたら、サイトネットワーク管理画面が天使になった。
まぁともあれ・・・最終的なやり方としては、こうだろう。
準備
ここのやり方に従ってまずは.htaccessとwp-blog-header.phpを設定しておく。
データベース側
まずはサイトのURLをサイトルートに設定するため、メインブログのwp_optionsのテーブルからhomeのoption_valueを書き換える。
次に、上記と同じ理由で、wp_blogsテーブルからメインブログのpathを書き換える。
PHP側の設定
上記の2項目を書き換えたことにより、Wordpress内部ではサイトルートからサイト構造を見て現在開かれている場所がサイトルート/wp-admin/networkと勘違いする。
そのためURLの実体としてはblog/wp-admin/networkのはずなのに本来の設置場所であるサブディレクトリのnetworkディレクトリ…つまりblog/wp-admin/networkへリダイレクトしようとする。(これこそがnetworkディレクトリでリダイレクトループが発生した要因。)
それを防止するため、wp-admin/network/のディレクトリの中のadmin.phpを開いて以下の部分を削除する。
<?php /** * WordPress Network Administration Bootstrap * * @package WordPress * @subpackage Multisite * @since 3.1.0 */ define( 'WP_NETWORK_ADMIN’, true ); /** Load WordPress Administration Bootstrap */ require_once( dirname( dirname( __FILE__ ) ) . '/admin.php’ ); if ( ! is_multisite() ) wp_die( __( 'Multisite support is not enabled.’ ) ); $redirect_network_admin_request = 0 !== strcasecmp( $current_blog->domain, $current_site->domain ) || 0 !== strcasecmp( $current_blog->path, $current_site->path ); /** * Filter whether to redirect the request to the Network Admin. * * @since 3.2.0 * * @param bool $redirect_network_admin_request Whether the request should be redirected. */ $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 );
しかしこの答えに至るまで、調べること試行錯誤すること実装すること3時間・・・。 まぁ時間はかかりましたが、これでなんとかうまいことハマってくれてよかった・・・。