テーマやプラグインの開発では、トップページ(ホーム)の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本体を
多くのサイトでは両者は同じですが、WordPress本体を
/wp/ などのサブディレクトリに置いている場合、home_url() は https://example.com、site_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を取る一番簡単な書き方は?
A
home_url('/') です。既存のURL文字列に付けたい場合は trailingslashit($url) を使います(既にあれば二重になりません)。出力時は echo esc_url(home_url('/')); のようにエスケープしましょう。Qサイト全体で末尾スラッシュの有無を統一するには?
AWordPressはパーマリンク設定に応じて自動で正規化(301リダイレクト)しますが、SEO上は内部リンクの書き方も統一しておくのが安全です。テンプレート内のリンクを
home_url('/') ベースで組み立てれば揺れを防げます。トップページだけの表示制御はトップページにのみ表示する方法も参考になります。まとめ
- トップページのURL:
home_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出力ができます。

