Pasando variables desde header.php a plantilla y viceversa
He definido una variable - llamémosla $header_var
, que está ubicada en el archivo header.php. Me gustaría pasar esta variable a mi archivo de plantilla (en este caso taxonomy.php).
También me gustaría poder hacer lo mismo en sentido contrario, como pasar una $template_var
desde mi taxonomy.php a header.php.
¿Es esto posible considerando que la variable no fue declarada cuando se cargó el encabezado?
He intentado usar global $header_var
pero sin éxito.
¿Alguna sugerencia?
He definido una variable - llamémosla $header_var, que se coloca en el archivo header.php. Me gustaría que esta variable se pasara a mi archivo de plantilla (en este caso taxonomy.php).
global
no es una forma muy recomendada de hacer el truco, pero funciona si lo usas correctamente: colócalo antes de definir la variable en header.php
y de nuevo antes de recuperar la variable en taxonomy.php
(después de haber llamado a get_header() para incluir header.php
)
// en header.php
global $header_var;
$header_var = 'Un valor';
// en taxonomy.php
get_header();
global $header_var;
echo $header_var; // 'Un valor'
Me gustaría poder hacer lo mismo al revés, como pasar un $template_var desde mi taxonomy.php a header.php. ¿Es esto posible dado que la variable no fue declarada una vez que se cargó el encabezado?
Es PHP, no magia ni máquina del tiempo: las reglas del tiempo aplican a WordPress como al resto del universo.
Así que, no, no puedes pasar una variable hacia atrás en el tiempo, pero usualmente, en las plantillas, incluyes header.php
llamando a get_header()
, así que si estableces una variable antes de llamar a esa función, el truco con global
también funcionará:
// en header.php
global $template_var;
echo $template_var; // 'Un valor'
// en taxonomy.php
global $template_var;
$template_var = 'Un valor'
get_header();
Sin embargo, si necesitas compartir variables entre header.php
y las plantillas, lo mejor es no declararlas ni en el header ni en las plantillas, sino en functions.php
usando action hooks para controlar cuándo deben declararse las variables.
Un hook útil es 'template_redirect'
donde tienes acceso a la consulta actual y se ejecuta antes de que se carguen header.php
y las plantillas.
Un ejemplo aproximado:
// en 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 valor de encabezado' );
if ( is_tax() || is_category() || is_tag() ) {
$shared_vars['taxonomy_var'] = 'Un valor de taxonomía';
}
}
return $shared_vars;
}
// en header.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['header_var']; // 'Un valor de encabezado'
// en taxonomy.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['taxonomy_var']; // 'Un valor de taxonomía'
En el código anterior, gracias a la palabra clave static
todo el código en la función get_my_shared_vars
usado para establecer variables se ejecuta solo una vez, así que no tienes que preocuparte por problemas de rendimiento si llamas a la función más de una vez.

WordPress 5.5+
Desde la versión 5.5.0, get_header
tiene un parámetro $args
Registro de cambios de get_header
get_header( 'foo', [ 'header_var' => 'Un valor' ] ); // Se cargará header-foo.php
/**
* O
*/
get_header( null, [ 'header_var' => 'Un valor' ] ); // Se cargará header.php
header.php
<?php echo $args['header_var']; ?>
/**
* O
*/
<?php extract($args); ?>
<?php echo $header_var; ?>
/**
* O con valores por defecto
*/
$defaults = array(
'header_var2' => 'bar',
// ...
);
extract(wp_parse_args( $args, $defaults ));
<?= $header_var ?>
<?= $header_var2 ?>

Este es un enfoque mucho mejor y más inteligente que usar una variable global. Hay algunos artículos sobre el uso de variables globales en PHP. Aquí hay uno: https://www.oreilly.com/library/view/essential-php-security/059600656X/ch01.html
