Snow Monkeyで書き換えるなら、優先度は高くするのが良い?

タイトルはちょっと適当かもしれません(笑)
Snow Monkeyテーマでは、フックによるテーマの書き換えが可能です。
しかし、何でもかんでもフックをすると、とんでもない結果が表示される問題も起こるかもしれません。

例えば、こんなコードを用意してみました。

class Sample {
	public function __construct() {
		add_filter(
			'snow_monkey_get_template_part_template-parts/common/infobar',
			[ $this, '_common_infobar_1' ],
			1,
			2
		);
		add_filter(
			'snow_monkey_get_template_part_template-parts/common/infobar',
			[ $this, '_common_infobar_2' ],
			2,
			2
		);
	}

	public function _common_infobar_1( $_name, $_vars ) {
		$_isRemoved = remove_filter(
			'snow_monkey_get_template_part_template-parts/common/infobar',
			[ $this, '_common_infobar_1' ],
			1
		);
		if ( $_isRemoved ) {
			ob_start();
			echo 'Infobar_1_Before<br>';
			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',
			[ $this, '_common_infobar_2' ],
			2
		);
			if ( $_isRemoved ) {
				ob_start();
				echo 'Infobar_2_Before<br>';
				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

ここで、この結果に何故なるのかをちょっと調べてみます。

_common_infobar_1のfunctionが呼ばれるのは、優先度が1と低く、
_common_infobar_2のfunctionが呼ばれるのは、優先度が2と高いです。

なので、WordPressのフックは同slugの優先度の高い順から呼ばれる仕様のために、_common_infobar_2が呼ばれた後に、_common_infobar_1が呼ばれることになります。
_common_infobar_1のfunction内でThis is InfobarThis is Infobar_1に書き換えた結果は、_common_infobar_2のfunction内でのHelper::get_template_partによって受け取られ、その後に再度This is Infobar_1This is Infobar_2に書き換えられる処理をしていると言う事になります。

BeforeとAfterの文字の順を見ても、1の中に2が格納されているのが解りますね。

そのため、テーマの上書きをsnow_monkey_template_part_rootフックでrootを置換して、ファイルをプラグインに置いた形でファイルからの上書きをされる場合、優先度は99999などの非常に高い値に設定するのをオススメします。
高い値にする事で一番最初に処理をされるでしょう。そこから細かく置換をしていくフックで、それぞれの機能に対しての優先度は低めの値にしておき、文字列置換などの方法で適所な部分に対しての上書きをしてあげる形が、拡張をする上で楽な実装方法かもしれません。

Kmix-39

ただし、プラグインでの拡張について、必ずしもその方が良いとは限りません。また、もっと良い方法があれば、是非共有してください。

この記事を書いた人

kmix-39

kmix-39

主に日本の関西に出没する。
小学時代にWindows 95に触れ、BASICを始めて以来、HTML、Perl、Java(JSP, Servlet)、COBOL、C++、C#、PHP、Objective-C、Swift…と、数々の言語を地獄の現場を経験しながら覚えていった元IT社畜。
「好きな時に 好きなことを 好きなだけ」をしたい。