Событие template_redirect
не зря является популярным хуком в WordPress. Когда оно запускается, WordPress уже сделал свой основной запрос. Все объекты были созданы, но данные не были отправлены в браузер.
Это ваша последняя и лучшая точка для перенаправления пользователя на другой URL, но самое плохое место для загрузки альтернативного шаблона.
Неправильно
На просторах интернета можно увидеть такой говнокод для загрузки своего шаблона:
function mihdan_bad_load_template() { if ( some_condition() ) { include( SOME_PATH . '/some-custom-file.php' ); exit(); } } add_action( 'template_redirect', 'mihdan_bad_load_template' );
Главная и основная проблема этого сниппета заключается в том, что, если какой-то плагин или тема захотят использовать хук template_redirect
для редиректов, — у них ничего не получится, так как этот код прерывает исполнение PHP-сценария при помощи exit()
.
Правильно
Если вам нужно просто подключить свой альтернативный шаблон по какому-то условию — используйте хук-фильтр template_include
:
function mihdan_good_load_template( $original_template ) { if ( some_condition() ) { return SOME_PATH . '/some-custom-file.php'; } return $original_template; } add_filter( 'template_include', 'mihdan_good_load_template' );
Вы добъётесь того же эффекта, но не сломаете чужой плагин или тему.
Запомните!
Главное правило: template_redirect
— только для редиректов, template_include
— для подключения своих шаблонов.
Источник: https://www.kobzarev.com/wordpress/template_redirect-is-not-for-loading-templates/