Передача переменных из header.php в шаблон и обратно

9

Я определил переменную - давайте назовем ее $header_var, которая находится в файле header.php. Я хотел бы, чтобы эта переменная была передана в мой файл шаблона (в данном случае таксономия.php).

Также я хотел бы иметь возможность сделать то же самое наоборот, например, передать $template_varиз моего таксономии. Php в header.php.

Возможно ли это, поскольку переменная не была объявлена ​​после загрузки заголовка?

Я пытался использовать глобальный, $header_varно без удачи.

Какие-либо предложения?

user54079
источник

Ответы:

24

Я определил переменную - назовем ее $ header_var, которая находится в файле header.php. Я хотел бы, чтобы эта переменная была передана в мой файл шаблона (в данном случае таксономия.php).

globalне очень рекомендуемый способ сделать трюк, но он работает, если вы используете его правильно: поместите его перед тем, как определить переменную в, header.php и снова перед извлечением переменной в taxonomy.php(после вызова get_header () для включения 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'

Я хотел бы иметь возможность сделать то же самое с другой стороны, например, передать $ template_var из моего таксономии.php в header.php. Возможно ли это, поскольку переменная не была объявлена ​​после загрузки заголовка?

Это PHP, а не магия или машина времени: правила времени применяются к WordPress, как и ко всей вселенной .

Итак, нет, вы не можете передать переменную вовремя, но обычно в шаблоны вы включаете header.phpвызов, get_header()поэтому, если вы устанавливаете переменную перед вызовом этой функции, глобальный трюк тоже будет работать:

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

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

Однако, если вам нужно совместно использовать переменные header.phpи шаблоны, лучше всего не объявлять их ни в заголовке, ни в шаблонах, а functions.phpиспользовать хуки действий для управления тем, когда переменные должны быть объявлены.

Полезный прием - это 'template_redirect'когда у вас есть доступ к текущему запросу, и он запускается раньше, header.phpа шаблоны загружаются.

Грубый пример:

// 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'

В предыдущем коде благодаря staticключевому слову весь код в get_my_shared_varsфункции, используемый для установки переменных, запускается только один раз, поэтому вам не нужно беспокоиться о проблемах производительности, если вызываете функцию более одного раза.

Gmazzap
источник
2
Если бы я мог, я бы проголосовал за 1000. Это должно быть в шаблонах документов WP
Бенн