LoginSignup
0
0

More than 3 years have passed since last update.

Wordpress で複数ドメインで同一コンテンツを提供したい場合のメモ

Last updated at Posted at 2020-05-18

マルチサイト構成で 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);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0