Intereting Posts
Исключить пользовательский тип сообщения из конфликта поиска с помощью get_posts Как проверить, активирована ли функция woocommerce в теме Должен ли я предоставлять каналы RSS или Atom? Установить Featured Image программно (в админ) с помощью JavaScript? Разрешить доступ через wp-login.php Множественные установки WordPress, которые разделяют WordPress & Theme, но с разделенной базой данных Обновление изменено. Определить стороннюю тему Ошибка «Неопределенный индекс» при сохранении пустого массива с флажками На всех страницах отображается ошибка 404, пока загрузка изображения не закончится Как получить идентификатор прикрепления изображения и URL-адрес Шаблон перепутался с просмотром сообщений Как конвертировать мой сайт WordPress в агностикцию домена? Комментарий Уокер против Обратной связи $ wpdb-> get_results утечка памяти Ручное резервное копирование – как сохранить в Firefox или Chrome (вместо IE, который вызывает всплывающее окно, от которого я не могу избавиться)

Показать страницу ошибки 404, если значение переменной публичного запроса не существует?

Публичные запросы vars – это те, которые доступны и могут использоваться через прямой запрос URL.

На моем сайте я создал несколько настраиваемых URL-адресов с их собственными переменными запроса:

example.net/?category_name=uk&tag=highlights 

(например, список сообщений, принадлежащих обоим – категории «Tech» и тегу «гаджеты»)

И переписать правила (с помощью add_rewrite_rule ) на место для довольно URL-адресов, например, вот так:

 example.net/uk/tag/highlights/ 

(База категорий удаляется по умолчанию из категории permalinks.)

Теперь проблема использования общедоступных запросов vars заключается в том, что они почти никогда не показывают страницу ошибок 404. Например, посмотрите два этих URL:

 example.net/?category_name=uk&tag=jdfjdsjfdlkf example.net/uk/tag/jdfjdsjfdlkf 

Несмотря на то, что тег jdfjdsjfdlkf не существует, посетителю показана страница «Ничего не найдена» ( content-none.php ) вместо того, чтобы бросать ошибку 404 (404.php) с соответствующими заголовками.

Когда я думаю об этом, это имеет смысл. Но, чтобы удовлетворить моему конкретному случаю, я хочу, чтобы определенный набор публичных запросов vars ( category_name , tag и channel – пользовательский таксономия query_var) показывал страницу ошибки 404, когда предоставленное значение не существует.

Мои первоначальные попытки привели меня сюда:

 add_action( 'template_redirect', 'my_page_template_redirect' ); function my_page_template_redirect() { global $wp_query, $post; $cat = get_query_var( 'category_name' ); $category = get_term( $cat, 'category' ); $chnl = get_query_var( 'channel' ); $channel = get_term( $chnl, 'itsme_channel' ); $tag = get_query_var( 'tag' ); $post_tag = get_term( $tag, 'post_tag' ); if( $category && !is_wp_error($category) && $channel && !is_wp_error($channel) ){ // If URL is like `example.net/?category_name=uk&channel=tech` and both of the // supplied values (ie Category and Channel taxonomy terms) exist // Do nothing } elseif( $category && !is_wp_error($category) && $post_tag && !is_wp_error($post_tag) ) { // If URL is like `example.net/?category_name=uk&tag=highlights` and both of the // supplied values (ie Category and Tag taxonomy terms) exist // Do nothing } elseif( $category && !is_wp_error($category) && $channel && !is_wp_error($channel) && $post_tag && !is_wp_error($post_tag) ) { // If URL is like `example.net/?category_name=uk&channel=tech&tag=highlights` and all the // supplied values (ie Category, Channel, and Tag taxonomy terms) exist // Do nothing } else { // If one or all of the supplied values don't exist throw a 404 error $wp_query->set_404(); status_header(404); nocache_headers(); } } 

проблема

Похоже, что условия на месте неправильны или термин «объекты» ( $category , $channel , $post_tag не установлен правильно), так как мне всегда показывают страницу ошибки 404, т.е. даже если существуют термины.

Что я здесь делаю неправильно?

Solutions Collecting From Web of "Показать страницу ошибки 404, если значение переменной публичного запроса не существует?"

Даже если вы заработаете, вы выполняете 3 разных запроса ( get_term fire query) в дополнение к основному запросу для любого запроса, я не думаю, что это правильный способ сделать то, что вы хотите.

Я предполагаю, что когда вы отправляете неверный тег / категорию / пользовательский налог, вы не найдете никаких сообщений, так почему бы не

 add_action( 'template_redirect', 'my_page_template_redirect' ); function my_page_template_redirect() { global $wp_query; if ( ! (int) $wp_query->found_posts > 0 ) { $wp_query->set_404(); status_header(404); nocache_headers(); } } 

редактировать

Эта функция возвращает 404, даже если существующие таксономии пройдены, но без должности. кто-то может найти это хорошо, если нет, это альтернатива, которая не делает этого:

 function my_page_template_redirect() { global $wp_query, $wp; // this get an array of the query vars in the url parse_str( parse_url ( add_query_arg( array() ), PHP_URL_QUERY ), $qv); if ( ! empty( $qv ) ) { // if there are some query vars in the url $queried = array_keys( $qv ); // get the query vars name $valid = $wp->public_query_vars; // this are the valid query vars accepted by WP // intersect array to retrieve the queried vars tha are included in the valid vars $good = array_intersect($valid, $queried); // if there are no good query vars or if there are at least one not valid var if ( empty($good) || count($good) !== count($queried) ) { $wp_query->set_404(); status_header(404); nocache_headers(); } } } 

Эта функция будет устанавливать значение 404 только в том случае, если в запросе содержится один или несколько недопустимых запросов (недопустимые имена таксономии, но не только).