template_redirect
Срабатывает перед тем, как WordPress определит какой файл шаблона использовать для вывода контента.
Событие удобно использовать для перенаправления, когда WordPress обработал основной запрос и установил все объекты ($wp_query, $post, условные теги), но вывод контента на экран еще не произошёл.
Это популярный хук и самое удобное место, когда для принятия решения о перенаправлении нужны все данные о текущем запросе (обрабатываемом объекте WordPress).
Заметка по неправильному использованию хука
Этот хук нельзя использовать для загрузки альтернативного файла шаблона. Пример неправильного кода:
// неправильный код, используйте хук template_include
add_action( 'template_redirect', 'my_callback' );
function my_callback() {
if ( /* Условие */ ) {
include( SOME_PATH . '/some-custom-file.php' );
exit();
}
}
Проблема этого кода в том, что во время срабатывания условия и после подключения указанного файла, работа WordPress полностью прекращается. И перед прекращением работы, не срабатывают некоторые важные фильтры и функции, которые используются плагинами в WordPress. Это чаще всего вызывает неприятные последствия. Которые не всегда заметны сразу.
Чтобы подключить альтернативный файл шаблона, нужно использовать фильтр template_include:
add_filter( 'template_include', 'my_callback' );
function my_callback( $original_template ) {
if ( /* Условие */ )
return SOME_PATH . '/some-custom-file.php';
else
return $original_template;
}
Эффект будет тот же и никаких проблем с плагинами и прочим.
Коротко это правило можно записать так:
- template_redirect - для перенаправлений
- template_include - для подключений
Использование
add_action( 'template_redirect', 'wp_kama_template_redirect_action' );
/**
* Function for `template_redirect` action-hook.
*
* @return void
*/
function wp_kama_template_redirect_action(){
// action...
}
Примеры
#1 Перенаправление на страницу регистрации
Допустим, у нас есть страница service, вход на которую нужно открыть только авторизованным пользователям, а остальных нужно перекинуть на страницу авторизации.
Следующий код показывает как это сделать:
function my_page_template_redirect(){
if( is_page('service') && ! is_user_logged_in() ){
wp_redirect( home_url( '/signup/' ) );
exit();
}
}
add_action( 'template_redirect', 'my_page_template_redirect' ); #2 Еще примеры
Смотрите в статье: Перенаправление на случайную запись в WordPress.
Список изменений
| С версии 1.5.0 | Введена. |
Где вызывается хук
do_action( 'template_redirect' );
Где используется хук в WordPress
add_action( 'template_redirect', array( $this, 'handle_render_partials_request' ) );
add_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
add_action( 'template_redirect', 'wp_old_slug_redirect' );
add_action( 'template_redirect', 'redirect_canonical' );
add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
add_action( 'template_redirect', '_wp_admin_bar_init', 0 );
add_action( 'template_redirect', 'maybe_redirect_404' );
add_action( 'template_redirect', array( $this, 'render_sitemaps' ) );