有一个文件名为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
它只返回
one 邮递
两者之间没有区别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" );
Update #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\');
Update #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()
在需要的地方。
最合适的回答,由SO网友:s_ha_dum 整理而成
没有理由认为查询在单个post页面上的行为应该与在任何其他页面上的行为不同。也就是说,发布的代码中没有任何原因。我能想到的唯一一件事就是有一个过滤器在干扰——可能是一个写得很差的过滤器pre_get_posts
或post_limits
.
您应该能够使用验证来自该查询的SQLvar_dump($query1->request);
, 如果结局不是LIMIT 0, 22
你有什么干扰。
Based on additional information in the question:
这个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\'
。。。显式查询参数未考虑的。一定有另一个过滤器。