Passage de variables à travers le modèle positionner

48

Bien que j'utilise généralement include ou require pour économiser la maintenance de code à long terme, j'ai commencé à utiliser get_template_part et locate_template , car il est toujours préférable d'utiliser des éléments WordPress intégrés.

Ma question est la suivante: êtes-vous censé pouvoir transmettre des variables aux résultats de get_template_part ou de locate_template ?

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

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

Dans le code ci-dessus, $var serait 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 );
?>
    
posée curtismchale 23.11.2010 - 23:07
la source

6 réponses

58

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

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

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

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

$var de votre exemple peut être utilisé dans la partie modèle, puis.

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

    
réponse donnée hakre 24.11.2010 - 00:38
la source
10

Une solution intéressante trouvée dans le codex

.

Ainsi, si vous parcourez des publications personnalisées, procédez comme suit:

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 .

    
réponse donnée zionsg 07.01.2016 - 12:04
la source
8

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

get_template_part () et Locate_template () utilisent finalement la fonction load_template () pour charger le fichier (en utilisant une exigence). 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 la demande réelle est encapsulée dans une fonction, la portée change ou quelque chose de ce genre?

Anyhoo, j'essayais de globaliser tous les vars supplémentaires que vous devez transmettre, puis d'appeler ces globals à partir de votre partie modèle.

    
réponse donnée MathSmath 23.11.2010 - 23:30
la source
4

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 _vk_errors global dans une partie de modèle et je faisais juste $wp_query->query_vars['_vk_errors'] = $_vk_errors; avant d'appeler get_template_part() .

    
réponse donnée Pontus Carlsson 08.01.2013 - 14:58
la source
2

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

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.php est une variable accessible portant le nom $utm_source et la valeur footer

    
réponse donnée OzzyCzech 17.06.2013 - 16:12
la source
0

Vous pouvez simplement envelopper l'objet 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 modèle principal:

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

Accès au modèle fourni dans la partie modèle:

<?php $model = get_model() ?>

De cette façon, vous n’avez pas à copier & collez 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.

    
réponse donnée Cagatay Kalan 10.09.2016 - 04:30
la source

Lire d'autres questions sur les étiquettes