私はinclude
またはrequire
を長期間のコードメンテナンスを節約するために自分自身で使うのが普通でしたが、私はget_template_part
とlocate_template
を使い始めました。
私の質問は、あなたがget_template_part
またはlocate_template
のいずれかの結果に変数を渡すことができるはずだということですか?
<?php
$var = get_option( 'my-custom-option' );
get_template_part( 'custom-template-part' );
?>
上記のコードでは、$var
はカスタムテンプレートの内側に表示されますが、変数は機能しないようです。なにか足りないのでしょうか。
上記のインスタンスやlocate_templateを使用した場合には渡されないことがわかりました。
<?php
locate_template( 'custom-template-part.php', true );
?>
同様に MathSmathは 、 get_template()を書きました はあなたの変数の再利用をサポートしていません。
しかし locate_template() infactはまったくインクルードしません。それは包含のためのファイルを見つけるだけです。
したがって、 include を使用して、これを期待どおりに機能させることができます。
include(locate_template('custom-template-part.php'));
あなたの例の$var
はその時テンプレート部分で使うことができます。
変数のスコープとget_template()に関するより技術的な説明を含む関連する質問: get_template_part()によるフォーム送信エラー
codex にあるきちんとした解決策
あなたがカスタム投稿を通してループしているのであれば、あなたはこれを行うことができます:
foreach ($custom_posts as $custom_post) {
set_query_var( 'my_post', $custom_post );
get_template_part( 'content', 'part' );
}
そしてそのテンプレート自体の中で、あなたは自動的に$my_post
を取得します。
私はこれでも問題を抱えていました(テンプレートパーツで動作するようにカスタムクエリを取得しようとしている間)。簡単な答えは次のとおりです。いいえ、テンプレート部分は通常のインクルードのようにカスタム変数を自動的には継承しません。
Get_template_part()とlocate_template()はどちらも最終的にload_template()関数を使用して実際にファイルをロードします(requireを使用)。この関数は以下の変数をグローバル化します。
$ posts、$ post、$ wp_did_header、$ wp_did_template_redirect、$ wp_query、$ wp_rewrite、$ wpdb、$ wp_version、$ wp、$ id、$ comment、$ user_ID
ただし、テンプレートパーツの内側から他のvarが使用できるようには見えません。実際のrequireは関数にラップされているので、スコープが変わるかなにか?
とにかく、私はあなたが渡す必要がある追加の変数をグローバル化してから、あなたのテンプレート部分からそれらのグローバルを呼び出してみたいと思います。
将来の参照用に私の2セントだけ、少なくともWordpress 3.5での回避策は$wp_query->query_vars
に変数を追加することです。
私はグローバルな_vk_errors
をテンプレート部分の中に必要とし、そしてget_template_part()
を呼び出す前に$wp_query->query_vars['_vk_errors'] = $_vk_errors;
をしました。
変数問題を解決する私の簡単な関数があります。 Wordpressがget_template_part()
関数で行うのと同じことをしています。コピーしてfunction.php
に貼り付けるだけです。
function getTemplatePart($slug = null, $name = null, array $params = array()) {
global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
do_action("get_template_part_{$slug}", $slug, $name);
$templates = array();
if (isset($name))
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
$_template_file = locate_template($templates, false, false);
if (is_array($wp_query->query_vars)) {
extract($wp_query->query_vars, EXTR_SKIP);
}
extract($params, EXTR_SKIP);
require($_template_file);
}
テンプレートの使用例
$params = array(
'utm_source' => 'footer'
);
while ($posts->have_posts()) {
$posts->the_post();
getTemplatePart('content', 'heighlight', $params);
}
content-heighlight.php
では、$utm_source
という名前とfooter
という値を持つ変数にアクセスできます。
Get_template_partをラップし、モデルオブジェクトをグローバル変数に格納し、後でそれをクリアするだけです。これが私たちのプロジェクトで行ってきたことです。
functions.php
$model = null; // this is a global variable
function my_get_template_part($slug, $name = null, $templateModel = null) {
global $model;
$model = $templateModel; // set the global var to the provided model object
get_template_part($slug,$name);
$model = null; // clear the global var
}
function get_model() {
global $model;
return $model;
}
メインテンプレートでの使用方法:
<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>
template-partで提供されたモデルにアクセスする:
<?php $model = get_model() ?>
こうすれば、WP開発者によって実装が変更される可能性がある場合に備えて、元のget_template_part関数を自分の関数にコピーして貼り付ける必要はありません。