親テーマのfunctions.php内のrequireの参照先の関数を子テーマで書き換える方法~WordPress 覚書き~

WordPressの無料テーマをカスタマイズする際に、親テーマのfunctions.php内にrequireで読み込まれている.phpファイル内に記述されている関数を子テーマで変更した時の覚書き。

テーマをいじっていると、incディレクトリとかcustomizerディレクトリとかの中にある関数定義ファイルを、親テーマのfunctions.phpがrequireで読み込んでいる場合が多々あると思います。

そんな、「親テーマのfunctions.phpに外部から読み込んでいる関数定義ファイル」の中で定義されている関数をちょっといじりたい時、その関数がif( ! function_exists())で始まっていれば、いじりたい関数を子テーマのfunctions.phpに書いてしまえばよいのですが、

if( ! function_exists())で始まっていないパターンって結構あるんですよね。

こういった時に、直接親テーマをいじらずに、子テーマ内だけで解決する方法を書いておきます。

remove_actionを使ってフックに設定された関数を削除して、新たな関数をフックに設定する

結論から言うとこういうことです。

なので、大前提として、変更したい関数が何かしらのフックに設定されていることが条件となります。

function xxx(){

}
add_action(‘yyy’,’xxx’)

みたいな場合ですね。

シンプルに

function xxx(){…}

のみで定義されている場合は、今回の方法は使えないので、親テーマを直接いじるしかないかもしれません。。

さて、親テーマのfunctions.phpに下記の様に記述があったとします。

require get_template_directory() . '/inc/hoge/hoge.php';

そして、hoge.phpには下記の様に関数が設定されていました。

function xxx(){
    ...
}
add_action('yyy','xxx')

このfunction xxx()の内容を変更したいというのが今回の趣旨です。

◆まずはhoge.phpを同じ階層構造で子テーマ内にコピー

分かりやすいように子テーマの中に

/inc/hoge/hoge_child.php

として、同じ階層構造で(ディレクトリを同じように作って)hoge.phpをコピー、hoge_child.phpとしておきます。

◆次に子テーマのhoge_child.php内の関数の内容を変更する

この時、関数の内容の変更と同時に、下記の様に関数名を変更しておきます。
※関数名は任意

function xxx_child(){
     ......
}
add_action('yyy','xxx_child')

上記の関数は、フックyyyに設定します。

◆最後に子テーマのfunctions.phpにフックの削除などを記述

子テーマのfunctions.phpに、親テーマのhoge.phpで設定したフックの削除とhoge_child.phpを読み込む関数を記述し、この関数を親テーマが読み込まれた後に実行されるように設定します。
※関数名(override_functionsの部分)は任意

function override_functions() {
 remove_action('yyy','xxx');
 require get_stylesheet_directory() . '/inc/hoge/hoge_child.php';
}
add_action( 'after_setup_theme', 'override_functions' );

これにより、

  1. remove_actionで、親テーマで設定されたhoge.php内の関数がフックから削除され
  2. requireで、hoge_childを読み込んで変更後の関数xxx_childをフックに再設定します。
  3. add_action( ‘after_setup_theme’, ‘override_functions’ )によって、親テーマのfunctions.phpが読み込まれた後に、1.と2.を実行します。

こうすることで、趣旨通りの変更(親テーマのfunctionの上書き的なコト)が可能となりました。

いかがでしたでしょうか?

これは、あくまで分かりやすいようにということで、子テーマにhoge_child.phpを作って読み込むという形をとっていますが、子テーマのfunctions.php内に直接書き込んでしまってももちろん構いません。(でも、hoge_child.phpを作った方がスッキリしてよいと思います!)

みなさんのお役に立てますように!!

※あ、get_template_directory()と、get_stylesheet_directory()を書き間違えないように気を付けてくださいね~。私はよくやってしまいます。。(笑)

参考:[WordPress]after_setup_theme()を使って、親テーマのアクションフックを小テーマから削除する