Transmiterea variabilelor din header.php către șablon și invers
Am definit o variabilă - să o numim $header_var
, care este plasată în fișierul header.php. Aș dori ca această variabilă să fie transmisă către fișierul meu șablon (în acest caz taxonomy.php).
De asemenea, aș dori să pot face același lucru și în sens invers, cum ar fi transmiterea unei variabile $template_var
din taxonomy.php către header.php.
Este acest lucru posibil având în vedere că variabila nu a fost declarată în momentul în care header-ul a fost încărcat?
Am încercat să folosesc global $header_var
dar fără succes.
Aveți sugestii?
Am definit o variabilă - să o numim $header_var, care este plasată în fișierul header.php. Aș dori ca această variabilă să fie transmisă către fișierul meu de șablon (în acest caz taxonomy.php).
global
nu este o metodă foarte recomandată pentru a realiza acest lucru, dar funcționează dacă o folosești corect: pune-o înainte de a defini variabila în header.php
și din nou înainte de a prelua variabila în taxonomy.php
(după ce ai apelat get_header() pentru a include header.php
)
// în header.php
global $header_var;
$header_var = 'O valoare';
// în taxonomy.php
get_header();
global $header_var;
echo $header_var; // 'O valoare'
Aș dori să pot face același lucru și invers, cum ar fi transmiterea unei variabile $template_var din taxonomy.php către header.php. Este posibil acest lucru, având în vedere că variabila nu a fost declarată odată ce header-ul a fost încărcat?
Este PHP, nu magie și nici mașină a timpului: legile timpului se aplică WordPress-ului la fel ca restului universului.
Deci, nu, nu poți transmite o variabilă înapoi în timp, dar de obicei, în șabloane, incluzi header.php
prin apelarea funcției get_header()
, așadar dacă setezi o variabilă înainte de a apela acea funcție, trucul cu global va funcționa și el:
// în header.php
global $template_var;
echo $template_var; // 'O valoare'
// în taxonomy.php
global $template_var;
$template_var = 'O valoare'
get_header();
Totuși, dacă trebuie să partajezi variabile între header.php
și șabloane, cel mai bine este să nu le declari nici în header, nici în șabloane, ci în functions.php
folosind action hooks pentru a controla când variabilele trebuie declarate.
Un hook util este 'template_redirect'
unde ai acces la interogarea curentă și este declanșat înainte ca header.php
și șabloanele să fie încărcate.
Un exemplu simplu:
// în functions.php
add_action( 'template_redirect', 'get_my_shared_vars' );
function get_my_shared_vars() {
static $shared_vars = NULL;
if ( empty( $shared_vars ) ) {
$shared_vars = array( 'header_var' => 'O valoare pentru header' );
if ( is_tax() || is_category() || is_tag() ) {
$shared_vars['taxonomy_var'] = 'O valoare pentru taxonomie';
}
}
return $shared_vars;
}
// în header.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['header_var']; // 'O valoare pentru header'
// în taxonomy.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['taxonomy_var']; // 'O valoare pentru taxonomie'
În codul anterior, datorită cuvântului cheie static
, tot codul din funcția get_my_shared_vars
folosit pentru a seta variabile rulează doar o singură dată, așa că nu trebuie să-ți faci griji privind problemele de performanță dacă apelezi funcția de mai multe ori.

WordPress 5.5+
Începând cu versiunea 5.5.0, funcția get_header
are parametrul $args
jurnalul modificărilor get_header
get_header( 'foo', [ 'header_var' => 'O valoare' ] ); // se va încărca header-foo.php
/**
* SAU
*/
get_header( null, [ 'header_var' => 'O valoare' ] ); // se va încărca header.php
header.php
<?php echo $args['header_var']; ?>
/**
* SAU
*/
<?php extract($args); ?>
<?php echo $header_var; ?>
/**
* Sau cu valori implicite
*/
$defaults = array(
'header_var2' => 'bar',
// ...
);
extract(wp_parse_args( $args, $defaults ));
<?= $header_var ?>
<?= $header_var2 ?>

Aceasta este o abordare mult mai bună și mai sigură decât utilizarea unei variabile globale. Există câteva articole care discută despre folosirea variabilelor globale în PHP. Iată unul dintre ele: https://www.oreilly.com/library/view/essential-php-security/059600656X/ch01.html
