子テーマの作り方 functions.phpのカスタマイズ方法

Image

先日、「WordPress-子テーマの作り方」という記事を書きました。そこではstyle.cssのことだけ触れていましたが、今回はfunctions.phpを使ってカスタマイズする方法について書きたいと思います。

functions.phpは子テーマで同じ関数を定義すると必ず二重定義エラーになると思っていた

子テーマで色々カスタマイズをしてきて、home.phpやsingle.phpその他に手を入れたいときは親テーマからそれらのファイルを子テーマにコピーしてきてそのファイルを修正するという方法でうまくいっていました。同じ方法を functions.php で行うと二重定義エラーがでてしまい上手く行きませんでした。検索するとfunctions.phpは追記されるので同じ関数を指定してはだめということでした。

カスタマイズについての記事を書こうと思って確認のため、codexを調べていたら、

子テーマ functions.phpの使用方法に、

style.css と違い、functions.php は同名ファイルでオーバーライドできません。その代わり、親の functions.php に追加して読み込まれます。正確にいうと、親テーマの functions.php の直前に読み込まれます。したがって、もし親テーマの functions.php で favicon_link() という関数があるとき、子テーマのfunctions.php で同名の関数があれば、子テーマの関数が使用されます。

という記述を発見して あれ?子テーマに同じ名前の関数を書いたらそちらが実行されるのか?私勘違いしていたのかな~でもエラーになったような…テーマによって違うのだろうか、といろいろ思いました。

twentyfourteenのfunctions.phpで多重定義について確認してみる

今子テーマの親テーマとしているのはtwentyfourteenです。functions.phpを見てみました。

という関数の前で、

というif文を書いてあり、twentyfourteen_setupという関数が既に定義されていれば展開しないようになっています。これがcodexに書いてあった

親テーマの functions.php で favicon_link() という関数があるとき、子テーマのfunctions.php で同名の関数があれば、子テーマの関数が使用されます。

を実現させる仕組みだと思います。ですので、子テーマのfunctions.phpに

と書いて実行すれば

Image

このように子テーマの方の twentyfourteen_setup が呼び出されて、二重定義エラーも出ていないことが分かります。

それでは function_exists がfunctionの前に書いてない、functionを子テーマで定義してみます。

これで実行をすると以下のエラーとなります。

これはfunctionを二重定義している、というエラーです。

このようにtwentyfourteenの関数の中には「二重定義を予防している」「二重定義を予防していない」という2種類の関数があるようです。

二重定義を予防している関数は、

twentyfourteen_setup
twentyfourteen_the_attached_image
twentyfourteen_list_authors

の3つでした。これらについてはそのまま、子テーマに同じ名前の関数を作ればそちらが活かされるようです。

二重定義エラーになる関数をカスタマイズしたいときはどうするか?

先ほど二重定義エラーになった twentyfourteen_wp_title をカスタマイズしたいと思います。

まず、親テーマのfunctions.phpから

この部分を子テーマのfunctions.phpにコピーします。

この関数はhtmlのtitle部分に出力される文字列を編集しているところのようですので、例としてそのtitle全てに _usagi という文字列を追加するカスタマイズをします。

の下に

という行を追加します。

関数名を twentyfourteen_wp_title から twentyfourteen_wp_title_usagi に変えます。違う名前なら何でもいいのですが。

add_filter行の2つめのパラメータを今名前を変更した twentyfourteen_wp_title_usagi とします。3つめのパラメータは優先度を表しています。10を5に変更します。

これらを変更した結果がこうなります。

これで再度読み込み直すと

Image

このようにtitleの部分の後ろに _usagi と追記され、子テーマのfunctions.phpでのカスタマイズができたことが分かります。

二重定義になってしまう関数についてはこのように、子テーマにコピーして関数名を変更。add_filterの関数名を変更すると共に優先順位の数字を小さくするという方法でカスタマイズできるようです。

テーマによって「二重定義を予防している」「二重定義を予防していない」は異なるかと思いますので、子テーマを作成する際はそれぞれの親テーマのfunctions.phpで確認してみてください。

兎本美佳

ブログを見た人がそのままできたらいいなと思って、できるだけ丁寧に書いています。blogに書いたようなネタの有償対応のご相談は「ゆうそうと」へいただければと思います(^^)/
無償での対応をご希望の場合は、コメントをいただけましたら可能な場合はコメントを返させていただきます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサー広告
ブログをメールで購読

メールアドレスを記入して購読すれば、更新をメールで受信できます。

261人の購読者に加わりましょう

トップへ戻る