Intereting Posts
Почему мой <Style> исчезает? Меню WordPress Custom Walker Class Какой крюк / фильтр можно использовать для добавления / редактирования / отображения / скрытия заголовка под ссылками (на hover) в виде таблицы? Шаблон таксономии пользовательского типа Как отменить последние изменения в пользовательском меню? add_filter comment_edit_redirect не работает Метод доставки не выбран Permalink открывает приложение вместо страницы Редактирование исходного кода в WordPress Подсчет количества сообщений в категории и ее подкатегориях и отображение результата с использованием короткого кода is_main_site () Всегда возвращает True Сохранить номер версии плагина в качестве опции? Реализовать слайд-шоу на главной странице с текстовыми оверлеями Отправить еженедельную электронную почту, если пользователи не заполнили свои профили WordPress ThickBox модальный в панели администратора продолжает загружать

Почему цикл не пуст на некоторых 404-х?

Я столкнулся с странной проблемой.

Скажем, вы получаете доступ к произвольному URL-адресу, три или более уровня:

http://example.com/a/b/c http://example.com/a/b/c/d ... 

Тогда is_404() true . Все идет нормально. Но по каким-то причинам запрашиваются последние сообщения.

 $wp_query->request 

является

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND ( wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' ) ORDER BY wp_posts.post_date DESC LIMIT 0, 5 

Который тогда, конечно, делает have_posts() возвращает true и так далее. Может кто-нибудь объяснить это?

То, что я выяснил до сих пор:

Причина, по которой только на трех или более уровнях глубока, заключается в том, что до этого WP ищет сообщения и вложения, которые каким-то образом приводят к некоторому другому поведению.

Похоже, что хотя WP признает запрос как 404 в какой-то момент, он извлекает последние сообщения. С помощью @kaiser и @GM я отслеживал это где-то из /wp-includes/class-wp.php:608

Solutions Collecting From Web of "Почему цикл не пуст на некоторых 404-х?"

Вы можете быть удивлены, но там нет ничего странного.

Прежде всего давайте поясним, что в WordPress, когда вы посещаете URL-адрес интерфейса, вы вызываете запрос. Всегда.

Этот запрос является стандартным WP_Query , как и те, которые выполняются через:

 $query = new WP_Query( $args ); 

Существует только одно отличие: переменные $args генерируются WordPress с использованием метода WP::parse_request() . То, что этот метод делает, – это просто посмотреть URL-адрес и правила перезаписи и преобразовать URL-адрес в массив аргументов.

Но что происходит, когда этот метод не может этого сделать, потому что URL-адрес недействителен? Аргументы запросов – это всего лишь массив:

 array( 'error' => '404' ); 

(Источник здесь и здесь ).

Таким образом, массив передается WP_Query .

Теперь попробуйте сделать:

 $query = new WP_Query( array( 'error' => '404' ) ); var_dump( $query->request ); 

Вы удивлены, что запрос в точности совпадает с запросом в OP? Я не.

Так,

  1. parse_request() создает массив с ключом ошибки
  2. Этот массив передается WP_Query , который просто запускает его
  3. handle_404() который запускается после запроса, просматривает параметр 'error' и устанавливает is_404() в true

Таким образом, have_post() и is_404() не связаны. Проблема в том, что WP_Query не имеет системы для короткого замыкания запроса, когда что-то пойдет не так, поэтому, как только объект будет построен, передайте ему некоторые аргументы и запрос будет запущен …

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

Есть два способа преодолеть эту проблему:

  • Создайте шаблон 404.php ; WordPress загрузит это на 404 URL-адресах, и вам не нужно проверять наличие have_posts()
  • Принудительно $wp_query быть пустым на 404, что-то вроде:

     add_action( 'wp', function() { global $wp_query; if ( $wp_query->is_404() ) { $wp_query->init(); $wp_query->is_404 = true; // init() reset 404 too } } );