Passage de variables via Locate_template

50

Bien que je l'utilise généralement includeou requireseul pour économiser la maintenance de code à long terme, j'ai commencé à l'utiliser get_template_partet locate_templateutiliser des éléments WordPress intégrés est toujours préférable.

Ma question est la suivante: êtes-vous censé être capable de transmettre des variables aux résultats de l'un get_template_partou de l'autre locate_template?

<?php
$var = get_option( 'my-custom-option' );

get_template_part( 'custom-template-part' );
?>

Dans le code ci-dessus, le $varserait imprimé dans le modèle personnalisé, mais la variable ne semble pas fonctionner. Est-ce que je manque quelque chose ou est ce comportement attendu?

J'ai constaté qu'ils ne passaient pas dans l'instance ci-dessus ou lors de l'utilisation de Locate_template

<?php
locate_template( 'custom-template-part.php', true );
?>
curtismchale
la source

Réponses:

62

Comme MathSmath l'a écrit , get_template () ne prend pas en charge la réutilisation de vos variables.

Mais localiser_template () en fait ne fait aucune inclusion. Il ne fait que localiser un fichier à inclure.

Vous pouvez donc utiliser include pour que cela fonctionne comme vous le souhaitiez:

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

$var à partir de votre exemple peut être utilisé dans la partie modèle alors.

Une question connexe avec une explication plus technique de l'étendue de la variable et de get_template (): Erreur d'envoi de formulaire avec get_template_part ()

hakre
la source
Bon appel. Je n'ai pas remarqué que position_template () possède un paramètre qui vous permet d'appeler éventuellement load_template () avec les résultats (ce que fait get_template_part), ou de simplement les renvoyer. Je reviens sur un projet en cours pour mettre à jour le code en utilisant cette approche ... merci!
MathSmath
Peu de temps après avoir posté ici, j'ai utilisé la même méthode.
curtismchale
21676 résout ce problème, mais il ne semble pas que cela sera commis.
Ian Dunn
Peut-être que je me trompe, mais que: locate_template()en fait, l' inclusion est faite, si le paramètre est défini comme true-as dans la question. (Par défaut false, ne collez pas la version de la question dans la réponse acceptée.) Vous pouvez également simplement utiliser set_query_var('var', $var);et utiliser votre get_template_part()comme d'habitude. Ensuite, vous avez également les variables Worpdress par défaut accessibles dans le fichier modèle, comme indiqué par @MathSmath.
Jonas Lundman
13

Une solution soignée trouvée dans le codex

Donc, si vous parcourez des publications personnalisées, vous pouvez le faire:

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

Et dans ce modèle, vous obtiendrez automatiquement un $my_post.

Zionsg
la source
Ce serait la bonne réponse si l'exemple de code répondait à la question. (Option de passage, tableau des messages non complet)
Jonas Lundman
Cela fonctionne à merveille pour transmettre des informations supplémentaires au modèle inclus. Cela fonctionne aussi pour wc_get_template_partWooCommerce qui étend sans aucun doute WP par défaut.
nabrown
8

J'ai également eu des problèmes avec cela (en essayant de faire en sorte qu'une requête personnalisée fonctionne avec un élément de modèle). La réponse courte est: non, la partie de modèle n'hérite pas automatiquement des vars personnalisés comme le ferait une inclusion classique.

Les méthodes get_template_part () et local_template () utilisent finalement la fonction load_template () pour charger le fichier (à l'aide d'un require). Cette fonction permet de globaliser les vars suivants:

$ posts, $ post, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comment, $ user_ID

Cependant, aucun autre fichier ne semble être disponible à l'intérieur de la partie modèle. Je suppose que puisque l'exigence réelle est encapsulée dans une fonction, la portée change ou quelque chose de ce genre?

Quoi qu'il en soit, j'essayerais de globaliser tous les vars supplémentaires que vous devez transmettre, puis d'appeler ces globals à partir de votre partie de modèle.

MathSmath
la source
4

Juste mes deux centimes pour les références futures, une solution au moins dans Wordpress 3.5 consiste à ajouter la variable à $wp_query->query_vars.

J'avais besoin de mon global _vk_errorsdans une partie de modèle et juste $wp_query->query_vars['_vk_errors'] = $_vk_errors;avant d'appeler get_template_part().

Pontus Carlsson
la source
2

Il y a mon problème de résolution de fonction simple. C'est faire la même chose que Wordpress en get_template_part()fonction. Il suffit de copier et coller pourfunction.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);
}

Exemple d'utilisation dans le modèle

$params = array(
    'utm_source' => 'footer'
);
while ($posts->have_posts()) {
    $posts->the_post(); 
    getTemplatePart('content', 'heighlight', $params);
}

Dans la content-heighlight.phpvariable est accessible avec nom $utm_sourceet valeurfooter

OzzyCzech
la source
Fonction intéressante. Tous les globals et les vars de requête sont-ils généralement accessibles dans des fichiers de modèle normaux?
christian
0

Vous pouvez simplement envelopper get_template_part, stocker un objet de modèle dans une variable globale et l'effacer ultérieurement. Voici comment nous en sommes dans nos projets:

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;
}

Utilisation dans le template principal:

<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>

Accéder au modèle fourni dans la partie modèle:

<?php $model = get_model() ?>

De cette façon, vous n'avez pas besoin de copier-coller la fonction get_template_part d'origine dans votre propre fonction au cas où son implémentation pourrait être modifiée ultérieurement par les développeurs WP.

Cagatay Kalan
la source