ページ内目次

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

子テーマを使用していて「親テーマの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 覚書き~

↑上へまいりま〜す