获取自定义字段键的所有值(交叉发布)

时间:2011-02-15 作者:mikkelbreum

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

get_post_meta($post_id, $key, $single);
我需要的是获取与特定自定义post键关联的所有值,across all posts.

有人知道这样做的有效方法吗?我不想遍历数据库中的所有post id。

示例:

4篇文章都有一个名为“Mood”的自定义字段的不同值。2篇文章的值为“happy”,1篇文章的值为“Angly”,1篇文章的值为“sad”

我想输出:在我们所有的帖子中:两个快乐,一个愤怒,一个悲伤的作者。

但是对于很多帖子来说。

我想要的是:

一个WP函数来获取此信息。或自定义查询,以尽可能高效地获取此信息

7 个回复
最合适的回答,由SO网友:t31os 整理而成

一种可能的方法是使用WPDB类中的一个助手方法来执行更精细的基于元的查询。然而,使用其中一些函数需要注意的是,通常不会返回简单的数据数组,并且通常必须对对象属性进行不必要的引用,即使只调用一列或一行。

当然,并非所有的功能都是相同的,有目的地提到WPDB 方法get_col 它返回一个简单的查询数据平面数组,我特别提到这一点,因为下面的示例将调用此方法。

WordPress - WPDB Selecting a column of data
$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;
}
例如,如果您想找出哪些帖子的meta键为rating, 对于职位类型movies 如果您想将这些信息存储在一个变量中,这种调用的一个示例是。。

$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.
*/
这种逻辑可以应用于各种类型的数据,并可以扩展到多种不同的工作方式。因此,我希望我的例子能很有帮助,并且简单易懂。

SO网友:Leon Francis Shelhamer

使用全局$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 );

SO网友:Lehooo

我只想在上面的t31os代码中添加一个小东西。当我自己使用这段代码时,我将“SELECT”改为“SELECT DISTINCT”,以消除重复条目。

SO网友:Bainternet

最快的方法是自定义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
");
如果有的话,那就是一个开始。

SO网友:Wiki

通过元键获取所有元值

Check wp->db wordpress codex

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = \'yourmetakey\'" );

SO网友:benz001

没有理由不能将t31os和Bainternet的代码合并为一个可重用的预处理语句(wordpress样式),该语句在一个有效的操作中返回计数和值。

这是一个自定义查询,但它仍然使用wordpress数据库抽象层,因此,例如,表名到底是什么,或者表名是否更改都无关紧要,而且它是一个预先准备好的语句,因此我们可以更安全地抵御SQL攻击等。

在本例中,我不再检查post类型,而是排除空字符串:

    $r = $wpdb->get_results(  $wpdb->prepare( "
        SELECT pm.meta_value AS name, count(*) AS count  FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = \'%s\'
        AND pm.meta_value != \'\' 
        AND p.post_type = \'%s\'
        GROUP BY pm.meta_value
        ORDER BY pm.meta_value          
        ", $key, $type) 
        );
    return $r;
尤其是

这将返回如下对象数组:

array  
 0 => 
 object(stdClass)[359]
  public \'name\' => string \'Hamish\' (length=6)
  public \'count\' => string \'3\' (length=1)
 1 => 
 object(stdClass)[360]
  public \'name\' => string \'Ida\' (length=11)
  public \'count\' => string \'1\' (length=1)
 2 => 
 object(stdClass)[361]
  public \'name\' => string \'John\' (length=12)
  public \'count\' => string \'1\' (length=1)

SO网友:Dev

将以下内容用于foreach

 $key = get_post_custom_values( \'key\' );
假设自定义字段键的名称为

结束

相关推荐