Snow Monkey でテンプレートの内容を書き換える3種類のフック

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

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

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

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

snow_monkey_template_part_render というフィルターフックを使います。すべてのテンプレートがこのフックを通るので、$slug$name で条件分岐させて、特定のテンプレートのときだけ書き換え処理がおこなわれるようにしてください。

/**
 * @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/content/entry/content-404.php を書き換える場合
		if ( 'template-parts/content/entry/content' === $slug && '404' === $name ) {
			// ここで $html を str_replace() や preg_replace() して書き換える
			return $html;
		}

		return $html;
	}
);

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

書き換えるのではなく、全く別の内容にしたい場合は snow_monkey_get_template_part_<slug> アクションフックを使う方法もあります。snow_monkey_template_part_render でも返す値を全く別の内容にすることで同様のことが実現できますが、snow_monkey_template_part_render は全てのテンプレートが通るのに対し、snow_monkey_get_template_part_<slug> はそのテンプレートだけが通るという違いがあります。

/**
 * @param string $name 特定テンプレートの名前
 * @param array $vars テンプレートに渡された変数
 */
add_filter(
	'snow_monkey_get_template_part_template-parts/footer/copyright',
	function( $name, $vars ) {
		?>
		<div class="my-copyright">
			コピーライト
		</div>
		<?php
	},
	10,
	2
);

さらに派生版として、snow_monkey_get_template_part_<slug>-<name> アクションフックもあります。

/**
 * @param array $vars テンプレートに渡された変数
 */
add_filter(
	'snow_monkey_get_template_part_template-parts/content/entry/content-404',
	function( $vars ) {
		?>
		<div class="404">
			404 だ!
		</div>
		<?php
	}
);

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

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;
	}
);

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

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