我正在开发一个网站,有两种不同的自定义帖子类型;其中一个叫做文章,另一个叫做画板。Sketchpad是用户提交的内容,它被指定了一个自定义分类术语值:;公共或私人。网站上会显示公共帖子,而不会显示私人帖子。
管理员在Wordpress管理区域中添加了文章post类型caleld文章,文章没有自定义分类法。
在主页上,我需要拿出“article”和“sketchpad”两种帖子类型的帖子,然后按日期将它们排序,将较新的帖子放在顶部,将较旧的帖子放在底部。
我当前的代码如下:
<?php
$args = array(
\'post_type\' => array(\'sketchpad\', \'article\'),
\'taxonomy\' => \'type\',
\'term\' => \'public\'
);
// Only show content from the sketchpad post type where the taxonomy of type is public
query_posts($args);
?>
上述准则在一定程度上有效。您可以看到,只有帖子类型“sketcphad”具有类型的分类法和“public”的术语值,因此问题是上面的查询还检查类型为“articles”的帖子是否也具有特定的分类法和术语值。
是否可以仅将我查询的分类法和术语部分应用于“sketchpad”帖子类型,而“article”的帖子类型没有应用任何过滤条件?基本上,我想做的是将两个不同的查询合并到一个查询中并输出结果。
最合适的回答,由SO网友:FourStacks 整理而成
不确定您是否已经尝试过这一点,但您可以考虑分别获取这两组帖子,然后合并它们。最终使用get_posts
创建按所需方式排序的组合列表。类似的方法可能适合您(您可能希望在$args变量中添加一个每页帖子参数):
<?php
$sketchpad_args = array(
\'post_type\' => \'sketchpad\',
\'taxonomy\' => \'type\',
\'term\' => \'public\'
);
$sketchpad_posts = get_posts( $sketchpad_args );
$article_args = array(
\'post_type\' => \'article\',
);
$article_posts = get_posts( $article_args );
$all_posts = array_merge( $sketchpad_posts, $article_posts );
$post_ids = wp_list_pluck( $all_posts, \'ID\' );//Just get IDs from post objects
// Do a new query with these IDs to get a properly-sorted list of posts
$posts = get_posts( array(
\'post__in\' => $post_ids,
\'post_status\' => \'publish\',
\'orderby\' => \'date\',
\'order\' => \'ASC\'
) );
foreach( $posts as $post ) :
setup_postdata($post); ?>
// Your loop stuff
<?php endforeach; ?>
SO网友:jerclarke
在回答之前,您应该注意到query\\u posts从来都不是一个好办法。您应该使用$myquery = new WP_Query()
要生成新查询,或者应该使用pre_get_posts
滤器
也就是说,假设您只想知道要传递到WP\\u查询中的查询变量,无论是通过query\\u post还是新的WP\\u查询。
我认为您的情况实际上是幸运的,因为您正在筛选的分类法只有两个术语。因此,你可以在你不想要的术语中排除帖子,而不是包括你想要的帖子。
一、 e.排除“私人”画板。这样,在返回所有文章的同时,草图板会得到您想要的过滤,因为它们都不属于“私有”分类术语。
您想在WP\\u查询中构建一个“tax\\u query”数组,其中NOT IN作为运算符。http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
FWIW我建议对私有/公共交换机使用post元数据,而不是分类法。因为它是二进制的,所以在Posteta表中可以很好地工作,并且最终您需要的唯一UI是一个复选框,所以整个分类界面都是多余的。另外值得注意的是,在使用分类法解决方案时,您始终必须设置一个分类法术语,无论是公共的还是私有的,而实际上您可以将其视为默认的(公共的),并有一个“私有”复选框。数据库和复选框中的垃圾更少,而不是复杂的UI。