WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com

template_redirect хук-событие . WP 1.5.2

Срабатывает перед тем, как WordPress определит какой файл шаблона использовать для вывода контента. Событие удобно использовать для перенаправления, когда WordPress обработал основной запрос и установил все объекты ($wp_query, $post, условные теги), но вывода контента на экран еще не произошёл.

Это популярный хук и самое удобное место, когда для принятия решения о перенаправлении нужны все данные о текущем запросе (обрабатываемом объекте WordPress).

Использование

function action_function_name_11() {
	// Действие...
}
add_action( 'template_redirect', 'action_function_name_11' );

Примеры

#1 Перенаправление на страницу регистрации

Допустим, у нас есть страница servis, вход на которую нужно открыть только авторизованным пользователям, а остальных нужно перекинуть на страницу авторизации.

Следующий код показывает как это сделать:

function my_page_template_redirect(){
	if( is_page('servis') && ! is_user_logged_in() ){
		wp_redirect( home_url( '/signup/' ) );
		exit();
	}
}
add_action( 'template_redirect', 'my_page_template_redirect' );

#2 Еще примеры

Смотрите в статье: Перенаправление на случайную запись в 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 для подключений

Где вызывается хук

В файле: /wp-includes/template-loader.php
template_redirect
wp-includes/template-loader.php 12
do_action( 'template_redirect' );

Где используется хук (в ядре WP)

wp-includes/customize/class-wp-customize-selective-refresh.php 162
add_action( 'template_redirect', array( $this, 'handle_render_partials_request' ) );
wp-includes/ms-default-filters.php 49
add_action( 'template_redirect', 'maybe_redirect_404' );
wp-includes/default-filters.php 259
add_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
wp-includes/default-filters.php 288
add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
wp-includes/default-filters.php 375
add_action( 'template_redirect', 'wp_old_slug_redirect' );
wp-includes/default-filters.php 500
add_action( 'template_redirect', 'redirect_canonical' );
wp-includes/default-filters.php 501
add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
wp-includes/default-filters.php 518
add_action( 'template_redirect', '_wp_admin_bar_init', 0 );
3 коммента
  • Дмитрий

    Для установки кук подойдет или нет? Просто если использовать init, то не работают теги is_page. т.е. условия не задашь.

    Ответить1.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться