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?

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.


2
Si je le pouvais, je voterais 1000. Cela devrait être dans les documents du modèle WP
Benn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.