同时使用POST__IN和POST__NOT_IN吗?

时间:2013-08-02 作者:Drew Baker

我试图只显示用户没有看到的帖子,如下所示:

$exclude = array(1,2,3);
$include = array(3,4,5);
$args = array(
  \'post_type\'           => \'post\',
  \'post_status\'         => \'publish\',
  \'posts_per_page\'      => 30,
  \'post__in\'            => $include,
  \'post__not_in\'        => $exclude,
  \'orderby\'             => \'post__in\',            
  \'tax_query\'           => array(
        \'relation\' => \'AND\',
         array(
            \'taxonomy\'  => \'category\',
            \'field\'     => \'slug\',
            \'terms\'     => array($category_names),
            \'operator\'  => \'IN\'
         ),
         array(
            \'taxonomy\'  => \'category\',
            \'field\'     => \'ID\',
            \'terms\'     => array($category_ids),
            \'operator\'  => \'NOT IN\'
         )
  )
);
$posts = get_posts($args);
我希望这会返回帖子4和5,但它会返回帖子3、4和5。

如何设置“post\\em>in”和“post\\em>\\u not\\u in”参数之间的首选项?

我知道我可以在$exclude和$include变量上使用array\\u diff(),但实际情况比这个问题更复杂。我有许多不同的数组可以比较,其中一些是多维的。我还包括和排除了某些分类法。

我还认为,如果是WP\\u查询或$wpdb调用,而不是以一行又一行的PHP结束查询参数,那么其他人更容易阅读。

此外,如果array\\u diff等于空数组,则查询实际上返回POST,而不是nothing。

所以,也许最好的方法是调用$wpdb,或者在post ID字段上使用WP\\u Query的meta\\u查询?

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

post__inpost__not_in 相互排斥。

注意:不能在同一查询中组合post\\u in和post\\u not\\u in。

http://codex.wordpress.org/Class_Reference/WP_Query

在写问题时,您拒绝的解决方案是使用array_diff-- 这是显而易见的答案。

如果该解决方案确实不起作用,则需要安装过滤器posts_where (可能)这将提供您需要的查询逻辑。由于你没有解释“现实比这个问题更复杂”,因此真的不可能猜测这种逻辑可能是什么。

但是here is an example of a posts_where 过滤器:

function smbd_cats_by_days ($where = \'\') {
    // global $days_limit; // if a variable
    // $days_limit = DAYS_LIMIT; // if a constant
    // $days_limit = get_option(\'days_limit\',100);
    // you have to uncomment one of the above, 
    // depending on your choice of mechanisms
    $where .= " AND post_date < \'" . date(\'y-m-d\', strtotime("-{$days_limit} days")) . "\'";
    return $where;
}
add_filter(\'posts_where\', \'smbd_cats_by_days\');
根据对问题的编辑和本意向书:

我试图只显示用户没有看到的帖子。。。

编写PHP以创建用户看到的帖子数组,并将其排除在外post__not_in. 您试图将所有内容都推到查询中只会使事情变得复杂。

我还认为,如果是WP\\u查询或$wpdb调用,而不是以一行又一行的PHP结束查询参数,那么其他人更容易阅读。

当您编写过滤器和/或SQL以包含查询中的所有内容时,它将不会变得更“可读”,而且它是否会在一开始就更可读还值得怀疑。你正试图以艰难的方式做到这一点。WP_Query 不具备复杂逻辑的能力,SQl中的复杂逻辑很难编写,即使在好天气也很难读取。

SO网友:gmazzap

Excude和include不能一起使用,此代码在核心中使用,所以或一个或另一个。

...
if ( ! empty($r[\'include\']) ) {
  $incposts = wp_parse_id_list( $r[\'include\'] );
  $r[\'posts_per_page\'] = count($incposts);  // only the number of posts included
  $r[\'post__in\'] = $incposts;
} elseif ( ! empty($r[\'exclude\']) )
...
如果您只需要发布的参数,那么$wpdb查询就很容易了。

这种方法很简单,但如果你不能解释为什么?

$exclude = array(1,2,3);
$include = array(3,4,5);
$args = array(
    \'post_type\'         => \'post\',
    \'post_status\'       => \'publish\',
    \'posts_per_page\'    => 30,
    \'post__in\'          => array_diff($include, $exclude),
)
$posts = get_posts($args);

结束

相关推荐

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

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