Intereting Posts
Как отключить все учетные записи на клиентской стороне без отключения новых учетных записей пользователей? неавтоматизированный плагин подписки Регистрация боковой панели. Появились дополнительные баннеры Ошибка при установке соединения с базой данных при установке Как изменить заголовки администратора Неожиданные результаты с условностями внутри шаблона Получить имена авторов, которые отредактировали сообщение Проверьте, есть ли меню id = $ specific_id – затем вставьте конкретный <img> Вручную добавьте URL для ссылок на теги Показывать дату регистрации пользователя Можно ли отображать изображение автора в сообщении вставить в mailchimp? Переопределить orderby для создания списка пользователей по пользовательскому meta_value Разделить короткие коды на массив коротких кодов Типы сообщений цикла с именем и ссылками Заказать wp_query по вычисленному полю

WP_Query возвращает случайное число сообщений

Есть файл с именем inform.php включен в index.php , single.php и single-news.php с приведенным ниже запросом:

 <?php $arr = array('cat' => '12837', 'posts_per_page' => '22'); $query1 = new WP_Query($arr); while($query1->have_posts()) : $query1->the_post(); ?> <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_post_thumbnail("icon-40", array('class' => 'right icon-40')); ?><?php /*<span class="app-name"><?php echo text_excerpt(get_the_title(), 67); ?></span>*/ ?></a></li> <?php endwhile; wp_reset_postdata(); ?> 

Он возвращает точное 22 числа сообщений в index.php и single.php но в single-news.php он возвращает только одно сообщение.

Нет никакой разницы между single.php и singel-news.php кроме стиля и отображения некоторых настраиваемых полей.

Также я проверил wp_reset_postdata(); для рассмотрения после каждого пользовательского запроса, который я написал, но все же есть тот странный результат.

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

 function custom_cat_single_file($single_template) { global $post; if ( in_category( 'news' ) && !in_category('mac-game')) { $single_template = dirname( __FILE__ ) . '/single-news.php'; } return $single_template; } add_filter( "single_template", "custom_cat_single_file" ); 

Обновление # 1

Переформатированный var_dump($query1->request);

 string(476) "SELECT SQL_CALC_FOUND_ROWS wp_posts.id FROM wp_posts INNER JOIN wp_term_relationships ON ( wp_posts.id = wp_term_relationships.object_id ) WHERE 1 = 1 AND ( wp_term_relationships.term_taxonomy_id IN (12837) ) AND wp_posts.post_type = 'post' AND ( wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' ) AND wp_posts.post_date >= '2014:03:21 00:00:00' AND wp_posts.post_date < '2015:03:21 00:00:00' GROUP BY wp_posts.id ORDER BY wp_posts.post_date DESC LIMIT 0, 22" 

У меня есть pre_get_post но я не думаю, что это что-то влияет.

 function post_in_page( $query ) { // not an admin page and is the main query if (!is_admin() && $query->is_main_query()){ if(is_category()){ $current = get_query_var('cat'); $cat = get_category ($current); if($cat->slug != 'news') $query->set('posts_per_page', 25); } } } add_action( 'pre_get_posts', 'post_in_page'); 

Обновление # 2

Поскольку @s_ha_dum заметил о датах, я не нашел никакой функции с крючками, но я не углублялся во все файлы плагинов.

Поэтому я закончил с изменением WHERE запроса:

 function so__weird() { function filter_where( $where = '' ) { $where = preg_replace("/ AND\s+wp_posts\.post_date.*?wp_posts\.post_date.+[^'].*?'/s", '', $where); return $where; } add_filter( 'posts_where', 'filter_where' ); } 

и вызов so__weird() в нужном месте.

Нет причин, по которым запрос должен вести себя по-разному на одной странице, чем на любой другой странице. То есть, в коде не было причин. Единственное, о чем я могу думать, это то, что есть фильтр, мешающий – возможно, плохо написанный фильтр на pre_get_posts или post_limits .

Вы должны иметь возможность проверить SQL, выходящий из этого запроса, с помощью var_dump($query1->request); запрос var_dump($query1->request); , и если он заканчивается чем-то другим, кроме LIMIT 0, 22 вас что-то мешает.

На основании дополнительной информации в вопросе:

pre_get_posts вызов pre_get_posts вы опубликовали, не должен, если я не читаю неправильно, заставляет запрос возвращать одно сообщение. Он должен вернуть больше, чем 22. Однако в этом запросе есть условия даты …

  AND wp_posts.post_date >= '2014:03:21 00:00:00' AND wp_posts.post_date < '2015:03:21 00:00:00' 

… которые не учитываются вашими явными аргументами запроса. Там должен быть другой фильтр.