我试图只显示用户没有看到的帖子,如下所示:
$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查询?
最合适的回答,由SO网友:s_ha_dum 整理而成
post__in
和post__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);