WordPress のテーマやプラグインを作っていると、サイトの URL を取得したい場面がよくあります。ところが home_url() と site_url() という似た関数があり、どちらを使えばよいか迷いがちです。この記事では、2つの関数の違いと正しい使い分け、URL をハードコーディングしてはいけない理由を、初心者の方にも分かるように解説します。
目次
なぜ URL を直接書いてはいけないのか
テンプレートにリンクを書くとき、https://example.com/about のように URL を直接書いてしまうと、後で困ることになります。サイトを http から https に変えたとき、独自ドメインに移したとき、ローカル環境で開発するときなど、環境が変わるたびにすべての URL を書き直すはめになるからです。
そこで WordPress では、設定に登録された URL を動的に取得する関数を使います。これにより、ドメインが変わっても設定を1か所直すだけで、サイト全体のリンクが正しく追従します。その代表が home_url() と site_url() です。
home_url() と site_url() の違い
2つの関数は、それぞれ参照する設定が異なります。違いは「サイトの表側の住所」か「WordPress 本体の置き場所」かという点にあります。
| 関数 | 返す URL |
|---|---|
home_url() | サイトのトップページ(訪問者が見るアドレス)の URL |
site_url() | WordPress 本体(管理画面やコアファイル)が置かれている URL |
これらは管理画面の「設定 > 一般」にある2つの項目に対応しています。「サイトアドレス(URL)」が home_url()、「WordPress アドレス(URL)」が site_url() です。多くのサイトでは両方が同じ値なので違いに気づきませんが、本体を別のサブディレクトリに置く構成にすると差が出ます。
たとえば WordPress を /wp ディレクトリに置き、サイト自体はルートで見せる構成では、次のように返る値が変わります。
| 関数 | 返り値の例 |
|---|---|
home_url() | https://example.com |
site_url() | https://example.com/wp |
このことから、訪問者向けのページやリンクには home_url()、WordPress のシステム的な URL には site_url() を使う、という基本方針が見えてきます。
基本の使い方
引数なしで呼ぶとトップ(またはコア)の URL がそのまま返ります。第1引数にパスを渡すと、その URL の末尾にパスを連結してくれます。
<?php
// サイトのトップページ
echo home_url(); // https://example.com
// 第1引数にパスを渡すと連結される
echo home_url( '/contact' ); // https://example.com/contact
// 先頭のスラッシュはあってもなくても同じ結果になる
echo home_url( 'about' ); // https://example.com/about
テンプレート内でリンクを作るときは、この戻り値を esc_url() で囲んで出力するのが安全です。URL として正しくない文字を取り除き、安心して href に入れられます。
<?php // サイトのロゴからトップへ戻るリンク ?>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>">
トップへ戻る
</a>
echo する版・取得だけする版
home_url() と site_url() は URL を返す関数です。これに対して、その場で URL を出力(echo)する the_home_url() のような関数は用意されておらず、出力したいときは自分で echo します。WordPress には用途が近い関数がいくつかあるので、混同しないよう整理しておきましょう。
| 関数 | 役割 |
|---|---|
home_url() | サイトの表側 URL を取得する(戻り値で返す) |
site_url() | WordPress 本体の URL を取得する(戻り値で返す) |
get_bloginfo( 'url' ) | home_url() とほぼ同じ表側 URL を返す(古くからある関数) |
admin_url() | 管理画面(wp-admin)の URL を取得する |
新しく書くコードでは、表側の URL は home_url() に統一しておくと分かりやすく、引数でパスを足せる点でも扱いやすくなります。
URL が意図と違うときに確認すること
http と https が混ざってしまう
返ってくる URL のプロトコルは、基本的に「設定 > 一般」に登録されたアドレスに従います。https 化したのに http の URL が返るときは、まず一般設定のアドレスが https になっているかを確認しましょう。状況に応じてプロトコルを指定したい場合は、第2引数に 'https' や 'relative' といったスキームを渡すこともできます。
パスの連結でスラッシュが重なる・抜ける
home_url( '/about' ) のように先頭にスラッシュを付けても、WordPress が重複を調整するため example.com//about のようにはなりません。逆に自分で文字列結合(home_url() . 'about')するとスラッシュが抜けることがあるので、パスは関数の引数として渡すのが安全です。
本来 home_url() を使うべき所で site_url() を使っている
両者が同じ値の環境では問題が表面化しませんが、WordPress 本体を別ディレクトリに置く構成に移したとたん、訪問者向けのリンクに /wp が混入する、といった不具合が起きます。リンクやパーマリンクなど「訪問者が見る URL」には home_url() を使う、と意識しておくと移行時のトラブルを防げます。
まとめ
home_url() と site_url() は、どちらもサイトの URL を動的に取得する関数ですが、参照する設定が異なります。要点を振り返っておきましょう。
- URL を直接書かず、関数で取得すれば環境が変わっても追従できる
home_url()はサイトの表側(訪問者が見る)URLsite_url()は WordPress 本体が置かれている URL- パスは引数で渡し、出力時は
esc_url()で囲む
「訪問者向けは home_url()、システム向けは site_url()」という基準で使い分ければ、サイト移行やドメイン変更にも強いテーマを作れます。リンクを書くときの基本としてぜひ覚えておいてください。