問題描述
我知道如何獲取特定帖子的自定義字段值。
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。