パス(URL)を取得する場合、親テーマだから子テーマだからと場合分けするのは面倒で、パス取得で同じ関数がないかと探したら以下がそれ。
get_theme_file_uri()
関数リファレンス:get_theme_file_uri()(ワードプレス公式)
- 1)get_theme_file_uri() だけの場合
- 1-1)親テーマが有効な場合:親テーマのテーマフォルダーまでのパス(URL)を返す
- 1-2)子テーマが有効な場合:子テーマのテーマフォルダーまでのパス(URL)を返す
- 2)ファイル指定されている場合:get_theme_file_uri( 'ファイル' )
- 2-1)親テーマが有効な場合:
親テーマのファイルとして、ファイルまでのパス(URL)を返す - 2-2)子テーマが有効な場合:ファイルあり
子テーマでファイルが見つかれば、
子テーマのファイルまでのパス(URL)を返す - 2-3)子テーマが有効な場合:ファイルなし
子テーマでファイルが見つからない場合は、
親テーマのファイルとして、ファイルまでのパス(URL)を返す
- 2-1)親テーマが有効な場合:
※)ファイルが見つからなくてもエラーを返さない
具体例
例1)親テーマの場合:
テーマフォルダのすぐ下にある「test1.css」のパス取得
親テーマフォルダー:cocoon-master
├ images
├ css
├ plugins
├ index.php
├ functions.php
├ test1.css
├ ・・・・
get_theme_file_uri( 'test1.css' )
例2)子テーマの場合:
テーマフォルダ下の「test-css」内にある「test2.css」のパス取得
子テーマフォルダー:cocoon-child-master
├ skins
├ test-css
├ test2.css
├ editor-style.css
├ functions.php
├ ・・・・
get_theme_file_uri( '/test-css/test2.css' )
動作確認
以下のようにして、具体的な動作を見てみた。
・親テーマフォルダーに、functions.php と同じ階層に test1.css を置いた
・子テーマフォルダーに、functions.php と同じ階層に test2.css を置いた
※)テーマは Cocoon を使用
親テーマフォルダー:cocoon-master
├ images
├ css
├ plugins
├ index.php
├ functions.php
├ test1.css
├ ・・・・
子テーマフォルダー:cocoon-child-master
├ skins
├ tmp-users
├ editor-style.css
├ functions.php
├ test2.css
├ ・・・・
親テーマ、子テーマの各々のfunctions.phpに以下コードを書いて表示させてみる。
1) get_theme_file_uri();
2) get_theme_file_uri(‘test1.css‘);
3) get_theme_file_uri(‘test2.css‘);
4) get_theme_file_uri(‘zettainai.css’);
※)zettainai.css は存在しないファイル
【結果】
親テーマ | 子テーマ | 結果 |
有効化 | なし | functions.php(親テーマ) 1) http://example.com/wp-content/themes/cocoon-master 2) http://example.com/wp-content/themes/cocoon-master/test1.css 3) http://example.com/wp-content/themes/cocoon-master/test2.css 4) http://example.com/wp-content/themes/cocoon-master/zettainai.css |
有効化 | あり (無効) |
functions.php(親テーマ) 1) http://example.com/wp-content/themes/cocoon-master 2) http://example.com/wp-content/themes/cocoon-master/test1.css 3) http://example.com/wp-content/themes/cocoon-master/test2.css 4) http://example.com/wp-content/themes/cocoon-master/zettainai.css |
- | 有効化 | functions.php(子テーマ) 1) http://example.com/wp-content/themes/cocoon-child-master 2) http://example.com/wp-content/themes/cocoon-master/test1.css 3) http://example.com/wp-content/themes/cocoon-child-master/test2.css 4) http://example.com/wp-content/themes/cocoon-master/zettainai.css functions.php(親テーマ) 1) http://example.com/wp-content/themes/cocoon-child-master 2) http://example.com/wp-content/themes/cocoon-master/test1.css 3) http://example.com/wp-content/themes/cocoon-child-master/test2.css 4) http://example.com/wp-content/themes/cocoon-master/zettainai.css |
- 親テーマが有効な場合:
- 子テーマがインストールされててもされてなくても、親テーマのパスを返す
- 子テーマが有効な場合:
- get_theme_file_uri() は親テーマで使われても子テーマで使われても
子テーマのパスを返す - get_theme_file_uri( 'ファイル' ) とファイル指定すると、まず子テーマ内でファイルを探す。
見つかれば子テーマのパスで返し、
見つからなければ親テーマのパスで返す。
(親テーマ、子テーマ、どちらにも指定のファイルが存在しない場合は、親テーマのパスで返す)
- get_theme_file_uri() は親テーマで使われても子テーマで使われても
注意が必要そうなのは、
get_template_directory_uri() (親テーマノパスを取得)や get_stylesheet_directory_uri() (子テーマのパスを取得)を使ってファイルのパスを取得する時と同じような形でget_theme_file_uri().'ファイル名'としてパスを取得する場合。
関数リファレンス/get template directory uri
関数リファレンス/get stylesheet directory uri
get_theme_file_uri() は子テーマが有効化されている場合、必ず子テーマフォルダーまでのパスを返すので、親テーマ内で親テーマにしかないファイルを参照する場合、
get_template_directory_uri().'ファイル名' を使う必要がある、となるでしょうか。
というか、そうした使い方をせず、get_theme_file_uri( 'ファイル名' ) としておくのが分かりやすいし間違いなさそうです。