WP_QUERY返回随机数量的帖子

时间:2014-03-25 作者:revo

有一个文件名为inform.php 包含在index.php, single.phpsingle-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.phpsingle.php 但在single-news.php 它只返回one 邮递

两者之间没有区别single.phpsingel-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() 在需要的地方。

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

没有理由认为查询在单个post页面上的行为应该与在任何其他页面上的行为不同。也就是说,发布的代码中没有任何原因。我能想到的唯一一件事就是有一个过滤器在干扰——可能是一个写得很差的过滤器pre_get_postspost_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\' 
。。。显式查询参数未考虑的。一定有另一个过滤器。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post