WordPress: site_url()とhome_url()の違い

WordPressのsite_url()とhome_url()という関数は、共にサイトのTOPURLを取得します。
同じ機能のような気がしますが、何が違うのでしょうか。

ソースファイルを見てみる

WordPressのソースファイルを見ると、site_url()関数とhome_url()関数は /wp-includes/link-template.phpで定義されています。
ちょっと覗いてみます。

site_url()

site_url()関数は次のようにコメントされています。

Retrieves the URL for the current site where WordPress application files

Google翻訳さんに翻訳してもらうと、次のような結果になります。

WordPressアプリケーションがファイルする現在のサイトのURLを取得します

よくわかりません(汗

home_url()

home_url()関数は次のようにコメントされています。

Retrieves the URL for the current site where the front end is accessible.

Google翻訳さんに翻訳してもらうと、次のような結果になります。

フロントエンドにアクセスできる現在のサイトのURLを取得します。

言いたいことはわかるような気がしますが、site_url()との違いがわからない・・・

一般設定で設定した値だった

実はこの二つの関数は、一般設定の「WordPress アドレス (URL)」と「サイトアドレス (URL)」で設定した値を取得する関数でした。

一般設定 WordPress アドレス (URL) サイトアドレス (URL)

関数 取得する値 目的
site_url() WordPress アドレス (URL) ファイルのURLとして使用
home_url() サイトアドレス (URL) WebページのURLとして使用

意味的はサイトアドレスとsite_url()がペアなような気がしますが・・・
まぎらわしいですね。

「WordPress アドレス (URL)」は、WordPressの本体が格納されているアドレスです。
管理画面でphpファイルを呼び出すときのリンク先や、linkタグのcssファイルの参照先の生成時などに使用されます。

「サイトアドレス (URL)」は、文字通りサイトのアドレスです。
Webページのリンク先など、WordPressがWebページへのURLを生成するときなどに使用されます。

ちなみにこの二つの値は、データベースのwp_optionsテーブルに格納されています。

phpmyadminで確認

一般設定で適当にアドレスを変更すると、管理画面やWebページを開けなくなることが多いです。
もしやってしまって管理画面に入れなくなってしまったら、wp_optionsテーブルを編集して修復しましょう。

データベースを編集できないときは、wp-config.phpに次のコードを記述します。

  • define( 'WP_SITEURL', '正しいURL' );
  • define( 'WP_HOME', '正しいURL' );
AFFS Simple Code Viewer
Copy

データベースよりもこちらの定数が優先されるので、管理画面にアクセス可能となります。

ただし、この方法でURLを指定した場合、一般設定で変更できなくなります。
特殊な運用をしていなければ、変更できなくても問題ないですけどね・・・

site_url()とhome_url()の使い分け

二つの関数の使い分けについて考えてみます。

site_url()は、WordPressディレクトリ内に設置されている画像やcssなどのファイルのURLを取得したいときに使用します。

例えば imgタグのsrc属性で、/wp-content/uploads/image.png というファイルを指定したいときは、次のようになります。

  • <img src="<?php echo site_url(); ?>/wp-content/uploads/image.png" alt="イメージ画像">
AFFS Simple Code Viewer
Copy

home_url()は、単純にTOPのURLを知りたいときに使用します。

使う頻度は、site_url()の方が多そうですね。

使い分ける必要なあるのか?

一般設定の「WordPress アドレス (URL)」と「サイトアドレス (URL)」は、同じURLが指定されていることが多いです。
もし、アドレスを変更するとWordPressにアクセスできなくなります。
だから、変更できません。

こんな状況では、site_url()とhome_url()の結果がいつも同じですね。
使い分ける必要が無いような気がしますね。

通常はサイトアドレスにWordPressを設置

通常は、WordPressの本体プログラムはサイトアドレスに対応するディレクトリに保存されています。

通常の配置
/サイトディレクトリ
 ┣ /wp-content
 ┃  ┣ ・・・・
 ┃  ┗ ・・・・
 ┣ /wp-include
 ┃  ┣ ・・・・
 ┃  ┗ ・・・・
 ┣ /wp-login.php
 ┣ /wp-config.php
 ┣ /index.php
 ┗ ・・・・

この状態なら、site_url()とhome_url()の結果がいつも同じです。

サイトアドレスを変更するとエラーになる理由

WordPressにログインするとログイン画面が表示されます。
このときcssファイルの参照先は、「WordPress アドレス (URL)」を使用して決定されます。
決定されたURLが実際には存在しないものだった場合は読み込みに失敗し、その結果、画面表示が乱れます。

ログイン情報を入力してログインボタンを押すと再度wp-login.phpが呼び出されるのですが、呼び出し先はcssファイルと同じように「WordPress アドレス (URL)」が使用されています。
その結果存在しないphpファイルを呼び出したことになり、エラーが表示されます。

他のディレクトリにWordPressを設置

WordPressの知識が十分にあるなら、サイトアドレスに対応するディレクトリ以外にWordPressの本体を設置できます。

方法はWordPress側で解説しているので、気になる人は読んでみてください。

WordPress を専用ディレクトリに配置する

リンク先の方法2は、WordPress専用のディレクトリを作成して、そちらにWordPressを設置する方法です。
実行すると、次のようになっています(たぶん)

専用ディレクトリに配置
/サイトディレクトリ
 ┣ /index.php
 ┗ /wordpress
      ┣ /wp-content
      ┃   ┣ ・・・・
      ┃   ┗ ・・・・
      ┣ /wp-include
      ┃   ┣ ・・・・
      ┃   ┗ ・・・・
      ┣  /wp-login.php
      ┣  /wp-config.php
      ┣ ・・・・
      ┗ ・・・・

このとき、「サイトアドレス (URL)」は変更ありませんが、「WordPress アドレス (URL)」は wordpressディレクトリを指すように変更されています。
そのため、site_url()とhome_url()の結果が異なります。

個人的な使用を目的としてテーマやプラグインを作成するなら問題ありませんが、他者へ公開する予定があるならsite_url()とhome_url()を使い分ける必要がありますね。