【WordPress】 子テーマを使ったカスタマイズについて(functions.php編)

css編に続いてfunctions.phpの親子関係についてです。

functions.phpはテーマ特有の関数を宣言するファイルですが、これがヒジョーにややこしい。

分かったことを整理してみましょう。

スポンサーリンク

1.functions.phpを読むこむ順番は?

functions.phpはstyle.cssと異なり、子テーマを読んでから親テーマを読み込みます。

child_theme_02b

まず親テーマに存在しない関数名を子テーマで定義することは特に問題はありません。
そのまま子テーマのfunctions.phpに書き込めばOKです。

しかし親テーマで定義した関数と同じ名前の関数を子テーマでも定義しようとするとエラーがでてしまいます。(一部例外あり:後述)
style.cssのように上書きをしてくれないのです。

ではどうしたらいいのでしょうか?
親テーマで定義されている関数を子テーマfunctions.phpだけで変更をするには、ちょっと特殊な方法を用います。

「add_action」というアクションフックを使い、任意のタイミングで割り込んで別の関数を処理させます。
今回使う「after_setup_theme」であれば、「全てのテーマの読み込んだ後に割り込んで・・・」ということになります。

これで処理は

子テーマ functions.php

親テーマ functions.php

全てのテーマ読み込み完了(after_setup_theme発動)

子テーマ add_action( ‘after_setup_theme’, ‘〇〇’ )で指定された関数〇〇

という順番でになります。

この関数〇〇で親テーマで定義した関数の内容を変更するという仕組みです。

2.実際にやってみた

「ダッシュボード右下のアイキャッチ画像投稿機能:ON」は親テーマのfunctions.phpで定義されています。
これを子テーマでOFFにしてみましょう。

child_theme_03c

では子テーマのfunctions.phpに以下のコードを追加します。

 // アイキャッチ画像投稿機能をOFF
function twentytwelve_setup_child () {
    remove_theme_support( ‘post-thumbnails’ );
}
add_action( ‘after_setup_theme’, ‘twentytwelve_setup_child’ )

コードの意味はこのようになります。

child_theme_04f

これをFTPで転送するとこうなりました。

child_theme_05d

だめじゃん!!

で、さらにいろいろ調べてようやく原因がわかりました。

実は親テーマで設定されたアイキャッチ画像投稿機能も「after_setup_theme」で処理されていたのです。

child_theme_06b

すなわち、

子テーマ functions.php

親テーマ functions.php

全てのテーマ読み込み完了(after_setup_theme発動)

子テーマ after_setup_theme : アイキャッチ画像投稿機能OFF

親テーマ after_setup_theme : アイキャッチ画像投稿機能ON

と言う順番で処理されていたのです。

これでは消えるわけがありませんね。

更に調べてみると、

add_action( ‘after_setup_theme’, ‘関数名’ )

で同じタイミングを指定されて場合に処理する順番に優先順位をつける引数「priority」というものがあることが分かりました。

add_action( ‘after_setup_theme’, ‘関数名’ ,priority )

何も書かれていない時はデフォルト値の「10」で、より小さいものが先に処理されます。

ではコードにpriority値を追加しましょう。

 // アイキャッチ画像投稿機能をOFF
function twentytwelve_setup_child () {
    remove_theme_support( ‘post-thumbnails’ );
}
add_action( ‘after_setup_theme’, ‘twentytwelve_setup_child’, 20 )

これをためしてみると、

child_theme_07b

成功です!!

もう一度処理の順番を整理すると、

子テーマ functions.php

親テーマ functions.php

全てのテーマ読み込み完了(after_setup_theme発動)

子テーマ after_setup_theme : priority値無し(デフォルトの10

親テーマ after_setup_theme : priority値無し(デフォルトの10
アイキャッチ画像投稿機能ON

子テーマ after_setup_theme : priority値=20
アイキャッチ画像投稿機能OFF

となるわけです。

3.同じ関数名を宣言してもエラーが出ない「一部例外」ってなに?

functions.phpは子テーマ→親テーマの順番で読み込まれ、同じ関数名を定義するとエラーになると書きました。
しかし一部に例外もあるようです。

それは親テーマのfunctions.php内の関数の前に以下のような条件文が付けられている場合です。

if ( ! function_exists( ‘twentytwelve_content_nav’ ) ) :

これは「twentytwelve_content_navと言う関数が宣言されていないときは・・・」という意味です。
もし子テーマで先に「twentytwelve_content_nav」が宣言されていた場合は、親テーマの関数宣言は行わないということです。
もっと簡単に言うと、同じ名前の関数がある場合でもエラーにならず子テーマが優先されるということです。

この条件が付いている関数をピックアップしてみると、

twentytwelve_content_nav
twentytwelve_comment
twentytwelve_entry_meta

の3つだけでした。
これが前出の「例外」です。

すなわちこの関数であれば、子テーマにコピーして改造してもOKということです。

4.アクションフックとフィルターフック

上記の例では「add_action」というアクションフックを使いました。
同じような用途にフィルターフック「add_filter」というものもあります。

どのような違いがあるのでしょうか?

プラグインAPI(WordPress Codex)

これを見る限り、フィルターフックはテキストの改造に使われるようです。
そして今回使った「after_setup_theme」のようなフィルターは他にも数多くあります。

アクションフック一覧(WordPress Codex)
フィルターフック一覧(WordPress Codex)

これらを使いこなすにのは相当先になりそうですが。

なんだかんだでわかったことは、WordPressのカスタマイズの考え方はこの図のような仕組みのようです。
このため凝ったカスタマイズをしようとすればするほど、アクションフックやフィルターフックが重要になってくるようです。

child_theme_08c

【参考サイト】
WordPress アクションフックとフィルターフック概論(hijiriworld Web)

WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック(Web Design RECIPES)

5.まとめ

functions.phpを使ったカスタマイズは親テーマをいじらすに子テーマだけで行いましょう。

子テーマのfunctions.phpへ関数を書く場合、

  • 親テーマに同じ関数名がなければ、子テーマに追加するだけでOK
  • 親テーマで定義された関数の内容を書き換えたい場合は、フックを用いて子テーマの別の関数で内容を変更する。
  • 上記の「一部例外」に該当する関数の場合は、親テーマからコピーして変更する。

正直なところ難しすぎて消化不良を起こしています。
ぶっちゃけ素人の私がこの領域に足を踏み入れるのは少々早すぎたようです。

用語もあやふやでもしかしたら恥ずかしい使い方をしているかもしれません。
関数を処理?宣言?実行?読み込み?

混乱させてしまったら申し訳ないです。


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

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA