问题描述

我有以下 wp_query:

$args = array(
    'post_type' => 'news',
    'orderby' => 'meta_key',
    'order' => 'ASC',
    'meta_key'=>'custom_author_name',
    'post_per_page'=>-1
);

$query = new WP_Query($args);

echo $query->found_posts;

echo = 10 结果是因为 meta_key = custom_author_name 只有 10 个 news 帖子。但是有数百个 news 的帖子没有这个特定的 meta_key 的 post_meta 行。请注意,没有涉及到 meta_query 。没有分配 meta_value,因为我只是试图通过 meta_key 对帖子进行排序,而不是通过 meta_value 进行过滤。

不应该排序选择所有帖子?只是命令他们?

为什么结果过滤?如果没有找到 meta_key,为什么不使用空字符串或匹配全部?

如果没有,为什么不呢?

如果我在每个新闻文章中输入一个 meta_key(即使是一个空字符串),那么我得到预期的结果。但是,这似乎是很多不需要在那里的表行。

最佳解决方案

正如 @ ambroseya 的回答所说,它应该像这样工作。一旦你声明了一个元查询,即使你不是寻找一个特定的值,它只会用声明的元键来查询帖子。如果要包括所有帖子按元键排序,请使用以下代码:

$args = array(
    'post_type' => 'news',
    'orderby' => 'meta_key',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'=>'custom_author_name',
            'compare' => 'EXISTS'
        ),
        array(
            'key'=>'custom_author_name',
            'compare' => 'NOT EXISTS'
        )
    ),
    'post_per_page'=>-1
);

$query = new WP_Query($args);

echo $query->found_posts;

这样做是使用一个高级元查询来查找那些已经宣布没有该元数据的帖子。由于 EXISTS 是第一个,当您使用 meta_value 进行排序时,将使用第一个查询。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。