より良いカスタマイズのために!フックの優先度を考えよう

「Snow Monkey」は、子テーマを用意せずにフックによるテーマの書き換えをプラグインでする事が可能なテーマです。
しかし、何も考えずに適当にフックをすると、間違った結果が表示される問題も起こるケースが存在します。

ルミェール

間違った結果の表示ってどう言うコトなんだろう?

ルミェール(アイコン05)

問題確認をしてみよう!

確認準備のソースコードを記入しましょう

問題を確認するために、下記のソースコードをmy snow monkey等に記述します。


add_filter(
	'snow_monkey_get_template_part_template-parts/common/infobar',
	'_common_infobar_1',
	1,
	2
);

add_filter(
	'snow_monkey_get_template_part_template-parts/common/infobar',
	'_common_infobar_2',
	2,
	2
);

public function _common_infobar_1( $_name, $_vars ) {
	$_isRemoved = remove_filter(
		'snow_monkey_get_template_part_template-parts/common/infobar',
		'_common_infobar_1',
	1
	);
	if ( $_isRemoved ) {
		ob_start();
		echo 'Infobar_1_Before<br>';
		\Framework\Helper::get_template_part( 'template-parts/common/infobar' );
		echo 'Infobar_1_After<br>';
		$_html = ob_get_clean();
		$_html = mb_ereg_replace(
			'This is Infobar_2',
			'This is Infobar_1',
			$_html
		);
		echo $_html;
	}
}

public function _common_infobar_2( $_name, $_vars ) {
	$_isRemoved = remove_filter(
		'snow_monkey_get_template_part_template-parts/common/infobar',
		'_common_infobar_2',
		2
	);
	if ( $_isRemoved ) {
		ob_start();
		echo 'Infobar_2_Before<br>';
		\Framework\Helper::get_template_part( 'template-parts/common/infobar' );
		echo 'Infobar_2_After<br>';
		$_html = ob_get_clean();
		$_html = mb_ereg_replace(
			'This is Infobar',
			'This is Infobar_2',
			$_html
		);
		echo $_html;
	}
}

動作を検証してみよう

上記のソースコードの説明は、後述しますので、お知らせバーに「This is Infobar」と言う文字列を入れ、実際にお知らせバーを確認してみましょう。下記のように表示されると思います。

Infobar_1_Before
Infobar_2_Before
This is Infobar_1
Infobar_2_After
Infobar_1_After

テネーブル

This is Infobar_1という文字列がお知らせバーに表示され、お知らせバーの前にはBefore、後にはAfterの文字列が表示されるようになっていますね!

テネーブル(アイコン01)

では、何故このような結果が表示されるのか解説です。

動作の流れを解説

処理される順番を見てみよう

_common_infobar_1functionは、優先度の数値を1として記述しており、優先度を低く設定しています。
_common_infobar_2functionは、優先度の数値を2として記述しており、優先度は_common_infobar_1より高い設定です。

WordPressのフック処理の仕様として、高い優先度の処理順に処理を行われることから、この場合は_common_infobar_2(優先度2)の処理が実行された後に、_common_infobar_1(優先度1)の処理が呼ばれることになります。

どう言う処理をしているのか見てみよう

function内ではどういった処理をしているのか見てみましょう。

_common_infobar_1では、function内でThis is Infobarと言う文字列をThis is Infobar_1に書き換える処理を行なっています。同時に処理が開始された際に「Infobar_1_Before」、処理が終了した際に「Infobar_1_After」とecho(表示)するようにしています。

_common_infobar_2では、function内でThis is Infobar_1と言う文字列をThis is Infobar_2に書き換えられる処理を行っています。同時に処理が開始された際に「Infobar_2_Before」、処理が終了した際に「Infobar_2_After」とecho(表示)するようにしています。

結果と照らし合わせて考えてみよう

結果のBeforeとAfterの文字の順を見てみると、_common_infobar_1の処理結果の中に、_common_info_bar_2の処理結果が格納されているのが解ります。

優先度を考えるコトを推奨する理由

例えば、優先度を99999などの非常に大きい数値に設定すれば、他のプラグインなどで追加されているフック処理より先に処理をされる可能性は非常に高くなります。
その為、その設定した処理はそのフック内では一番最初に処理をされる事になるでしょう。
しかし、優先度を無駄に高くした場合、その後に続く優先度の低い処理が正しく処理されなくなるかもしれません。

ルミェール

優先度を高くした場合は、その後に続く優先度の低い処理の事も考えないと駄目なんだ。影響が大きい処理をする場合は、優先度の低い処理が正しく実行されるかも確認するようにしよう!

ルミェール(アイコン01)