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

12 июн. 2014 г., 00:16:02
Просмотры: 23.9K
Голосов: 11

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

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

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

Я пробовал использовать глобальную $header_var, но безуспешно.

Есть ли какие-либо предложения?

0
Все ответы на вопрос 2
2
30

Я определил переменную - назовем ее $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, используемый для установки переменных, выполняется только один раз, поэтому вам не нужно беспокоиться о проблемах производительности при многократном вызове функции.

12 июн. 2014 г. 04:05:56
Комментарии

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

Benn Benn
1 дек. 2017 г. 19:14:33

Нужно объявить global в другом файле, я объявляю его в header.php и вызываю переменную напрямую.

Salem F Salem F
1 февр. 2022 г. 11:33:19
1

WordPress 5.5+

Начиная с версии 5.5.0 функция get_header имеет параметр $args

Журнал изменений get_header

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 ?>
13 окт. 2020 г. 18:40:33
Комментарии

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

Trond Trond
9 нояб. 2021 г. 13:40:12