Blog

【WordPress】親テーマのフィルターフック/アクションフックを無効化して上書きする方法

2021.06.09 WordPress
【WordPress】親テーマのフィルターフック/アクションフックを無効化して上書きする方法

WordPressで子テーマを使う際、親テーマのフィルターフック(add_filter)やアクションフック(add_action)を上書きしたいケースがあります。

こういう場合、親テーマと同じ関数を使って子テーマでフィルターフック/アクションフックを設定し直せば大丈夫なように思えますが、親テーマですでに宣言されている関数を子テーマで再度宣言することはできません。

そのため、親テーマのフィルターフック/アクションフックを無効化し、子テーマで別の関数を使ってフィルターフック/アクションフックを設定する必要があります。

親テーマのフィルターフック/アクションフックを無効化して子テーマで上書きする方法

ここでは例として、親テーマにあるbw_image_instruction()という関数を無効化し、子テーマでbw_image_instruction_child()という関数で上書きする方法をご紹介します。

function bw_image_instruction_child() { //子テーマの関数
	//子テーマで追加したい機能を記述
}
function replace_bw_image_instruction() { //親フィルターを無効化&子フィルターを有効化する関数
	remove_filter( 'admin_post_thumbnail_html', 'bw_image_instruction'); //親テーマのフィルターを無効化
	add_filter( 'admin_post_thumbnail_html', 'bw_image_instruction_child'); //子テーマのフィルターを有効化
}
add_action('after_setup_theme', 'replace_bw_image_instruction'); //after_setup_themeのタイミングで実行

はじめに子テーマで機能を追加するbw_image_instruction_child()関数を宣言し、追加したい機能を記述します。

その後、親テーマのフィルターを無効化(remove_filter)し、子テーマのフィルターを有効化するreplace_bw_image_instruction()関数を作ってフックさせるという流れです。

親テーマで!function_exists()を使うといいかもしれない

以上、親テーマのフィルターフック/アクションフックを無効化して上書きする方法でした。

関数を重複して宣言することができないため、親のフィルターを無効化して子テーマのフィルターを有効化するという手順が必要になります。

しかし親テーマで以下のように記述しておけば、子テーマで同じ関数を宣言するだけでフックを上書きすることができます。

if ( !function_exists( 'bw_image_instruction' ) ) { //関数が存在しなければ実行

	function bw_image_instruction() {
		//ここに処理を記述
	}
	add_action( 'after_setup_theme', 'bw_image_instruction' );

}

ただこの場合は親テーマで設定した機能がすべてリセットされてしまうので、引き継ぎたい機能がある場合は子テーマにも同じ内容を記述することになります。

なので親テーマの機能を残しつつ子テーマで機能を追加したいというときは、別の関数を使ってフックを作成した方がよいかと思います。