通常、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
すべてのテンプレートがこのフックを通ります。テンプレートが決定される直前に通り、テンプレートの slug
や name
はもちろん、テンプレートに渡される変数(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 さんとのコラボ動画で上記のフックについて解説をしています。