Passaggio di variabili attraverso locate_template
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 );
?>

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()

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!

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

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.

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
.

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

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.

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()
.

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/

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

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.
