Хук template_redirect
в WordPress срабатывает перед тем, как WordPress определяет, какой шаблон использовать для вывода контента. Он позволяет выполнять перенаправления, проверив условия текущего запроса. Этот хук часто используется, когда нужно отправить пользователя на другую страницу, основываясь на состоянии входа, типе страницы, категории или других параметрах.
do_action( ‘template_redirect’ )
Хук template_redirect
особенно полезен, если требуется перенаправить пользователя перед выводом контента, но с уже известными данными о запросе. Важно помнить, что данный хук не предназначен для подмены шаблона страницы — для этого лучше подходит хук template_include
.
Пример 1: Перенаправление с главной страницы на страницу «Dashboard»
Чтобы перенаправить пользователей с главной страницы сайта на страницу «Dashboard», можно использовать следующий код:
function redirect_home_to_dashboard() {
if (is_front_page()) {
wp_redirect(home_url('/dashboard/'));
exit;
}
}
add_action('template_redirect', 'redirect_home_to_dashboard');
Этот код проверяет, является ли текущая страница главной (is_front_page
), и перенаправляет пользователей на /dashboard/
.
Пример 2: Перенаправление неавторизованных пользователей на страницу регистрации
Допустим, у вас есть защищенная страница «exclusive», доступная только авторизованным пользователям. Неавторизованные пользователи должны быть перенаправлены на страницу регистрации.
function exclusive_page_redirect() {
if (is_page('exclusive') && !is_user_logged_in()) {
wp_redirect(home_url('/register/'));
exit;
}
}
add_action('template_redirect', 'exclusive_page_redirect');
Этот код перенаправляет неавторизованных пользователей, пытающихся получить доступ к странице «exclusive», на страницу /register/
.
Пример 3: Перенаправление в зависимости от категории записи
Можно использовать хук template_redirect
, чтобы перенаправлять пользователей, когда они посещают записи в определенной категории. Например, перенаправим пользователей с категории «news» на архив категории «updates».
function category_redirect() {
if (is_category('news')) {
wp_redirect(home_url('/category/updates/'));
exit;
}
}
add_action('template_redirect', 'category_redirect');
Этот код перенаправит пользователей с категории «news» на категорию «updates».
Пример 4: Перенаправление на пользовательскую страницу, если значение параметра в URL равно «special»
Допустим, вы хотите перенаправить пользователей на специальную страницу, если в URL указан параметр ?type=special
.
function custom_url_param_redirect() {
if (isset($_GET['type']) && $_GET['type'] === 'special') {
wp_redirect(home_url('/special-page/'));
exit;
}
}
add_action('template_redirect', 'custom_url_param_redirect');
Этот код проверяет наличие параметра type
в URL, и если значение равно special
, перенаправляет на /special-page/
.
Пример 5: Условное перенаправление на основе пользовательского типа записи
Предположим, что вы хотите перенаправить пользователей на определенную страницу, если они пытаются просмотреть архив пользовательского типа записи product
.
function custom_post_type_archive_redirect() {
if (is_post_type_archive('product')) {
wp_redirect(home_url('/product-archive/'));
exit;
}
}
add_action('template_redirect', 'custom_post_type_archive_redirect');
Этот код перенаправляет пользователей с архива пользовательского типа product
на /product-archive/
.
Пример 6: Перенаправление с устаревшей страницы на новую
Иногда бывает необходимо перенаправить пользователей с устаревшей страницы на новую. Например, вы обновили страницу «old-page» и хотите перенаправить всех пользователей на «new-page».
function legacy_page_redirect() {
if (is_page('old-page')) {
wp_redirect(home_url('/new-page/'));
exit;
}
}
add_action('template_redirect', 'legacy_page_redirect');
Этот код перенаправляет пользователей, которые заходят на «old-page», на новую страницу «new-page».
Пример 7: Отключение действия template_redirect
в плагине
Если вам нужно отключить действие, добавленное ранее в template_redirect
(например, сторонним плагином), можно использовать remove_action
. Например, чтобы отключить функцию unwanted_redirect
, выполните следующий код:
function disable_unwanted_redirect() {
remove_action('template_redirect', 'unwanted_redirect', 10);
}
add_action('template_redirect', 'disable_unwanted_redirect', 5);
Здесь функция disable_unwanted_redirect
вызывается до функции unwanted_redirect
, предотвращая её выполнение.
Заметки по использованию
- Не используйте
template_redirect
для загрузки шаблонов. Если требуется подключить альтернативный файл шаблона, используйте фильтрtemplate_include
, а неtemplate_redirect
. Например, следующий код является ошибочным:
add_action('template_redirect', 'incorrect_template_usage');
function incorrect_template_usage() {
if (is_page('special')) {
include(SOME_PATH . '/custom-template.php');
exit;
}
}
Такой подход вызывает полное завершение работы WordPress и может привести к сбоям, так как не будут выполнены важные действия и фильтры. Вместо этого правильным будет использовать template_include
:
function correct_template_include($template) {
if (is_page('special')) {
return SOME_PATH . '/custom-template.php';
}
return $template;
}
add_filter('template_include', 'correct_template_include');
- Обязательно используйте
exit()
илиdie()
послеwp_redirect()
. Если не завершить выполнение скрипта, редирект не произойдет.
Заключение
Хук template_redirect
в WordPress — это мощный инструмент для перенаправления пользователей перед загрузкой шаблона. Он часто используется для управления доступом к контенту, создания условных редиректов и улучшения навигации.