Есть файл с именем 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'
… которые не учитываются вашими явными аргументами запроса. Там должен быть другой фильтр.