親テーマの function.php 内の関数を子テーマから上書きしたい

子テーマを使用していて「親テーマのfunction.phpで定義されている関数を編集したい」ってときがあります。

例えば、function.phpでウィジェットやメニューが定義されていて、そこんところのタグを変更したいとか。

上は、サイドバーウィジェットの定義ですが、タイトルが<h3>となっているのを<h2>にしたいときとかです。

親テーマを直接修正すれば速いんだけど、それだと親テーマがアップデートしたときにやられっちゃう。

かと言って、子テーマの function.php は親テーマよりも先に呼び出されてしまうので上書きは出来ないし、上書きできたとしても関数名が同じだとエラーになってしまう。

 

まずもって、function だけ親テーマが後で呼び出されるってのが問題なんですよね。あちこちで「どうしてこの仕様なんだ!」って怒ってる人がいますもんね。

文句言ってても仕方がないので、解決方法を。

 

まず、以下のように、! function_exists が使用されている場合

いい人。

親テーマの function.php で関数定義する際に、以下の様に関数を、! function_exists で括ってくれていれば、何の問題もありません。

子テーマで同じ関数名を定義して、後から読み込まれる親テーマの function.php では、既にその関数名が定義されているので二重定義はされないから。

ですから、この場合は上書きというか、先に定義して後の親テーマでは無視する(定義しない)ということになります。

 

ところが、世の中いい人ばかりではなく

親テーマの function.php で ! function_exists を使用していない場合

が多々あります。

そんな場合は、上記の方法と同じくしてしまうと、二重定義でエラー。あえなく撃沈

関数名を変えて出直したところで、中身は後から読み込まれる親テーマの function.php で上書きされてしまうので同じこと(;´Д`) 

 

では、どうするかというと、読み込みの順番を変える一手間が必要になります。

このあたりの方法は、IT工房さんや、Zack 一丁目さんに詳しく書かれています。

WordPressの子テーマ編集でfunctions.phpを上書きする方法

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