Передача переменных из header.php в шаблон и наоборот
Я определил переменную - назовем ее $header_var
, которая находится в файле header.php. Я хотел бы передать эту переменную в файл шаблона (в данном случае taxonomy.php).
Также я хотел бы иметь возможность делать то же самое в обратном направлении, например, передавать $template_var
из моего taxonomy.php в header.php.
Возможно ли это, учитывая, что переменная не была объявлена на момент загрузки header?
Я пробовал использовать глобальную $header_var
, но безуспешно.
Есть ли какие-либо предложения?

Я определил переменную - назовем ее $header_var, которая размещена в файле header.php. Я хочу, чтобы эта переменная передавалась в мой файл шаблона (в данном случае taxonomy.php).
Использование global
- не самый рекомендуемый способ, но он работает, если использовать его правильно: объявите его перед определением переменной в header.php
и снова перед получением переменной в taxonomy.php
(после вызова get_header() для включения header.php
)
// в header.php
global $header_var;
$header_var = 'Значение';
// в taxonomy.php
get_header();
global $header_var;
echo $header_var; // 'Значение'
Я хотел бы иметь возможность сделать то же самое в обратном направлении, например передать переменную $template_var из моего taxonomy.php в header.php. Возможно ли это, учитывая что переменная не была объявлена на момент загрузки шапки?
Это PHP, а не магия и не машина времени: законы времени применимы к WordPress так же, как и к остальной вселенной.
Так что нет, вы не можете передать переменную назад во времени, но обычно в шаблонах вы подключаете header.php
через вызов get_header()
, поэтому если вы установите переменную до вызова этой функции, глобальный трюк тоже сработает:
// в header.php
global $template_var;
echo $template_var; // 'Значение'
// в taxonomy.php
global $template_var;
$template_var = 'Значение'
get_header();
Однако, если вам нужно обмениваться переменными между header.php
и шаблонами, лучше всего объявлять их не в шапке и не в шаблонах, а в functions.php
, используя хуки действий, чтобы контролировать когда переменные должны быть объявлены.
Полезным хуком является 'template_redirect'
, где у вас есть доступ к текущему запросу, и он срабатывает до загрузки header.php
и шаблонов.
Грубый пример:
// в 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' => 'Значение для шапки' );
if ( is_tax() || is_category() || is_tag() ) {
$shared_vars['taxonomy_var'] = 'Значение для таксономии';
}
}
return $shared_vars;
}
// в header.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['header_var']; // 'Значение для шапки'
// в taxonomy.php
$shared_vars = get_my_shared_vars();
echo $shared_vars['taxonomy_var']; // 'Значение для таксономии'
В предыдущем коде, благодаря ключевому слову static
весь код в функции get_my_shared_vars
, используемый для установки переменных, выполняется только один раз, поэтому вам не нужно беспокоиться о проблемах производительности при многократном вызове функции.

WordPress 5.5+
Начиная с версии 5.5.0 функция get_header
имеет параметр $args
get_header( 'foo', [ 'header_var' => 'Значение' ] ); // Будет загружен header-foo.php
/**
* ИЛИ
*/
get_header( null, [ 'header_var' => 'Значение' ] ); // Будет загружен header.php
header.php
<?php echo $args['header_var']; ?>
/**
* ИЛИ
*/
<?php extract($args); ?>
<?php echo $header_var; ?>
/**
* Или с значениями по умолчанию
*/
$defaults = array(
'header_var2' => 'bar',
// ...
);
extract(wp_parse_args( $args, $defaults ));
<?= $header_var ?>
<?= $header_var2 ?>

Это гораздо лучший и более удобный подход, чем использование глобальной переменной. Существуют статьи о применении глобальных переменных в PHP. Вот одна из них: https://www.oreilly.com/library/view/essential-php-security/059600656X/ch01.html
