WordPress に複数ドメインを設定する方法(マルチサイト不要!)

最終更新:2018-12-05 by Joe

マルチサイト機能を利用せずとも、WordPress では、複数ドメインでの運用を実現できます。簡単なのに意外と知られていないようです。

WordPress 複数ドメインの運用。マルチサイト以外の方法。

「WordPress 複数ドメイン」と検索すると、やたらとマルチサイトを進める記事がたくさんでてきますが、マルチサイトって それなりに重厚な作りなので、結構めんどくさいのです。また、そもそもマルチドメインは「複数のWordPressサイトを運用する」には適しているのですが、「同一のサイトに複数ドメインを割り当てる」といった目的に利用するものではありません。

こちらの記事では、マルチサイト以外の方法で、複数ドメインを同一のWordPressサイトに割り当てる方法をご紹介します。

1ドメインの向き先を、該当サーバに向ける

当たり前ですが、ドメインの向き先を、該当サーバーに向けて下さい。ネームサーバー上の該当ゾーン設定でのAレコードを書きかえる、ということですね。

2ドメインのアクセス先を、WordPressルートに向ける

使用したい複数のドメインのすべてを、同じWordPressルートに向けて下さい。これも当然といえば当然ですね。

WordPressルートと書きましたが、サブディレクトリにWordPressを配置していて、かつWordPressもサブディレクトリパス有でアクセスしている場合は、この限りではありません。

3wp-config.php の編集

さて、ここからが本番です。

該当のWordPressルートにある、wp-config.php に下記の記載を加えます。

/**
  * Flexible site URL
  *
  */
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";

define('WP_HOME', $protocol . $_SERVER['HTTP_HOST']  );
define('WP_SITEURL', WP_HOME );

これらの定数は、optionsテーブル内の「siteurl」と「home」の値を、WordPress のロード時に、動的に置き換えてるための定数です。これにより、DBの値を書き換えることなく、振る舞いを変えられるというわけです。

$protocol で、https, http の切り替えも吸収しています。サーバーの環境によっては、環境変数がうまく動作しないケースもあるかもしれません。その場合、不要であれば、「https://」などとハードコードと置き換えてしても構いません。

もしあなたの環境で、サブディレクトリにワードプレスを展開しているのであれば、WP_SITEURL の値は ’http://’ . $_SERVER[‘HTTP_HOST’] . ‘/dir-name’ となるはずです。(最後のスラッシュは不要です。)

そのほか、現在の WordPress 環境に応じて適切にカスタマイズして下しさい。

options テーブルの、サイトURLに関する値を、強制的に「現在のURL」書き換えればいいって事なんだ!

補足

まず、options 内のsiteurl home_url の値について知っておく必要があります。それぞれ、下記の意味です。

  • siteurl: WordPressコアコードのルートにあくせするためのURL。
  • home_url: フロント側のルートのURL

これらの値は、関数 home_url(), get_style_shceet_directory_uri() などに使われます。サイトのURLを司るすべての関数はこれらのDB値を利用しますので、関数を通してURLを取得する限り、この手法で得られるURLが「いまアクセスしているドメイン」となるのです。

これはつまり、次の(2)のステップが必要な理由です。

4テーマ内の、アンカーテキストをすべて、WordPressの関数経由で取得するようにする

行儀よく実装されたテーマであれば、すでにフロントに出力するURLすべて 例:home_url( ‘about’ ) などと関数経由で取得しているはずです。逆に、そうでない場合、複数ドメインの設定に問題が生じます。ハードコードで書かれたURLを書き換える事ができるのは、現実的には、クライアント側の実装だけとなってしまいます。(込み入ったハックは無しで)

いくつか紹介します:

  • home_url()
  • admin_url()
  • get_template_directory()
  • get_template_directory_uri()
  • get_stylesheet_directory()
  • get_stylesheet_directory_uri()
  • get_stylesheet_uri()
  • get_theme_root()
  • get_theme_root_uri()
  • get_the_post_thumbnail_url()

などなど、この手の関数は、link-template.php に実装が見つかりますので、興味のあるかたは、ご一読ください

おすすめしませんが、関数の書き換えが面倒なかなたは、Javascript で、ページ内のコードで、URLを見つけ出して、無理やり書き換える荒業もありますが、あすすめしませんので、この記事ではサポート外です・・。

5投稿データ(データベース)内のハードコードされた絶対リンクを、相対リンクに、変更する

最後に、これが少し厄介なのですが、WordPressの投稿エディタは、「サイト内リンク」「画像」を挿入するときに、絶対URLを利用して書き込んでしまいます。すなわち、上記の1,2のステップによって、動的にサイトURLを書き換えたとしても、投稿内に書き込まれた静的なURLはそのままということです。

画像は、ブラウザが画像をロードするだけなので、その画像がどのドメインからロードされたのかは、閲覧ユーザは気が付かないため、さほど問題にならないかもしれません。

ただ、リンクはそうは行きません。

DBを置換する必要があります。複数ドメインで動作するリンクは「相対リンク」しかありません。

置換前:

  • 詳しくは、<a href=”http://example.com/about-us”>こちら</a>

置換後:

  • 詳しくは、<a href=”/about-us”>こちら</a>

この相対パスの利用は、サブディレクトリをつかったWordPressアドレス(例:http://exmaple.com/wp/ がサイトルートのとき)と、そうでないURLとの複数運用では、共存できませんので、この場合は、問題が複雑になります。

.htaccess で解決できる場合もありそうですが、話が長くなるので、そのケースはこの記事の対象外とします。すみません。

【補足】ドメインごとに、使用するテーマを切り替える

念の為補足ですが、ドメインによってテーマを切り替えることができます。データベースは一緒ですが、テーマだけ着替えることができるのです。これによって、例えば、ステージング環境に開発中のテーマを適応するなどの用途に利用できます(あくまで、DBは共通)。

ポイントとしては、テーマのロードが発生する前に、テーマの切り替えコードを実行する必要がある という点です。ですので、使用しているテーマの中にテーマの切り替えコードを書いても、すでに使用するテーマが確定しているので意味がありません。テーマのロードが発生する前に任意のコードを実行できるのは、以下のタイミングです。

  1. wp-config.php 内に書き込む
  2. テーマ切り替え用のプラグインを作成し、プラグインを有効化する

2のほうが汎用的ですが、プラグインを有効化するステップがちょっと面倒?な場合は、複数ドメインが、テスト目的や一時的な利用であれば、1で済ませてしまっていいでしょう。

テーマに関連するパスは、下記のフィルターによって上書きができます。各関数で「テーマのディレクトリ名」を返すように実装して下さい。

add_filter( 'template', 'w3c_change_theme_poth' );
add_filter( 'option_template', 'w3c_change_theme_poth' );
add_filter( 'option_stylesheet', 'w3c_change_theme_poth' );

// テーマディレクトリ名を上書きする
function w3c_change_theme_poth() {

  if ( $_SERVER['HTTP_HOST'] === 'www.site-1.com' ) {
    return 'theme-1';
  } else {
    return 'theme-2';
  }

}

【補足】ドメインによって、プラグインやアップロードディレクトリを切り替えたいとき

どんどん複雑になってきますね。このようなことも、やりたいケースもあるかもしませんが、ニッチでしょう。ただ、こちらに、テーマ、プラグインディレクトリのの関数情報がありますので、参考になると思います。

これらの関数も上記のテーマの例同様にフィルターが用意されているので、きっと上書きできることでしょう。

ドメイン問題に限らず、WordPress環境のカスタマイズには、便利そうな定数だね!

【補足】URLの正規化(SEOの話)をしよう

これも補足ですが、もし複数のURLで、完全に同じWebサイトをインターネット上に公開しているのであれば「いったいどちらのURLがメインなの?」という疑問が、ユーザには生じます。

この疑問は、検索エンジンも同じです。

検索結果にどちらのURLが表示されればいいのでしょうか?Googleは、同一のサイトである(と判断した場合)片方の結果を検索結果から排除します。(重複サイトと呼ばれます)

もしどちらかを優先して使ってほしい場合、そのシグナルを検索エンジンに送ることが必要です。2つの方法を紹介します。

1301リダイレクトで統一するURLに転送

これには通常「.htaccess による、301リダイレクト」を行います。

HTTPプロトコルレベルで、リダイレクトをブラウザに通知してくれますので、Googleもどちらが最終的な(利用すべき)サイトドメインなのかを、これによって判断するようになっています。

ユーザも自動的にメインのドメインに転送される(ユーザは気づかないうちに転送されている)ますので、みんなハッピーになります。

htaccess  の書き方は、こちらの記事に詳しくまとめています。たぶん他のどこよりも詳しいと思います。

もしくはPHPレベルでリダイレクトしても構いませんが、ちょっと重くなります。wp-config.php に記載すれば動作します。テーマファイルだと実行タイミングが遅すぎるかもしれません。

2<link rel=”canonical”> タグによる正規化

別の方法では、ref=”canonical” というタグをHEAD内にしてすれば、URL正規化のシグナルとなります。

<link rel="canonical" href="http://example.com">

こちらの方法であれば、リダイレクトは不要なので、複数ドメインでのアクセス可能に保ったまま、検索結果に表示されるURLをコントロールすることができます。

参考

マルチサイトにも利点はもちろんありますが、(繰り返しとなりますが)「複数ドメインのためだけに」利用するものではないです。マルチサイトは「複数のサイトを、同じWordPressコアコードで」運用するためのものですよね。

さて、今回のHOME、SITEURL 定数を利用した、サイトURLの書き換えには、公式ドキュメントにも言及があります。

以上となります。