问题描述

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

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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。