1. ホーム
  2. WordPress

【WordPress】home_url と site_url の違いと使い方|URLを正しく取得する

Share

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 の末尾にパスを連結してくれます。

index.php
<?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 に入れられます。

header.php
<?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() はサイトの表側(訪問者が見る)URL
  • site_url() は WordPress 本体が置かれている URL
  • パスは引数で渡し、出力時は esc_url() で囲む

「訪問者向けは home_url()、システム向けは site_url()」という基準で使い分ければ、サイト移行やドメイン変更にも強いテーマを作れます。リンクを書くときの基本としてぜひ覚えておいてください。

参考ページ