WordPress4.7の新関数get_theme_file_uriを、get_template_directory_uriの代わりに使おう!

WordPress4.7の新関数get_theme_file_uriを、get_template_directory_uriの代わりに使おう!

2016年12月20日

この記事はWordPress Advent Calendar 2016の20日目として書いています。
19日目のdenari01さんからのリレーです。

2016年12月7日、WordPress4.7 リリース

コアコミッターの皆さん、翻訳チームの皆さんいつもありがとうございます。

さて、WordPress4.7の新機能といえば、なんといっても長らく「やるやる詐欺」とも言われていた(?)WP REST API のコアへの実装でしょうか。

しかし、クライアントワークでひたすらブログやコーポレートサイトを作り続けている我ら下層ウェブ制作者にとっては、新関数get_theme_file_uriの登場こそ、待望されていたのではないでしょうか!

get_theme_file_uriについては、Make WordPress Coreのこのスレッドにて紹介されています。

wp_enqueue_script( 'my-script', get_theme_file_uri( 'js/my-script.js' ) );
The above code enqueues the URL of the js/my-script.js file from the child theme if it exists, falling back to the URL of the file in the parent theme. Now your parent theme can enable each of its enqueued assets to easily be overridden by a child theme. And of course, if no child theme is in use then the function simply uses the parent theme URL, just like get_template_part().

この部分に、胸踊りました。
上記(例)のコードでは、js/my-script.jsファイルがまず子テーマに存在するかどうかチェックし、なければ親テーマの同名ファイルを探しにいってくれるというのです!

こんなウェブ屋さんに使ってほしいget_theme_file_uri

WordPressでクライアントワークを長らくやっている人なら、こういうようなサイトの作り方をしたことがあるんじゃないでしょうか?

  • コーポレートサイトを制作後、スタッフブログを増やすことになって、マルチサイトを切って子テーマでブログ用のテーマを作成
  • PCサイトを制作後、スマートフォン対応をすることになって、子テーマでスマートフォンビューを作成して振り分け

こういう場合って、デザインはほぼ親テーマのベース流用でOKだけど、細かい部分で調整が加わるからまったくそのままは使えない、ということが多いです。

WordPressの子テーマの場合、これまでテンプレートファイルはオーバーライド機能が備わっていましたが、それ以外のパーツについてはオーバーライドされませんでした。
つまり、index.phpやheader.phpなどのPHPファイルについては、親テーマと変えたい部分のファイルのみ同名で用意しておけば、子テーマ側に存在するファイルはそっちが読み込まれ、ないものは親テーマのものが使われていました。
しかし、画像やCSS, JavaScriptなどのパーツファイルはそうはいきませんでした。

テーマ内でパーツのuriを出力するにはget_template_directory_uriを使うと思うんですが、これを子テーマ側で使った場合、親テーマのパスを返されて「おい!」と思ったことのある方も一定数いらっしゃることでしょう。
今でもこの記事にそこそこアクセスがあるので、みんな一度は通る道のようです。

上記事の【2012.02.04追記】にも書いたように、子テーマ内のファイルを参照するには get_stylesheet_directory_uriを使うことになります。
事前に、パーツごとに親テーマのものを参照するか子テーマ側で新たに用意するか検討して、コード側でget_template_directory_uriを使うのか、get_stylesheet_directory_uriを使うのか選択する必要がありました。

これの設計が結構めんどくさい!

ところが、get_theme_file_uriを使えばもう悩まなくてよいのです。
悩むことなくget_theme_file_uriを使っておけば、後からオーバーライドしたいパーツが変わっても大丈夫。
子テーマに入れるか、入れないかだけで勝手に対応してくれる。
いやぁ、楽になります。

ただ、ひとつだけいいたい。

「ちょっと遅いよ!」

レスポンシブが主流になるまえのあの頃にこの関数があればよかった。。。

get_template_directory_uriも現状非推奨になったわけじゃないので、そのまま使っていても問題ありません。
運用中のサイトで慌てて書き換える必要は今のところありませんが、新しくテーマを作る際はget_theme_file_uriを使うのが良いと思います。子テーマ関係なくてもget_template_directory_uriの代わりに使えます。

※子テーマでも明示的に親テーマのパスを出したいときに使えるget_parent_theme_file_uriというのも増えました。
詳しくは前述のリンク先をご確認ください!

明日は、昨年も12/21をゲットされたねこみみ隊長(@nekomimiTaicho)です。
(なぜ21日なのかは昨年の記事を読んで納得しました)
お楽しみに!