Passaggio di variabili attraverso locate_template

24 nov 2010, 00:07:09
Visualizzazioni: 52.8K
Voti: 56

Mentre tipicamente ho utilizzato include o require per la manutenzione del codice a lungo termine, ho iniziato a utilizzare get_template_part e locate_template poiché utilizzare le funzionalità integrate di WordPress è sempre la scelta migliore.

La mia domanda è: si dovrebbe essere in grado di passare variabili attraverso i risultati di get_template_part o locate_template?

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

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

Nel codice sopra, la variabile $var dovrebbe essere stampata all'interno del template personalizzato ma la variabile non sembra funzionare. Mi sto perdendo qualcosa o questo è il comportamento previsto?

Ho scoperto che non passano nel caso sopra o quando si utilizza locate_template

<?php
locate_template( 'custom-template-part.php', true );
?>
0
Tutte le risposte alla domanda 7
4
66

Come ha scritto MathSmath, get_template() non supporta il riutilizzo delle tue variabili.

Ma locate_template() in realtà non effettua alcuna inclusione. Si limita a individuare un file da includere.

Quindi puoi utilizzare include per far funzionare tutto come ti aspetti:

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

$var del tuo esempio potrà quindi essere utilizzato nella parte di template.

Una domanda correlata con una spiegazione più tecnica sull'ambito delle variabili e get_template(): Errore nell'Invio del Modulo con get_template_part()

24 nov 2010 01:38:15
Commenti

Ottima osservazione. Non avevo notato che locate_template() ha un parametro che permette opzionalmente di chiamare load_template() con i risultati (cosa che fa get_template_part), o semplicemente restituirli. Sto aggiornando il codice in un progetto corrente per utilizzare questo approccio... grazie!

MathSmath MathSmath
24 nov 2010 20:07:38

poco dopo aver postato qui ho finito per usare lo stesso metodo.

curtismchale curtismchale
24 nov 2010 23:22:40

21676 affronta questo problema, ma non sembra che verrà approvato.

Ian Dunn Ian Dunn
19 feb 2013 21:05:43

Forse mi sbaglio ma: locate_template() in effetti fa l'inclusione, se il parametro è impostato come true - come nella domanda. (il default è false, quindi non incollare la versione della domanda nella risposta accettata.) Potresti anche semplicemente usare set_query_var('var', $var); e usare il tuo get_template_part() normalmente. In questo modo avrai anche le variabili predefinite di Worpdress accessibili all'interno del file template, come menzionato da @MathSmath.

Jonas Lundman Jonas Lundman
7 ott 2017 17:29:21
2
14

Una soluzione elegante trovata nel codex

Quindi, se stai iterando attraverso post personalizzati, puoi fare così:

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

E in quel template stesso, otterrai automaticamente una variabile $my_post.

7 gen 2016 13:04:24
Commenti

Questa sarebbe la risposta corretta se il codice di esempio rispondesse alla domanda. (Passaggio dell'opzione, non l'array completo dei post)

Jonas Lundman Jonas Lundman
7 ott 2017 17:36:57

Funziona perfettamente per passare informazioni aggiuntive al template incluso. Funziona anche con wc_get_template_part in WooCommerce che senza dubbio estende la WP predefinita.

nabrown nabrown
3 mag 2019 22:00:21
0

Anch'io ho avuto problemi con questo (mentre cercavo di far funzionare una query personalizzata con un template part). La risposta breve è: no, il template part non eredita automaticamente le variabili personalizzate come farebbe un normale include.

Sia get_template_part() che locate_template() utilizzano alla fine la funzione load_template() per caricare effettivamente il file (usando un require). Questa funzione rende globali le seguenti variabili:

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

Tuttavia, nessun'altra variabile risulta disponibile all'interno del template part. Immagino che poiché il require effettivo è racchiuso in una funzione, l'ambito di visibilità cambi o qualcosa del genere?

Comunque, proverei a rendere globali le variabili aggiuntive che devi passare, per poi richiamare quelle globali dal tuo template part.

24 nov 2010 00:30:12
0

Giusto il mio contributo per future referenze, una soluzione alternativa almeno in WordPress 3.5 è aggiungere la variabile a $wp_query->query_vars.

Avevo bisogno della mia variabile globale _vk_errors all'interno di un template part e ho semplicemente fatto $wp_query->query_vars['_vk_errors'] = $_vk_errors; prima di chiamare get_template_part().

8 gen 2013 15:58:39
0

Wordpress 5.5+

Il parametro $args è stato aggiunto a locate_template https://developer.wordpress.org/reference/functions/locate_template/

Passare dati

$data = [
  'foo' => 'Ciao',
  'bar' => ', Wordpress 5.5',
];
locate_template('tuo-template.php', true, true, $data);

tuo-template.php

// gestisci gli argomenti passati tramite $args
echo $args['foo'] . $args['bar']; // "Ciao, Wordpress 5.5"
// oppure usa extract($args);
extract($args);
echo $foo . $bar; // "Ciao, Wordpress 5.5"

locate_template utilizza load_template, che dalla versione 5.5 può passare argomenti aggiuntivi al template.

https://developer.wordpress.org/reference/functions/load_template/

Lo stesso vale per tutte le funzioni template che usano locate_template:

get_header, get_footer, get_sidebar, get_template_part.

https://developer.wordpress.org/reference/functions/get_header/ https://developer.wordpress.org/reference/functions/get_footer/ https://developer.wordpress.org/reference/functions/get_sidebar/ https://developer.wordpress.org/reference/functions/get_template_part/

27 ago 2020 23:14:40
1

Ecco la mia semplice funzione per risolvere il problema delle variabili. Fa la stessa cosa che fa WordPress con la funzione get_template_part(). Basta copiare e incollare nel file 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);
}

Esempio di utilizzo nel template

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

Nel file content-heighlight.php sarà accessibile la variabile con nome $utm_source e valore footer

17 giu 2013 17:12:39
Commenti

Funzione interessante. Tutte le variabili globali e le query vars sono solitamente accessibili nei normali file template?

christian christian
4 dic 2014 01:09:42
0

Puoi semplicemente racchiudere il get_template_part, memorizzare un oggetto modello in una variabile globale e cancellarlo in seguito. Ecco come abbiamo fatto nei nostri progetti:

functions.php

$model = null; // questa è una variabile globale
function my_get_template_part($slug, $name = null, $templateModel = null) {
    global $model;
    $model = $templateModel; // imposta la variabile globale all'oggetto modello fornito
    get_template_part($slug,$name); 
    $model = null; // cancella la variabile globale
}

function get_model() {
    global $model;
    return $model;
}

Utilizzo nel template principale:

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

Accesso al modello fornito nel template-part:

<?php $model = get_model() ?>

In questo modo, non devi copiare e incollare la funzione originale get_template_part nella tua funzione, nel caso in cui la sua implementazione venga modificata in seguito dagli sviluppatori di WordPress.

10 set 2016 05:30:11