WordPress : 子テーマのfunctions.phpを優先処理する

子テーマは親テーマの内容を上書きしますが、 functions.php だけは「子→親」の順で処理されるため、親子で同じアクションフックを使うと親の方が優先されてしまいます。 何でこんな仕様なんだよ…と思いもしますが対応方法を紹介します。

よく使われる functions.php のカスタマイズ例を挙げると、 the_exerpt() は出力する文字数が多い時にデフォルトでは [...] と文末に出力されるのを に置き換えるカスタマイズがあります。

function custom_excerpt_more($more) {
  return '…';
}
add_filter('excerpt_more', 'custom_excerpt_more');

最後の add_filter()excerpt_more のアクションフックを使っています。

しかし親テーマでも excerpt_more が使われていると出力結果が親に上書きされ帳消しにされます。

これを以下のように書き換えます。

function custom_excerpt_more($more) {
  return '…';
}
function set_after_parent_theme() {
  remove_action('excerpt_more', '親テーマでexcerpt_moreにアクセスしている関数名');
  add_filter('excerpt_more', 'custom_excerpt_more');
}
add_action('after_setup_theme', 'set_after_parent_theme', 20);

新たに set_after_parent_theme() という関数を作り、 after_setup_theme というアクションフックで実行しています。

after_setup_theme は全てのテーマが読み込まれた後に処理されるアクションフックです。親側でも使われている場合は、上記例の最後に 20 と指定している数値を親より高くすれば優先度をコントロールできます。

set_after_parent_theme() 関数の中で、5行目の remove_action() で親の出力結果を削除し、子の関数を実行する形です。