Работают 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 в контексте, где доступа к этим переменным нет.