Pasando variables desde header.php a plantilla y viceversa

12 jun 2014, 00:16:02
Vistas: 23.9K
Votos: 11

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?

0
Todas las respuestas a la pregunta 2
2
30

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.

12 jun 2014 04:05:56
Comentarios

Si pudiera votaría 1000 veces. Esto debería estar en la documentación de plantillas de WP

Benn Benn
1 dic 2017 19:14:33

Es necesario declarar global en el otro archivo donde lo declaro. En header.php llamo la variable directamente.

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

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 ?>
13 oct 2020 18:40:33
Comentarios

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

Trond Trond
9 nov 2021 13:40:12