如何在wp_Query的参数中包含带有&不带有特定元关键字的帖子?

时间:2011-09-13 作者:Michelle

EDIT 2: Rather than figuring out the real solution I\'ve decided to use a workaround, and am simply setting the default value for book_in_series to \'0\'. 幸亏@eddiemoya 他花了这么多时间和我一起看这个!

EDIT: 我有一个不同的问题,需要发布此存档页/查询的完整代码,如果您愿意的话it\'s here.

此查询工作正常,但不包括任何没有meta\\u键“book\\u in\\u series”(决定排序值)的帖子。我希望发生的是,如果存在该值,则按照该值对书籍进行排序,否则将无序返回。这可能吗?

$args = array( 
       \'post_type\' => \'books\', 
       \'posts_per_page\' => -1,
       \'nopaging\' => true,
       \'surpress_filters\' => true,
       \'orderby\' => \'meta_value\',
       \'meta_key\' => \'book_in_series\',
       \'order\' => \'ASC\',
       \'post_parent\' => $current_series_id,
 );

 $books = new WP_Query( $args);
这似乎是来自Rarst的答案,但我不知道如何适应我的情况。Custom query with query_posts doesn't show post without certain meta_key

提前感谢您的帮助!

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

我没有找出真正的解决方案,而是决定使用一种变通方法,只是将book\\u in\\u series的默认值设置为“0”。

SO网友:eddiemoya

要明确的是,您的意思是说,任何没有book\\u in\\u系列键的项目都将位于底部且无序,但有book\\u in\\u系列键的项目将位于顶部并按该键排序。正当

meta\\u query用于指定要返回的项目,orderby用于指定这些项目的排序依据。但是,如果要使用orderby,则需要meta\\u键(不推荐使用meta\\u键作为指定要获取哪些帖子的方法)。

您需要向该查询中添加指定所需帖子的meta\\u查询。我建议在测试meta\\u键时删除它,这样您就知道meta\\u键不会恢复到原来的行为。一旦你知道你有你想要的帖子,把meta\\u键和orderby放回原处,它应该对这些帖子进行相应的排序。

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

http://scribu.net/wordpress/advanced-metadata-queries.html

can I orderby one custom field and meta_query another in the same query

编辑:粗略地尝试一下您的查询应该是什么样子,请阅读注释和解释。

 $meta_query = array(
    \'relation\' => \'OR\',
    array(
        \'key\' => \'book_in_series\',
        \'compare\' => \'IN\'
    ),
    array(
        \'key\' => \'book_in_series\',
        \'compare\' => \'NOT IN\'
    )
);

$args = array(
    \'post_type\'        => \'books\',
    \'posts_per_page\'   => -1,
    \'nopaging\'         => true,
    \'subpress_filters\' => true,
    \'meta_query\'       => $meta_query,
    //\'orderby\'        => \'meta_value\',
    //\'meta_key\'       => \'book_in_series\',
    //\'order\'          => \'ASC\',
    \'post_parent\'      => $current_series_id
);
 $query = new WP_Query( $args );
我已经注释掉了与排序相关的项目-如果使用此查询,您将获得所需的帖子,然后尝试删除这些注释,看看它是否在不覆盖meta\\u查询的情况下进行排序

SO网友:Greg

在搜索了一段时间后,我找到了一个似乎比需要默认值更好的解决方案,而我正准备使用默认值。我很想知道你的想法。我运行了两个查询。一个用于构建要排除的帖子ID数组,另一个用于显示帖子。根据我在这里找到的信息:http://wordpress.org/support/topic/remove-single-post-from-query

$posts_to_exclude_args = array(
            \'cat\' => \'3772\', 
            \'post_status\' => \'publish\',
            \'orderby\' => \'date\',
            \'meta_value\' => \'yes_exclude_this_post\',
        );
$posts_to_exclude = new WP_Query( $posts_to_exclude_args );
$to_exclude = array();
while ( $posts_to_exclude->have_posts() ) : $posts_to_exclude->the_post(); 
$to_exclude[] = $post->ID;
endwhile;

$posts_args = array(
         \'post__not_in\' => $to_exclude,
        \'cat\' => \'-3772\', //Exclude slideshow, video
        \'post_status\' => \'publish\',
        \'paged\'=>$page,
        \'posts_per_page\' => 10,
        \'orderby\' => \'date\',
    );

$posts = new WP_Query( $posts_args );

SO网友:Jacob Raccuia

和其他许多人一样,我也遇到了同样的问题meta_key 出于排序目的,没有返回没有值的值。

我需要按照自定义(可排序的)拖放顺序进行排序,该顺序保存到自定义排序字段中,并且我需要所有未排序的都转到列表的底部。

因为我存储了一个数字,所以使用meta_value_num 用于自然分类1,2,10,12,20 而不是1,10,12,2,20.

$args = array( 
    \'posts_per_page\' => -1, 
    \'post_status\' => \'publish\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'custom_sort\',
            \'compare\' => \'EXISTS\'
        ),
        array(
            \'key\' => \'custom_sort\',
            \'compare\' => \'NOT EXISTS\'
        )
    ),
    \'orderby\' => \'meta_value_num title\',
    \'order\' => \'ASC\',
));

$query = new WP_Query($args);
注意:您可以嵌套整个meta\\u查询并查询更多内容,同时仍可以提取所有字段。

$args = array( 
    \'posts_per_page\' => -1, 
    \'post_status\' => \'publish\',
    \'meta_query\' => array(
        \'relation\' => \'AND\',
        array(
            \'key\' => \'color\',
            \'compare\' => =\'\',
            \'value\' => \'red\'            
        )
        array(
            \'relation\' => \'OR\',
            array(
                \'key\' => \'custom_field\',
                \'compare\' => \'EXISTS\'
            ),
            array(
                \'key\' => \'custom_field\',
                \'compare\' => \'NOT EXISTS\'
            )
        )
    ),
    \'orderby\' => \'meta_value_num title\',
    \'order\' => \'ASC\',
));

$query = new WP_Query($args);
我相信从Wordpress 4.1开始,您不再需要添加meta_key 按自定义字段排序时。(它在sql中为该字段添加一个左连接)。

对这个答案的评论引导我找到了我的解决方案。https://wordpress.stackexchange.com/a/126928/15209

结束

相关推荐

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

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