WordPress3.1をマルチサイト化させて、Admin SSLを使用する際の注意点。
WordPress3.1でAdmin SSLを利用する場合、関数名の競合は先のWordPress3.1でAdmin SSLを使うで対応方法を書きましたが、マルチサイトで利用する場合、更に修正が必要となります。
不具合の原因
WordPress3.1のマルチサイトでは、ネットワークの管理画面が、/wp-admin/network/ とディレクトリを挟むURLに変更されています。
一方、Admin SSLは、管理画面のリンク先を相対パスから絶対パスに書き換える処理を行っているのですが、この書き換えが wp-admin 直下しか想定していないために、ディレクトリを挟んだ場合にリンク先の階層がずれてしまい、遷移がおかしくなってしまうのです。
原因となってるソースコードは、Admin SSLの includes/https.php 内 as_ob_handler関数、290行目からの部分。
オリジナル
if(is_admin()) { $pattern = "/href=['\"]((?<!http)[\w-]*\.php.*)['\"]/U"; $replacement = "href=\"$siteurl"."wp-admin/\$1\""; $buffer = preg_replace($pattern,$replacement,$buffer); }
この $replacement を生成している部分に、現在アクセスしているURLにwp-admin 以下にディレクトリがあれば付け加える処理を追加して、3.1へ対応させます。
修正コード
if(is_admin()) { $pattern = "/href=['\"]((?<!http)[\w-]*\.php.*)['\"]/U"; $parse_url = parse_url( $_SERVER['REQUEST_URI'] ); $regex = '/^.*\/wp-admin\/(.*)$/'; if ( preg_match( '|\.php$|', $parse_url['path'] ) ) { $num = preg_match( $regex, dirname( $parse_url['path'] ), $m ); } else { $num = preg_match( $regex, rtrim( $parse_url['path'], '/' ) , $m ); } $current_dir = $num ? $m[1] . '/' : ''; $replacement = "href=\"$siteurl"."wp-admin/".$current_dir."\$1\""; $buffer = preg_replace($pattern,$replacement,$buffer); }