web-dev-qa-db-fra.com

Passer des variables de header.php au template et vice versa

J'ai défini une variable - appelons-la $header_var, qui est placée dans le fichier header.php. Je voudrais que cette variable soit transmise à mon fichier de modèle (dans ce cas taxonomy.php).

Aussi, j'aimerais pouvoir faire la même chose dans l'autre sens, comme passer un $template_var de taxonomy.php à header.php.

Est-ce même possible puisque la variable n'a pas été déclarée une fois l'en-tête chargé?

J'ai essayé d'utiliser $header_var global mais sans chance.

Aucune suggestion?

8
user54079

J'ai défini une variable - appelons-la $ header_var, qui est placée dans le fichier header.php. Je voudrais que cette variable soit transmise à mon fichier de modèle (dans ce cas taxonomy.php).

global n’est pas une méthode très recommandée, mais cela fonctionne si vous l’utilisez correctement: mettez-le avant de définir la variable dans header.php et encore avant de récupérer la variable dans taxonomy.php (après avoir appelé get_header ( ) à inclure header.php)

// in header.php
global $header_var;
$header_var = 'A value';

// in taxonomy.php
get_header();
global $header_var;
echo $header_var; // 'A value'

J'aimerais pouvoir faire la même chose dans l'autre sens, comme passer un $ template_var de mon taxonomy.php à header.php. Est-ce même possible puisque la variable n'a pas été déclarée une fois l'en-tête chargé?

C'est du PHP, pas de la magie, ni de la machine à voyager dans le temps: les règles de temps s'appliquent à WordPress, comme au au reste de l'univers .

Donc, non, vous ne pouvez pas renvoyer une variable dans le passé, mais généralement, dans les modèles, vous incluez header.php en appelant get_header(). Ainsi, si vous définissez une variable before en appelant cette fonction, le global fonctionnera aussi:

// in header.php
global $template_var;
echo $template_var; // 'A value'

// in taxonomy.php
global $template_var;
$template_var = 'A value'
get_header();

Cependant, si vous devez partager des variables dans header.php et des modèles, la meilleure chose à faire est de ne pas les déclarer dans l'en-tête ni dans les modèles, mais dans functions.php en utilisant action hooks pour contrôler when les variables doivent être déclaré.

Un raccord utile à est 'template_redirect' où vous avez accès à la requête en cours et qui est déclenché avant header.php et les modèles sont chargés.

Un exemple approximatif:

// 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' => 'An header value' );
     if ( is_tax() || is_category() || is_tag() ) {
       $shared_vars['taxonomy_var'] = 'A taxonomy value';
     }
   }
   return $shared_vars;
}


// in header.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['header_var']; // 'An header value'

// in taxonomy.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['taxonomy_var']; // 'A taxonomy value'

Dans le code précédent, grâce au mot clé static, tout le code de la fonction get_my_shared_vars utilisée pour définir les variables ne s'exécute qu'une seule fois. Vous n'avez donc pas à vous soucier des problèmes de performances si vous appelez la fonction plusieurs fois.

18
gmazzap