How to get a meta value from all post

I searched for a while but I didn’t find any solution. I used the functions listed here.
It outputs something like this:

Array
(
    [0] => 15
    [1] => 30
    [2] => 50
)

But I want something like this:

Array
(
    [post_id_1] => 15
    [post_id_2] => 30
    [post_id_3] => 50
)

And this is the $wp query that is used in the function:

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;
}

2 Answers
2

get_col() function returns only one column as array. To get two column result we can use get_results(), Which will return an array of objects

Which further can be converted into required structure using foreach loop.

Example –

function get_meta_values( $key = '', $type="post", $status="publish" ) {
    global $wpdb;
    if( empty( $key ) )
        return;
    $r = $wpdb->get_results( $wpdb->prepare( "
        SELECT p.ID, 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 ));

    foreach ( $r as $my_r )
        $metas[$my_r->ID] = $my_r->meta_value;

    return $metas;
}

( The modified version of your Example )

Leave a Comment