问题描述
我知道如何获取特定帖子的自定义字段值。
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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。