Transmiterea variabilelor din header.php către șablon și invers

12 iun. 2014, 00:16:02
Vizualizări: 23.9K
Voturi: 11

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?

0
Toate răspunsurile la întrebare 2
2
30

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.

12 iun. 2014 04:05:56
Comentarii

Dacă aș putea, aș vota de 1000 de ori. Acest lucru ar trebui să fie în documentația pentru șabloanele WP

Benn Benn
1 dec. 2017 19:14:33

Este necesar să declare global în celălalt fișier în care l-am declarat, în header.php și să apelez variabila direct.

Salem F Salem F
1 feb. 2022 11:33:19
1

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 ?>
13 oct. 2020 18:40:33
Comentarii

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

Trond Trond
9 nov. 2021 13:40:12