問題描述

我有以下 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。