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()で読み込んだテンプレートの内容を文字列として取得することができ、より高度なカスタマイズや再利用が可能になります。

ぜひこのテクニックを活用して、よりスマートなテンプレート管理に役立ててみてください。

タグ: