@not_cool

Почему шаблон, подключенный через get_template_part не имеет доступа к родительским переменным?

Если подключить шаблон через get_template_part("template-name"), то будут вызваны функции
get_template_part("template-name") -> locate_template( $template-path, true, false )-> load_template( $template-path, false ) -> require( $template_file ), при этом переменные, доступные в месте вызова будут неопределены внутри шаблона. А если вызвать require 'full-template-path'или require( locate_template( 'template-path' ) ); то переменные будут доступны, хотя используется тот же require?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
SeaInside
@SeaInside
15 лет пилю все эти штуки
Работают require и include следующим образом: просто вставляют содержимое файла из переданного пути в то место, где его вызвали. Таким образом, подключаемый файл получает контекст файла, который его вставил. Это просто перенос кода из одного места в другое.

Когда вы вызываете функцию - создаётся новый контекст, в котором нет явного доступа к родительскому контексту (области видимости).
$testVar = 123;
function testFunc() {
  var_dump($testVar); // будет undefined
}
testFunc();


Можно получить доступ к конкретным вещам из глобального контекста с помощью global [...vars]
$testVar = 123;
$anotherVar = 123;
function testFunc() {
  global $testVar;
  var_dump($testVar); // будет 123
  var_dump($anotherVar); // будет undefined
}
testFunc();


А теперь посмотрим на код функции load_template.
Видите что-то знакомое, похожее на предыдущий пример?

То есть, простой ответ на вопрос: потому что вы вызываете require в контексте файла, в котором объявлены переменные, а get_template_part вызывает require в контексте, где доступа к этим переменным нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы