WordPress как на ладони
Готовые темы (шаблоны) для WordPress wordpress jino

pre_handle_404 хук-фильтр . WP 4.5.0

Позволяет установить запросу произвольные header заголовки после того, как был сделан основной запрос.

Во время хука, можно проверить основной запрос, который находится в глобальной переменной $wp_query. И если надо, отправить на 404 страницу, когда по умолчанию это не 404 страница. Или наоборот не отправлять на 404 страницу, когда по умолчанию должна быть 404 страница.

Если фильтр вернет что угодно кроме false, то все проверки, который идут после этого хука будут прерваны.

Что проверяется после этого хука?

  • Ничего если is_404() уже сработал.
  • Если есть записи в $wp_query->posts, но это запрос пагинации отдельной записи (<!--nextpage-->) и на указанной странице пагинации уже нет контента. Тогда выведет 404 страницу.
  • Если это страница автора, у которого нет записей, то не выводить 404 страницу.
  • Не выводить 404 для определившегося запроса архива.
  • Не выводить 404, если сработал хоть один тег: is_home() || is_search() || is_feed()

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

add_filter('pre_handle_404', 'filter_function_name_11', 10, 2 );
function filter_function_name_11( $preempt, $wp_query ) {
	// Фильтр...
	// return true; // прервать работу

	return $preempt;
}
$preempt(логический)
Если вернуть что угодно кроме false, то работа метода WP::handle_404() будет прервана.
По умолчанию: false
$wp_query(объект)
Глобальный объект $wp_query. Его также можно получить в обрабатываемой функции, указав в начале global $wp_query;

Примеры

#1 Страница 404 для архива автора

Предположим, нам не нужна страница архива автора. Это может быть нужно, когда на сайте всего 1 автор публикует статьи. И если указать URL /author/логин, то мы попадаем на страницу записей этого автора и одновременно может понять какой логин используется у автора. Для защиты от подбора паролей, лучше, чтобы нельзя было определить логин.

Этот пример, показывает как скрыть страницу архива автора. Этот пример разбирался в вопросе.

// Ставим 404 статус
add_action( 'pre_handle_404', 'remove_author_pages_page' );
function remove_author_pages_page( $false ) {
	if ( is_author() ) {
		global $wp_query;
		$wp_query->set_404();
		status_header( 404 );
		nocache_headers();

		return true; // для обрыва хука 
	}

	return $false;
}

// удаляем ссылку
add_filter( 'author_link', 'remove_author_pages_link' );
function remove_author_pages_link( $content ) {
	return home_url();
}

#2 Установим 404 страницу для записи произвольно типа

У нас есть нестандартный URL типа записи realty, в котором присутствуют таксономии. Но чтобы получить страницу записи достаточно знать её ярлык. Пусть URL выглядит так: /realty/таксономия_type_deal/ярлык_записи. Теперь, если указать в имени таксономии (термина) любое значение, страница записи будет работать. А нам нужно, чтобы работала только одна ссылка, с правильным названием таксономии. А если название неправильное, то нужно отдавать 404 страницу.

## 404 страница если в URL указаны неправильные называния таксономий.
## По факту, WP затем 301 редиректит на правильный URL...
add_filter('pre_handle_404', 'realty_404_test' );
function realty_404_test( $false ){
	global $wp_query;

	$set_404 = false;

	// отдельная запись объявления
	if( is_singular('realty') ){
		$post = get_queried_object();

		$term_name = get_query_var('type_deal');
		if( $term_name && ! has_term( $term_name, 'type_deal', $post ) ){
			$set_404 = 1;
		}

	}

	if( $set_404 ){
		$wp_query->set_404();
		status_header( 404 );
		nocache_headers();

		return 1; // обрываем следующие проверки
	}

	return $false; // ничего не делает...
}

Связи хука

Используется в: WP::handle_404()

Фрагменты кода хука pre_handle_404

Фрагмент из: wp-includes/class-wp.php WP 4.7.5
...
 	 */
	public function handle_404() {
		global $wp_query;

		/**
		 * Filters whether to short-circuit default header status handling.
		 *
		 * Returning a non-false value from the filter will short-circuit the handling
		 * and return early.
		 *
		 * @since 4.5.0
		 *
		 * @param bool     $preempt  Whether to short-circuit default header status handling. Default false.
		 * @param WP_Query $wp_query WordPress Query object.
		 */
		if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) {
			return;
		}

		// If we've already issued a 404, bail.
		if ( is_404() )
			return;

		// Never 404 for the admin, robots, or if we found posts.
		if ( is_admin() || is_robots() || $wp_query->posts ) {

			$success = true;
			if ( is_singular() ) {
				$p = false;

				if ( $wp_query->post instanceof WP_Post ) {
...

Casino-vulcan

casino-vulcan перейти на сайт

play-vylkan-klyb.net

pre_handle_404 Комментариев нет

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

Ваш комментарий