マルチサイト構成で example.com でも example.eu でも example.co.jp でも同じコンテンツを提供したい場合には別ドメインでアクセスしてもサイトが見つからなかったり、プライマリドメインへのリダイレクトが発生してしまったりします。
異なるドメインでアクセスした場合にサイトがみつからない元凶は get_site_by_path()
、リダイレクトが発生する問題は redirect_canonical()
です。
pre_get_site_by_path
フィルタはプラグイン読み込み前の処理なため wp-config.php で define('SUNRISE', true);
を指定することにより wp-content/sunrise.php の読み込みをさせるようにします。
以下の方法で複数ドメインのリダイレクト問題に対応できます。
wp-config.php
// 現在のサイトのホスト名はサーバから貰えるものにする
// (これをしないと ms-settings.php でリダイレクトが発生する)
define('DOMAIN_CURRENT_SITE', $_SERVER['HTTP_HOST']);
// wp-content/sunrise.php を読ませる
define('SUNRISE', TRUE);
wp-content/sunrise.php
// wp-includes/ms-load.php:214
function my_pre_get_site_by_path($pre, $domain, $path, $segments, $paths) {
$args = array(
'number' => 1,
'update_site_meta_cache' => false,
);
// 元ソースからドメインでのフィルタ部分を削除してパスだけでサイトを検索する
if ( count( $paths ) > 1 ) {
$args['path__in'] = $paths;
$args['orderby']['path_length'] = 'DESC';
} else {
$args['path'] = array_shift( $paths );
}
$result = get_sites( $args );
$site = array_shift( $result );
if ( $site ) {
return $site;
}
return $pre;
}
add_filter('pre_get_site_by_path', 'my_pre_get_site_by_path', 10, 5);
// wp-includes/canonical.php:605
function my_redirect_canonical($redirect_url, $requested_url) {
// redirect_url のホスト名が home_url() 基準に変更されてしまうため
// 元URL を プライマリドメイン基準に変更して差が無ければリダイレクト中止
$_sanitized = str_replace($_SERVER['HTTP_HOST'], 'www.example.com', $requested_url);
if ($_sanitized == $redirect_url) {
return NULL;
}
return $redirect_url;
}
add_filter('redirect_canonical', 'my_redirect_canonical', 10, 2);
- 管理画面に入るとプライマリドメインに転送される。
- Force Login プラグインを使っていると管理画面を経由するのでプライマリドメインになる。
- キャッシュの影響を受けるため、変更後はしばらく待つか、
wp_cache_flush()
をすること。
追記:
redirect_canonical
にフックする代わりに option_home
にフックしたほうが良いかもしれない。
wp-content/sunrise.php
function my_option_home($value, $option) {
$value = str_replace('www.example.com', $_SERVER['HTTP_HOST'], $value);
return $value;
}
add_filter('option_home', 'my_option_home', 10, 2);