WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Рекомендуемые продукты со скидкой от Template Monster

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

Срабатывает перед тем, как WordPress определит какой файл шаблона использовать для вывода контента.

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

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

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

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

Примеры

#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.

Заметки

Этот хук нельзя использовать для загрузки альтернативного файла шаблона. Пример неправильного кода:

// неправильный код, используйте хук 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 для подключений

Список изменений

С версии 1.5.0 Введена.

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

В файле: /wp-includes/template-loader.php
template_redirect
wp-includes/template-loader.php 13
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/default-filters.php 272
add_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
wp-includes/default-filters.php 301
add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
wp-includes/default-filters.php 390
add_action( 'template_redirect', 'wp_old_slug_redirect' );
wp-includes/default-filters.php 515
add_action( 'template_redirect', 'redirect_canonical' );
wp-includes/default-filters.php 516
add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
wp-includes/default-filters.php 533
add_action( 'template_redirect', '_wp_admin_bar_init', 0 );
wp-includes/ms-default-filters.php 73
add_action( 'template_redirect', 'maybe_redirect_404' );
3 коммента
  • Дмитрий

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

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