Passer des variables de header.php au modèle et vice-versa

9

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

J'aimerais aussi pouvoir faire la même chose dans l'autre sens, comme passer un $template_varde 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é?

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

Aucune suggestion?

user54079
la source

Réponses:

24

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

globaln'est pas un moyen très recommandé de faire l'affaire, mais cela fonctionne si vous l'utilisez correctement: mettez-le avant pour 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 () pour l'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'

Je voudrais 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 PHP, pas magique ni machine à remonter le temps: les règles de temps s'appliquent à WordPress comme au reste de l'univers .

Donc, non, vous ne pouvez pas transmettre une variable dans le temps, mais généralement, dans les modèles, vous incluez header.phpen appelant get_header()donc si vous définissez une variable avant d' appeler cette fonction, l' astuce globale fonctionnera également:

// 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 header.phpet 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 en functions.phputilisant des hooks d'action pour contrôler quand les variables doivent être déclarées.

Un point d'ancrage utile est l' 'template_redirect'endroit où vous avez accès à la requête actuelle et elle est déclenchée avant header.phpet les modèles sont chargés.

Un exemple grossier:

// 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 staticmot clé, tout le code dans la get_my_shared_varsfonction utilisé 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 plus d'une fois.

gmazzap
la source
2
Si je le pouvais, je voterais 1000. Cela devrait être dans les documents du modèle WP
Benn