使用具有多个帖子类型和分类的查询帖子

时间:2012-04-24 作者:Dwayne Charrington

我正在开发一个网站,有两种不同的自定义帖子类型;其中一个叫做文章,另一个叫做画板。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”的帖子类型没有应用任何过滤条件?基本上,我想做的是将两个不同的查询合并到一个查询中并输出结果。

2 个回复
最合适的回答,由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。

结束

相关推荐

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

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