子テーマを使用していて「親テーマのfunction.phpで定義されている関数を編集したい」ってときがあります。
例えば、function.phpでウィジェットやメニューが定義されていて、そこんところのタグを変更したいとか。
register_sidebar( array( 'name' => __('Sidebar(Home)', 'specialtheme' ), 'id' => 'front-side-top-widget-area', 'before_widget' => '<aside class="widget %2$s" id="%1$s">', 'after_widget' => '</aside>', 'before_title' => '<h3 class="widget-title subSection-title">', 'after_title' => '</h3>', ) );
上は、サイドバーウィジェットの定義ですが、タイトルが<h3>となっているのを<h2>にしたいときとかです。
親テーマを直接修正すれば速いんだけど、それだと親テーマがアップデートしたときにやられっちゃう。
かと言って、子テーマの function.php は親テーマよりも先に呼び出されてしまうので上書きは出来ないし、上書きできたとしても関数名が同じだとエラーになってしまう。
まずもって、function だけ親テーマが後で呼び出されるってのが問題なんですよね。あちこちで「どうしてこの仕様なんだ!」って怒ってる人がいますもんね。
文句言ってても仕方がないので、解決方法を。
まず、以下のように、! function_exists が使用されている場合
いい人。
親テーマの function.php で関数定義する際に、以下の様に関数を、! function_exists で括ってくれていれば、何の問題もありません。
if ( ! function_exists( 'original_widgets_init' ) ) { function original_widgets_init() { // sidebar widget area register_sidebar( array( 'name' => __('Sidebar(Home)', 'lightning' ), 'id' => 'front-side-top-widget-area', 'before_widget' => '<aside class="widget %2$s" id="%1$s">', 'after_widget' => '</aside>', 'before_title' => '<h3 class="widget-title subSection-title">', 'after_title' => '</h3>', ) ); } }
子テーマで同じ関数名を定義して、後から読み込まれる親テーマの function.php では、既にその関数名が定義されているので二重定義はされないから。
ですから、この場合は上書きというか、先に定義して後の親テーマでは無視する(定義しない)ということになります。
ところが、世の中いい人ばかりではなく
親テーマの function.php で ! function_exists を使用していない場合
が多々あります。
そんな場合は、上記の方法と同じくしてしまうと、二重定義でエラー。あえなく撃沈
関数名を変えて出直したところで、中身は後から読み込まれる親テーマの function.php で上書きされてしまうので同じこと(;´Д`)
では、どうするかというと、読み込みの順番を変える一手間が必要になります。
このあたりの方法は、IT工房さんや、Zack 一丁目さんに詳しく書かれています。
https://itstudio.co/2017/12/18/7118/
親テーマのfunctions.php内のrequireの参照先の関数を子テーマで書き換える方法~WordPress 覚書き~