WordPressサイトを子テーマで作成していると、親テーマで定義されている関数を子テーマ側で上書きしたいケースが出てきます。上書きというよりも、置き換えや再定義ですね。
functions.phpは子テーマ→親テーマの順で両方読み込まれるため、子テーマで定義した関数を優先させるにはひと手間必要です。
そんなわけで、親テーマのfunctions.phpで定義された関数を子テーマのfunctions.phpで上書きする方法をご紹介したいと思います。
親テーマで定義されている関数を子テーマのfunctions.phpで上書きする方法
親テーマ側に!function_existsがある場合
親テーマ側のfunctions.phpで関数を定義する時に、!function_existsが記述されている場合は、同じ関数名で子テーマ側に定義してあげれば良いので楽です。
if ( !function_exists( 'hoge' ) ) {
function hoge() {
//何らかの処理
}
}
親テーマ側で上記のように書かれていたら、子テーマ側でも同じ関数名を定義することで上書きされます。
これは、子テーマ→親テーマの順でfunctions.phpが読み込まれる仕様が関係します。親テーマのfunctions.phpが読み込まれたタイミングではすでに定義済みになっているので、子テーマ側で定義した関数が優先されるわけですね。
親テーマ側に!function_existsがない場合
親テーマ側に!function_existsが書かれていない場合、子テーマ側に同じ関数名を定義するとエラーになってしまいます。
この場合は、一旦親テーマの関数を無効化したうえで、上書き(というか再定義)してあげる必要があります。
例えば、親テーマに以下のような関数が記述されていたとします。
//サムネイルサイズを追加
add_image_size( 'custom_thumb_size', 600, 300, true );
//wp_headにcustomstyle.cssの読み込みを追加
function adds_head() {
echo '<link rel="stylesheet" href="customstyle.css">';
}
add_action('wp_head', 'adds_head');
これを上書きするには、子テーマ側で以下のように記述します。
//wp_headにcustom_child_style.cssの読み込みを追加
function child_adds_head() {
echo '<link rel="stylesheet" href="custom_child_style.css">';
}
//テーマのfunctions.phpが読み込まれた後で関数を再定義
function after_parent_theme_func() {
add_image_size( 'custom_thumb_size', 300, 300, true ); //サムネイルサイズの変更
remove_action('wp_head', 'adds_head'); //親テーマの関数を無効化
add_filter('wp_head', 'child_adds_head'); //子テーマの関数を追加
}
add_action('after_setup_theme', 'after_parent_theme_func', 20);
まず、child_adds_headは子テーマ側で定義した新たな関数です。
after_setup_themeは、テーマのfunctions.phpが読み込まれた後で実行されるので、そのタイミングで親テーマのadds_headをremove_actionで無効化して、子テーマのchild_adds_headを追加しています。
add_image_sizeに関しては、同じ名前でサイズを変えて記述すれば上書きされます。
あとがき
子テーマを使っていて、どうしても親テーマの関数を上書きしたい時は、ぜひ参考にしていただければと思います。
親テーマのアップデートでfunctions.phpの中身も変わる可能性があるので、その点は十分に注意する必要があります。