web-dev-qa-db-fra.com

Passage de variables dans une variable de localisation

Alors que j’ai généralement utilisé include ou require seuls pour économiser la maintenance de code à long terme, j’ai commencé à utiliser get_template_part et locate_template car l’utilisation de contenus WordPress intégrés est toujours préférable.

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, le $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 );
?>
49
curtismchale

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

Mais Locate_template () infact 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 de votre exemple peut alors être utilisé dans la partie modèle.

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

59
hakre

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.

12
zionsg

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.

8
MathSmath

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 _vk_errors global à l'intérieur d'une partie de modèle et je l'ai simplement fait $wp_query->query_vars['_vk_errors'] = $_vk_errors; avant d'appeler get_template_part().

4
Pontus Carlsson

Il y a mon problème de résolution de fonction simple. Il fait 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 variable content-heighlight.php est accessible la variable nom $utm_source et la valeur footer

2
OzzyCzech

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ù sa mise en œuvre pourrait être modifiée ultérieurement par WP développeurs.

0
Cagatay Kalan