
WordPressでテーマ開発をしていると、コードの再利用性を高めるためにget_template_part()
関数を活用することが多いと思います。この関数は指定したテンプレートファイルを読み込み、その内容を出力してくれる便利な関数ですが、標準の動作では「出力」のみが可能で、文字列として内容を取得することはできません。
この記事では、get_template_part()
の動作をカスタマイズし、「テンプレートの内容を文字列として取得する方法」について解説します。Ajax 対応やショートコード、ブロックエディタなど、テンプレートの内容を柔軟に扱いたい場面で役立つテクニックです。
get_template_part() の基本動作
まずは基本の使い方をおさらいです。
get_template_part('part-nav');
このように記述すると、part-nav.php
が読み込まれ、現在の出力バッファにその内容が即座に出力されます。
また、第2・第3引数を指定することで、異なるバリエーションのファイルを読み込んだり、テンプレートに変数を渡すことができます。
// part-nav-footer.php があれば読み込み、なければ part-nav.php を読み込み
get_template_part('part-nav', 'footer');
// 変数 $args を part-nav.php に渡して読み込み
get_template_part('part-nav', null, $args);
出力ではなく「返す」には?
PHPにはob_start()
やob_get_clean()
といった「出力バッファリング」の機能があります。これを活用すれば、出力される内容を一時的にバッファに貯めて、文字列として取得することができます。
以下がそのサンプルコードです。このコードをfunctions.php
に追加します。
function get_template_part_as_string($slug, $name = null, $args = []) {
ob_start();
$templates = [];
if (isset($name)) {
$templates[] = "{$slug}-{$name}.php";
}
$templates[] = "{$slug}.php";
$located = locate_template($templates, false, false);
if ($located) {
// $args を使えるようにテンプレート内に展開
if (!empty($args) && is_array($args)) {
extract($args, EXTR_SKIP);
}
include $located;
}
return ob_get_clean();
}
使用例
$content_html = get_template_part_as_string('part-nav', null, $args);
echo '<div class="ajax-content">' . $content_html . '</div>';
このようにすれば、テンプレートの内容を変数に格納し、任意の場所で再利用したり、出力を制御したりすることが可能になります。
活用アイデア
- AjaxでテンプレートのHTMLを返すAPIの作成
- 管理画面でのプレビュー表示
- メール本文などにテンプレートを流用
- ショートコードでテンプレートを使用
終わりに
WordPressのテンプレートシステムは強力ですが、標準機能だけでは柔軟な出力制御が難しい場面もあります。今回紹介したように、出力バッファリングを活用すれば、get_template_part()
で読み込んだテンプレートの内容を文字列として取得することができ、より高度なカスタマイズや再利用が可能になります。
ぜひこのテクニックを活用して、よりスマートなテンプレート管理に役立ててみてください。