マルチサイト機能を利用せずとも、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 内の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は共通)。
ポイントとしては、テーマのロードが発生する前に、テーマの切り替えコードを実行する必要がある という点です。ですので、使用しているテーマの中にテーマの切り替えコードを書いても、すでに使用するテーマが確定しているので意味がありません。テーマのロードが発生する前に任意のコードを実行できるのは、以下のタイミングです。
- wp-config.php 内に書き込む
- テーマ切り替え用のプラグインを作成し、プラグインを有効化する
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の書き換えには、公式ドキュメントにも言及があります。
以上となります。
options テーブルの、サイトURLに関する値を、強制的に「現在のURL」書き換えればいいって事なんだ!