Snow Monkey でテンプレートの内容を書き換えるフィルターフック

通常、WordPress テーマでテンプレートの内容を書き換えたい場合は、子テーマを用意して上書きしたいテンプレートを親テーマから子テーマにコピーし、そのコピーを書き換えるという方法をとります。

この方法は直感的でお手軽ではあるものの、運用面を考えると決して簡単な方法ではありません。その理由は下記の記事に書きました。

そういうことで、Snow Monkey には子テーマでテンプレートの上書きをしなくてもテンプレートの内容を書き換える3種類のフックを用意しています。

テンプレートの内容を書き換える

snow_monkey_template_part_render_{slug}

{slug} で指定したテンプレートのときにこのフックを通ります。

/**
 * @param string $html テンプレートの中身
 * @param string $slug 一般テンプレートのスラッグ名
 * @param string $name 特定テンプレートの名前
 * @param array $vars テンプレートに渡された変数
 * @return string 書き換え後の HTML
 *
 * template-parts/common/breadcrumbs.php を書き換える場合
 */
add_filter(
	'snow_monkey_template_part_render_template-parts/common/breadcrumbs',
	function( $html, $name, $vars ) {
		// ここで $html を str_replace() や preg_replace() して書き換える
		return $html;
	},
	10,
	3
);

snow_monkey_template_part_render

すべてのテンプレートがこのフックを通ります。

/**
 * @param string $html テンプレートの中身
 * @param string $slug 一般テンプレートのスラッグ名
 * @param string $name 特定テンプレートの名前
 * @param array $vars テンプレートに渡された変数
 * @return string 書き換え後の HTML
 */
add_filter(
	'snow_monkey_template_part_render',
	function( $html, $slug, $name, $vars ) {
		// template-parts/common/breadcrumbs.php を書き換える場合
		if ( 'template-parts/common/breadcrumbs' === $slug ) {
			// ここで $html を str_replace() や preg_replace() して書き換える
			return $html;
		}

		return $html;
	},
	10,
	4
);

テンプレートの内容を定義する

snow_monkey_pre_template_part_render_{slug}

{slug} で指定したテンプレートのときにこのフックを通ります。null 以外が返されるとテンプレートの読み込みがスキップされて、定義した内容が使用されます。

/**
 * @param null $html テンプレートの中身
 * @param string $slug 一般テンプレートのスラッグ名
 * @param string $name 特定テンプレートの名前
 * @param array $vars テンプレートに渡された変数
 * @return string 書き換え後の HTML
 *
 * template-parts/common/breadcrumbs.php を定義する場合
 */
add_filter(
	'snow_monkey_pre_template_part_render_template-parts/common/breadcrumbs',
	function( $html, $name, $vars ) {
		return 'パンくずだよ';
	},
	10,
	3
);

snow_monkey_pre_template_part_render

すべてのテンプレートがこのフックを通ります。null 以外が返されるとテンプレートの読み込みがスキップされて、定義した内容が使用されます。

/**
 * @param null $html テンプレートの中身
 * @param string $slug 一般テンプレートのスラッグ名
 * @param string $name 特定テンプレートの名前
 * @param array $vars テンプレートに渡された変数
 * @return string 書き換え後の HTML
 */
add_filter(
	'snow_monkey_pre_template_part_render',
	function( $html, $slug, $name, $vars ) {
		// template-parts/common/breadcrumbs.php を定義する場合
		if ( 'template-parts/common/breadcrumbs' === $slug ) {
			return 'パンくずだよ';
		}

		return $html;
	},
	10,
	4
);

読み込むテンプレートやテンプレートに渡される値を書き換える

snow_monkey_get_template_part_args_{slug}

{slug} で指定したテンプレートのときにこのフックを通ります。

/**
 * @param array $args
 *   @param string slug
 *   @param string name
 *   @param array vars
 * @return array
 *
 * template-parts/footer/copyright.php から template-parts/footer/my-copyright.php に変更する
 */
add_filter(
	'snow_monkey_get_template_part_args_template-parts/footer/copyright',
	function( $args ) {
		// 読み込むテンプレートを変更する
		$args['slug'] = 'template-parts/footer/my-copyright';
		return $args;
	}
);

snow_monkey_get_template_part_args

すべてのテンプレートがこのフックを通ります。テンプレートが決定される直前に通り、テンプレートの slugname はもちろん、テンプレートに渡される変数(vars)も変更できます。

/**
 * @param array $args
 *   @param string slug
 *   @param string name
 *   @param array vars
 * @return array
 */
add_filter(
	'snow_monkey_get_template_part_args',
	function( $args ) {
		// 読み込むテンプレートを変更する
		// template-parts/footer/copyright.php から template-parts/footer/my-copyright.php に変更する
		if ( 'template-parts/footer/copyright' === $args['slug'] ) {
			$args['slug'] = 'template-parts/footer/my-copyright';
		}

		// パンくずリストのリストを差し替える
		if ( 'template-parts/common/breadcrumbs' === $args['slug'] ) {
			$args['vars']['_items'] = [
				[
					'title' => 'トップページ',
					'link'  => home_url(),
				],
			];
		}

		return $args;
	}
);

動画

HAPPY SNOW MONKEY さんとのコラボ動画で上記のフックについて解説をしています。

Snow Monkey オンラインコミュニティ

Snow Monkey をより良いテーマにするために、今後の機能開発等について情報共有したりディスカッションをしたりする場所です。より多くのユーザーの交流があったほうがより良いプロダクトに育っていくと思いますので、ぜひご参加ください!