Passaggio di variabili da header.php al template e viceversa

12 giu 2014, 00:16:02
Visualizzazioni: 23.9K
Voti: 11

Ho definito una variabile - chiamiamola $header_var, che si trova nel file header.php. Vorrei che questa variabile fosse passata al mio file template (in questo caso taxonomy.php).

Inoltre, vorrei poter fare lo stesso anche nell'altro verso, come passare una $template_var dal mio taxonomy.php a header.php.

È possibile farlo considerando che la variabile non era dichiarata quando l'header è stato caricato?

Ho provato a usare global $header_var ma senza successo.

Qualche suggerimento?

0
Tutte le risposte alla domanda 2
2
30

Ho definito una variabile - chiamiamola $header_var, che si trova nel file header.php. Vorrei che questa variabile fosse passata al mio file template (in questo caso taxonomy.php).

L'uso di global non è il modo più raccomandato per ottenere questo risultato, ma funziona se usato correttamente: inseriscilo prima di definire la variabile in header.php e di nuovo prima di recuperare la variabile in taxonomy.php (dopo aver chiamato get_header() per includere header.php)

// in header.php
global $header_var;
$header_var = 'Un valore';

// in taxonomy.php
get_header();
global $header_var;
echo $header_var; // 'Un valore'

Vorrei poter fare la stessa cosa nell'altro senso, ad esempio passare una $template_var dal mio taxonomy.php a header.php. È possibile dato che la variabile non era dichiarata quando l'header è stato caricato?

È PHP, non magia né macchina del tempo: le regole temporali si applicano a WordPress come al resto dell'universo.

Quindi no, non puoi passare una variabile indietro nel tempo, ma solitamente, nei template, includi header.php chiamando get_header(), quindi se imposti una variabile prima di chiamare quella funzione, il trucco del globale funzionerà comunque:

// in header.php
global $template_var;
echo $template_var; // 'Un valore'

// in taxonomy.php
global $template_var;
$template_var = 'Un valore'
get_header();

Tuttavia, se hai bisogno di condividere variabili tra header.php e i template, la cosa migliore da fare è non dichiararle né nell'header né nei template, ma in functions.php utilizzando gli action hooks per controllare quando le variabili devono essere dichiarate.

Un hook utile è 'template_redirect' dove hai accesso alla query corrente e viene attivato prima che header.php e i template vengano caricati.

Un esempio approssimativo:

// in 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' => 'Un valore per l\'header' );
     if ( is_tax() || is_category() || is_tag() ) {
       $shared_vars['taxonomy_var'] = 'Un valore per la tassonomia';
     }
   }
   return $shared_vars;
}


// in header.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['header_var']; // 'Un valore per l\'header'

// in taxonomy.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['taxonomy_var']; // 'Un valore per la tassonomia'

Nel codice precedente, grazie alla parola chiave static tutto il codice nella funzione get_my_shared_vars utilizzato per impostare le variabili viene eseguito solo una volta, quindi non devi preoccuparti di problemi di prestazioni se chiami la funzione più di una volta.

12 giu 2014 04:05:56
Commenti

Se potessi voterei 1000 volte. Questo dovrebbe essere nella documentazione dei template di WP

Benn Benn
1 dic 2017 19:14:33

Devo dichiarare la variabile globale nell'altro file dove la dichiaro, in questo caso header.php, e richiamare la variabile direttamente.

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

WordPress 5.5+

A partire dalla versione 5.5.0 get_header accetta il parametro $args

Changelog di get_header

get_header( 'foo', [ 'header_var' => 'Un valore' ] ); // verrà caricato header-foo.php

/**
 * OPPURE
 */

get_header( null, [ 'header_var' => 'Un valore' ] ); // verrà caricato header.php

header.php

<?php echo $args['header_var']; ?>

/**
 * OPPURE
 */

<?php extract($args); ?>
<?php echo $header_var; ?>

/**
 * Oppure con valori predefiniti
 */

$defaults = array( 
    'header_var2' => 'bar',
    // ...
);
extract(wp_parse_args( $args, $defaults ));

<?= $header_var ?>
<?= $header_var2 ?>
13 ott 2020 18:40:33
Commenti

Questo è un approccio molto migliore e più pulito rispetto all'utilizzo di una variabile globale. Ci sono alcuni articoli che parlano dell'uso di variabili globali in PHP. Eccone uno: https://www.oreilly.com/library/view/essential-php-security/059600656X/ch01.html

Trond Trond
9 nov 2021 13:40:12