問題描述

我知道如何獲取特定帖子的自定義字段值。

get_post_meta($post_id, $key, $single);

我需要的是在所有帖子中獲取與特定自定義帖子關聯的所有值。

有人知道有效的方法嗎?我不想循環瀏覽數據庫中的所有帖子 ID 。

例:

4 個帖子全部具有不同的值,適用於稱為’Mood’ 的自定義字段。 2 帖子有價值’happy’,1 帖子有’angry’ 和 1 帖子有’sad’

我想輸出:我們擁有的所有帖子:兩個快樂,一個生氣和一個悲傷的作者。

但是對於 LOTS 的帖子。

我正在尋找的是:

  • 一個 WP 函數來得到這個。要麼
  • 一個自定義查詢以儘可能高效地獲得此查詢。

最佳解決方案

一種可能的方法是使用 WPDB 類中的一個幫助方法來執行更精細的基於元的查詢。但是使用這些功能的一些注意事項是,通常你不會得到一個簡單的數據數組,通常必須對對象屬性進行不必要的引用,即使你只調用一個列或一行。

當然,並不是所有的功能都是一樣的,並且有目的的提到 WPDB 方法,get_col 它返回一個簡單的平坦數組查詢的數據,我提到這個具體是因為下面的例子將調用這個方法。

WordPress – WPDB 選擇一列數據 $wpdb->get_col()

這是一個示例函數,它向數據庫查詢所選帖子類型,帖子狀態和特定元鍵的所有帖子 (或者在技術上較少的自定義字段) 。

function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {

    global $wpdb;

    if( empty( $key ) )
        return;

    $r = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s' 
        AND p.post_status = '%s' 
        AND p.post_type = '%s'
    ", $key, $status, $type ) );

    return $r;
}

所以例如,如果你想知道哪些帖子有評分的元鍵,對於帖子類型的電影,你想將這些信息存儲在一個變量中,這樣的一個例子就是..

$movie_ratings = get_meta_values( 'rating', 'movies' );

如果您只想打印數據進行屏幕顯示,PHP 的外掛功能可以將該簡單陣列快速的拼接成數據線。

// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));

例如,您還可以使用返回的數據來確定有多少帖子具有這些元值,方法是對返回的數據進行簡單循環並構建計數數組。

$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
    $num_of_ratings = array();
    foreach( $movie_ratings as $meta_value )
        $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}

/*
Result:
Array(
    [5] => 10
    [9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/

這種邏輯可以應用於各種數據,並擴展到任何數量的不同方式。所以我希望我的例子是有幫助和簡單的跟隨。

次佳解決方案

我只想添加一個小東西到 t31os 的代碼上面。當我自己使用這個代碼時,我將”SELECT” 更改為 「SELECT DISTINCT」,以消除重複的條目。

第三種解決方案

最快的方式是自定義 sql 查詢,我不知道,但你可以嘗試

$wpdb->get_results("
  SELECT posts.* , COUNT(*) 'moodcount'
  FROM $wpdb->posts as posts
  JOIN $wpdb->postmeta as postmeta
  ON postmeta.post_id = posts.ID
  AND postmeta.meta_key = 'Mood'
  GROUP BY postmeta.meta_key
");

如果有什麼事情就開始了。

第四種方案

使用全局 $ wpdb 是不好或需要的:

// function to grab all possible meta values of the chosen meta key.
function get_meta_values( $meta_key,  $post_type = 'post' ) {

    $posts = get_posts(
        array(
            'post_type' => $post_type,
            'meta_key' => $meta_key,
            'posts_per_page' => -1,
        )
    );

    $meta_values = array();
    foreach( $posts as $post ) {
        $meta_values[] = get_post_meta( $post->ID, $meta_key, true );
    }

    return $meta_values;

}

$meta_values = get_meta_values( $meta_key, $post_type );

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。