Locate_templateを介して変数を渡す


50

長期的なコードメンテナンスを節約するために通常includeまたはrequire単独で使用していますがget_template_partlocate_template組み込みのWordPressのものを使用するのが常に最適です。

私の質問は、変数のいずれか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 );
?>

回答:


62

同様MathSmathが書いたget_template()は、変数の再利用をサポートしていません。

ただし、locate_template() infactはまったく含まれません。含めるファイルを見つけるだけです。

したがって、includeを使用して、期待どおりにこれを機能させることができます。

include(locate_template('custom-template-part.php'));

$var あなたの例からテンプレート部分で使用することができます。

変数スコープとget_template()のより技術的な説明と関連する質問:get_template_part()によるフォーム送信エラー


良い電話。Locate_template()には、オプションで結果(get_template_partが行う)でload_template()を呼び出したり、単にそれらを返すことができるパラメーターがあることに気付きませんでした。このアプローチを使用してコードを更新するために現在のプロジェクトにループバックしています...ありがとう!
MathSmath

ここに投稿してまもなく、同じ方法を使用することになりました。
curtismchale

21676はこれに対処しますが、コミットされるようには見えません。
イアン・ダン

間違っているかもしれませんが、パラメータが質問のように-as として設定されている場合、locate_template()infact 包含を行いますtrue。(デフォルトはfalseですので、質問のバージョンを受け入れられた回答に貼り付けないでください。)また、通常どおりset_query_var('var', $var);使用して使用することもできますget_template_part()。次に、@ MathSmathが述べたように、テンプレートファイル内でアクセス可能なデフォルトのWorpdress変数もあります。
ジョナスランドマン

13

コーデックスにあるきちんとしたソリューション

したがって、カスタム投稿をループしている場合、これを行うことができます:

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

そして、そのテンプレート自体では、自動的にを取得し$my_postます。


サンプルコードが質問に答えている場合、これが正しい答えになります。(渡すオプション、完全な投稿配列ではありません)
ジョナスランドマン

これは、含まれているテンプレートに追加情報を渡すために美しく機能します。またwc_get_template_part、WooCommerce でも機能し、デフォルトのWPを拡張します。
ナブラウン

8

私もこれに問題があります(テンプレートパーツで動作するカスタムクエリを取得しようとしている間)。簡単な答えは:いいえ、テンプレートパーツは通常のインクルードのようにカスタム変数を自動的に継承しません。

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

ただし、テンプレートパーツ内から他の変数は使用できないようです。実際のrequireは関数にラップされているので、スコープが変わったのでしょうか?

とにかく、渡す必要のある追加の変数をグローバル化し、テンプレートパーツからそれらのグローバルを呼び出してみます。


4

将来の参考のためにちょうど2セントです。少なくともWordpress 3.5での回避策は、変数をに追加することです$wp_query->query_vars

_vk_errorsテンプレートパーツ内にグローバルが必要で、$wp_query->query_vars['_vk_errors'] = $_vk_errors;呼び出す前に必要でしたget_template_part()


2

変数の問題を解決する簡単な関数があります。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


興味深い機能。通常、すべてのグローバル変数とクエリ変数は通常のテンプレートファイルでアクセス可能ですか?
クリスチャン14

0

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関数を独自の関数にコピーして貼り付ける必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.