web-dev-qa-db-ja.com

Locate_templateを介して変数を渡る

私はincludeまたはrequireを長期間のコードメンテナンスを節約するために自分自身で使うのが普通でしたが、私はget_template_partlocate_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 );
?>
49
curtismchale

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

しかし locate_template() infactはまったくインクルードしません。それは包含のためのファイルを見つけるだけです。

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

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

あなたの例の$varはその時テンプレート部分で使うことができます。

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

59
hakre

codex にあるきちんとした解決策

あなたがカスタム投稿を通してループしているのであれば、あなたはこれを行うことができます:

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

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

12
zionsg

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

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は関数にラップされているので、スコープが変わるかなにか?

とにかく、私はあなたが渡す必要がある追加の変数をグローバル化してから、あなたのテンプレート部分からそれらのグローバルを呼び出してみたいと思います。

8
MathSmath

将来の参照用に私の2セントだけ、少なくともWordpress 3.5での回避策は$wp_query->query_varsに変数を追加することです。

私はグローバルな_vk_errorsをテンプレート部分の中に必要とし、そしてget_template_part()を呼び出す前に$wp_query->query_vars['_vk_errors'] = $_vk_errors;をしました。

4
Pontus Carlsson

変数問題を解決する私の簡単な関数があります。 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という値を持つ変数にアクセスできます。

2
OzzyCzech

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

0
Cagatay Kalan