Transmiterea variabilelor prin locate_template
În timp ce de obicei am folosit include
sau require
pentru întreținerea pe termen lung a codului, am început să folosesc get_template_part
și locate_template
deoarece este întotdeauna mai bine să folosim funcționalitățile integrate în WordPress.
Întrebarea mea este dacă ar trebui să fie posibilă transmiterea variabilelor prin rezultatele fie ale get_template_part
sau locate_template
?
<?php
$var = get_option( 'my-custom-option' );
get_template_part( 'custom-template-part' );
?>
În codul de mai sus, $var
ar trebui să fie afișată în șablonul personalizat, dar variabila nu pare să funcționeze. Am omis ceva sau acesta este comportamentul așteptat?
Am descoperit că acestea nu transmit variabilele în exemplul de mai sus sau când se utilizează locate_template
<?php
locate_template( 'custom-template-part.php', true );
?>

După cum MathSmath a scris, get_template() nu suportă reutilizarea variabilelor tale.
Dar locate_template() de fapt nu face nicio includere. Doar localizează un fișier pentru includere.
Deci poți folosi include pentru a face acest lucru să funcționeze exact cum te aștepți:
include(locate_template('custom-template-part.php'));
$var
din exemplul tău poate fi folosit în partea de template atunci.
O întrebare înrudită cu o explicație mai tehnică despre domeniul de aplicare al variabilelor și get_template(): Eroare la Trimiterea Formularului cu get_template_part()

Bună observație. Nu am observat că locate_template() are un parametru care permite să apelezi load_template() cu rezultatele (așa cum face get_template_part), sau doar să le returneze. Revin cu o actualizare la un proiect curent folosind această abordare...mersi!

la scurt timp după ce am postat aici, am ajuns să folosesc aceeași metodă.

21676 abordează această problemă, dar nu pare că va fi comis.

Poate greșesc, dar: locate_template()
de fapt face includerea, dacă parametrul este setat ca true
- așa cum este în întrebare. (valoarea implicită este false
, deci nu copiați versiunea din întrebare în răspunsul acceptat.) Ați putea folosi și set_query_var('var', $var);
și să folosiți get_template_part()
ca de obicei. Astfel, veți avea acces și la variabilele WordPress implicite în fișierul șablon, așa cum a menționat @MathSmath.

O soluție elegantă găsită în codex
Deci, dacă parcurgeți postări personalizate, puteți face asta:
foreach ($custom_posts as $custom_post) {
set_query_var( 'my_post', $custom_post );
get_template_part( 'content', 'part' );
}
Și în acel template, veți obține automat o variabilă $my_post
.

Acesta ar fi răspunsul corect dacă codul exemplu ar răspunde la întrebare. (Transmiterea opțiunii, nu array-ul complet de postări)

Am avut și eu probleme cu asta (în timp ce încercam să fac o interogare personalizată să funcționeze cu o parte de șablon). Răspunsul scurt este: nu, partea de șablon nu moștenește automat variabilele personalizate așa cum face un include obișnuit.
Atât get_template_part() cât și locate_template() folosesc în final funcția load_template() pentru a încărca efectiv fișierul (folosind un require). Această funcție globalizează următoarele variabile:
$posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID
Cu toate acestea, nicio altă variabilă nu pare să fie disponibilă din interiorul părții de șablon. Presupun că, deoarece require-ul real este încapsulat într-o funcție, domeniul de aplicare se schimbă sau ceva de genul?
Oricum, aș încerca să globalizez orice variabilă suplimentară pe care trebuie să o transmit, apoi să apelez la acele variabile globale din partea ta de șablon.

Doar o mică observație pentru referințe viitoare, o soluție alternativă, cel puțin în WordPress 3.5, este să adăugați variabila la $wp_query->query_vars
.
Am avut nevoie de variabila mea globală _vk_errors
în interiorul unei părți de șablon și am făcut simplu $wp_query->query_vars['_vk_errors'] = $_vk_errors;
înainte de a apela get_template_part()
.

WordPress 5.5+
Parametrul $args a fost adăugat la locate_template
https://developer.wordpress.org/reference/functions/locate_template/
Transmiterea datelor
$data = [
'foo' => 'Salut',
'bar' => ', WordPress 5.5',
];
locate_template('template-tau.php', true, true, $data);
template-tau.php
//prelucrează argumentele transmise prin $args
echo $args['foo'] . $args['bar']; // "Salut, WordPress 5.5"
// sau folosește extract($args);
extract($args);
echo $foo . $bar; // "Salut, WordPress 5.5"
locate_template
folosește load_template
, care începând cu versiunea 5.5 poate transmite argumente suplimentare șablonului.
https://developer.wordpress.org/reference/functions/load_template/
La fel și toate funcțiile de șablon care folosesc 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/

Iată funcția mea simplă care rezolvă problema variabilelor. Face același lucru ca și funcția get_template_part()
din Wordpress. Doar copiați și lipiți în 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);
}
Exemplu de utilizare în template
$params = array(
'utm_source' => 'footer'
);
while ($posts->have_posts()) {
$posts->the_post();
getTemplatePart('content', 'heighlight', $params);
}
În fișierul content-heighlight.php
este accesibilă variabila cu numele $utm_source
și valoarea footer

Poți înfășura pur și simplu funcția get_template_part, stoca un obiect model într-o variabilă globală și șterge valoarea mai târziu. Iată cum am procedat în proiectele noastre:
functions.php
$model = null; // aceasta este o variabilă globală
function my_get_template_part($slug, $name = null, $templateModel = null) {
global $model;
$model = $templateModel; // setează variabila globală la obiectul model furnizat
get_template_part($slug,$name);
$model = null; // șterge variabila globală
}
function get_model() {
global $model;
return $model;
}
Utilizare în șablonul principal:
<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>
Accesarea modelului furnizat în partea de șablon:
<?php $model = get_model() ?>
În acest fel, nu trebuie să copiezi și să lipesti funcția originală get_template_part în propria ta funcție, în cazul în care implementarea ei ar putea fi modificată ulterior de către dezvoltatorii WordPress.
