【WordPress】トップページのURLを正確に取得する方法|home_urlとsite_urlの違い・末尾スラッシュ

テーマやプラグインの開発では、トップページ(ホーム)のURLを取得する場面が頻繁にあります。WordPressには取得関数が複数あり、特に home_url()site_url() は指すURLが違うため、区別を知らないとサブディレクトリ設置のサイトで壊れます。この記事では、正確な使い分けと末尾スラッシュの扱いを解説します。

この記事でわかること

  • home_url()site_url() の違い(サブディレクトリ設置で異なる)
  • 末尾スラッシュ付きで取る定番の書き方 home_url('/')
  • get_home_url()get_option('home') との使い分け
  • trailingslashit() / untrailingslashit()esc_url()
スポンサーリンク

まず区別する:home_url() と site_url()

「トップページのURL」を正確に取るには、2つの関数の違いを知る必要があります。

関数 返すURL 対応する設定
home_url() サイトを表示するトップページのURL 設定 → 一般「サイトアドレス (URL)」
site_url() WordPressをインストールした場所のURL 設定 → 一般「WordPress アドレス (URL)」
サブディレクトリ設置では別のURLになる
多くのサイトでは両者は同じですが、WordPress本体を /wp/ などのサブディレクトリに置いている場合、home_url()https://example.comsite_url()https://example.com/wp を返します。トップページへのリンクには必ず home_url() を使ってください。

home_url() の基本と末尾スラッシュ付きの定番形

home_url() をそのまま呼ぶと、末尾スラッシュ無しのURLが返ります。第1引数にパスを渡せるため、末尾スラッシュ付きは home_url('/') と書くのが定番です。

PHP:home_url の基本
echo home_url();     // https://example.com (末尾スラッシュなし)
echo home_url('/');  // https://example.com/ (定番:スラッシュ付き)

// パスを渡してサイト内URLを組み立てることもできる
echo home_url('/contact/'); // https://example.com/contact/

既にあるURL文字列にスラッシュを足す:trailingslashit()

変数に入っているURLなど、既存の文字列の末尾スラッシュを保証したいときは trailingslashit() を使います。スラッシュが無ければ追加し、既にあれば二重にはなりません。逆に取り除く関数は untrailingslashit() です。

PHP:trailingslashit / untrailingslashit
$url = 'https://example.com/blog';

echo trailingslashit($url);   // https://example.com/blog/
echo untrailingslashit($url . '/'); // https://example.com/blog

get_home_url() と get_option(‘home’) の使いどころ

get_home_url()home_url() の下位関数で、マルチサイトのブログIDスキーム(http/https)を指定できます。

PHP:get_home_url の引数を使う
// マルチサイトでブログID=2 のサイトのトップURLを取得
echo get_home_url(2, '/');

// スキームを強制したい場合(第3引数)
echo get_home_url(null, '/', 'https');
get_option(‘home’) は「生の値」
get_option('home') はデータベースの設定値をそのまま返します。home_url() が適用するフィルター(多言語プラグイン等の変換)やスキーム調整が効きません。通常のテーマ・プラグイン開発では home_url() を使い、get_option('home') は設定値そのものが必要な特殊な場面に限定しましょう。

出力時は esc_url() でエスケープする

URLをHTMLに出力するときは、esc_url() でエスケープするのが安全です。取得と出力をセットで覚えましょう。

PHP:安全な出力(取得+エスケープ)
<a href="<?php echo esc_url(home_url('/')); ?>">トップページへ</a>

現在表示中のページのURL取得は現在のURLを取得して処理を切り替える方法、投稿・固定ページのURLは投稿のパーマリンクを取得する方法を参照してください。

よくある質問(FAQ)

Qhome_url() と site_url() はどちらを使うべきですか?
Aトップページへのリンクなら home_url() です。site_url() はWordPress本体のインストール先URLで、サブディレクトリ設置(例:本体を /wp/ に配置)では両者が異なります。site_url()wp-login.php などコアファイルへのURL組み立てに使います。
Q末尾スラッシュ付きでトップURLを取る一番簡単な書き方は?
Ahome_url('/') です。既存のURL文字列に付けたい場合は trailingslashit($url) を使います(既にあれば二重になりません)。出力時は echo esc_url(home_url('/')); のようにエスケープしましょう。
Qサイト全体で末尾スラッシュの有無を統一するには?
AWordPressはパーマリンク設定に応じて自動で正規化(301リダイレクト)しますが、SEO上は内部リンクの書き方も統一しておくのが安全です。テンプレート内のリンクを home_url('/') ベースで組み立てれば揺れを防げます。トップページだけの表示制御はトップページにのみ表示する方法も参考になります。

まとめ

  • トップページのURLhome_url()site_url() はインストール先で別物)
  • スラッシュ付きの定番home_url('/')。既存文字列には trailingslashit()
  • マルチサイト・スキーム指定get_home_url($blog_id, $path, $scheme)
  • get_option('home') は生値:フィルターが効かないため通常は home_url()
  • 出力echo esc_url(home_url('/')); をセットで

home_url('/')esc_url() の形を基本にすれば、設置構成が変わっても壊れないURL出力ができます。