親テーマで定義されている関数を子テーマのfunctions.phpで上書きする方法

親テーマで定義されている関数を子テーマのfunctions.phpで上書きする方法

親テーマで定義されている関数を子テーマのfunctions.phpで上書きする方法

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の中身も変わる可能性があるので、その点は十分に注意する必要があります。

この記事が気に入ったら
いいね!してね♪

Twitter で
スポンサードリンク

関連記事

コメントを残す

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