WordPress как на ладони
wordpress jino

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 VER 4.9.1
<?php
/**
 * Loads the correct template based on the visitor's url
 * @package WordPress
 */
if ( defined('WP_USE_THEMES') && WP_USE_THEMES )
	/**
	 * Fires before determining which template to load.
	 *
	 * @since 1.5.0
	 */
	do_action( 'template_redirect' );

/**
 * Filters whether to allow 'HEAD' requests to generate content.
 *
 * Provides a significant performance bump by exiting before the page
 * content loads for 'HEAD' requests. See #14348.
 *
 * @since 3.5.0
 *
 * @param bool $exit Whether to exit without generating any content for 'HEAD' requests. Default true.
 */
if ( 'HEAD' === $_SERVER['REQUEST_METHOD'] && apply_filters( 'exit_on_http_head', true ) )
	exit();

// Process feeds and trackbacks even if not using themes.
...
template_redirect 3 комментария
  • vadosss cайт: kyrortik.ru

    Как переадресация и данные хуки влияют на скорость загрузки сайта, имеет смысл убирать их?

    1
    Ответить1.1 года назад #
  • Дмитрий

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

Здравствуйте, !

Ваш комментарий
Предпросмотр