【WordPress】get_template_partに変数を渡したいときにどうするか

TECH
2017.05.30
Pocket

【WordPress】get_template_partに変数を渡したいときにどうするか

WordPressでテーマの開発をしているとよく使うのがget_template_partです。
この関数は別のファイルにあるテンプレートのパーツをテンプレート内に読み込むものです。
PHPのincludeやrequireと似た動きをしますが、get_template_partではテンプレート内で別のテンプレートをより安全に呼び出すことが可能です。詳しい違いはこちらの記事をご確認ください。(Understanding get_template_part | Konstantin Kovshenin
よほどのことがない限り、includeやrequireではなくget_template_partを使いましょう。

get_template_partを使うとテンプレート内の共通部分を括り出し、ファイルをきれいにすることができます。
「共通部分」といっても完全に同じではない場合には異なる部分を変数で確認したくなるのではないでしょうか。
変数をパーツに渡したい場合にはWordPressの公式ではこのようにすると良いといっています。

// You wish to make $my_var available to the template part at `content-part.php`
set_query_var( 'my_var', $my_var );
get_template_part( 'content', 'part' );

関数リファレンス/get template part | WordPress Codex 日本語版

「set_query_var」でパーツのスコープに変数を設定しています。そうすれば別のファイルからでも変数を参照することができるということです。
しかし、毎回変数を設定するのは面倒ですし、あまりきれいではありません。
get_template_partに変数を配列で渡すことができればなと思いました。

そういうことで作ってみました。以下のコードをfunctions.phpに記載してください。

function get_template_part_with_var_array($template_name, $var_array=null){
  if (isset($var_array)) {
    while (list($key, $val) = each($var_array)) {
      set_query_var($key, $val);
    }
  }
  get_template_part($template_name);
}

1つめの引数では通常のget_template_partと同様にテンプレートパーツの名前(パス)を指定します。2つめの引数でパーツに渡したい変数を連想配列で与えます。
連想配列はこのような形で定義し、関数を入れたいテンプレート内で以下のように関数呼び出します。

$var_array = array('apple'=>'りんご', 'banana'=>'バナナ');
get_template_part_with_var_array('template-part', $var_array);

なお、パーツに渡す変数である第2引数は任意です。何も設定しない場合には変数がセットされず通常のget_template_part同じような振る舞いになります。

get_template_partで変数を引数として渡したい場合に使ってみてください。

Pocket