web-dev-qa-db-ja.com

カスタムフィールドキーのすべての値を取得する(クロスポスト)

特定の投稿のカスタムフィールド値を取得する方法を知っています。

get_post_meta($post_id, $key, $single);

必要なのは、特定のカスタム投稿キーに関連付けられたすべての値、 すべての投稿にまたがる を取得することです。

誰もがこれを行うための効率的な方法を知っていますか? DB内のすべての投稿IDをループしたくはありません。

例:

'Mood'という名前のカスタムフィールドに4つの異なる投稿があります。 2投稿の値は 'happy'、1投稿の値は 'angry'、1投稿の値は 'sad'です。

私が出力したい:私たちが持っているすべての記事にわたって:2人の幸せ、1人の怒りと1人の悲しい著者。

しかし、たくさんの投稿のために。

私が探しているのはどちらかです。

  • これを取得するためのWP関数。または
  • できるだけ効率的にこれを取得するためのカスタムクエリ。
40
mikkelbreum

考えられるアプローチの1つは、WPDBクラスのいずれかのヘルパーメソッドを使用して、より洗練されたメタベースのクエリを実行することです。ただし、これらの関数のいくつかを使用する際の注意点は、単純なデータ配列を取り戻すことは通常なく、1つの列または行だけを呼び出す場合でも、オブジェクトプロパティを不必要に参照する必要があるということです。

もちろん、すべての関数が同じものであるわけではないので、目的の言及が _ wpdb _ メソッド、get_colに行われます。これは、照会されたデータの単純なフラット配列を返します。以下の例ではこのメソッドを呼び出します。

ワードプレス - 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;
}

例えば、あなたがどの投稿がratingのメタキーを持っているか探したいのなら、投稿タイプはmoviesそしてあなたはその情報を変数の中に格納したいのであれば、そのような呼び出しの例は次のようになります。

$movie_ratings = get_meta_values( 'rating', 'movies' );

そのデータをスクリーンに印刷する以外に何もしたくない場合は、PHPのimplode関数を使用すると、単純な配列をすばやくデータ行に結合できます。

// 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.
*/

このロジックはさまざまな種類のデータに適用でき、さまざまな方法で機能するように拡張できます。だから私は私の例が参考になるのに十分かつ簡単であったことを願っています。

56
t31os

上の t31os のコードにちょっとしたことを1つ追加したいだけです。このコードを自分で使用したときに、 "SELECT"を "SELECT DISTINCT"に変更して重複エントリを排除しました。

14
Lehooo

グローバルな$ 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 );

最速の方法は、カスタム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
");

どちらかといえばそれが始まりです。

4
Bainternet

メタキーで全てのメタ値を取得するため

wp-> db wordpress codexをチェックしてください

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

T31osとBainternetのコードをマージして、カウントと値を1つの効率的な操作で返す再利用可能な準備済みステートメント(ワードプレススタイル)を作成できない理由はありません。

これはカスタムクエリですが、それでもワードプレスのデータベース抽象化レイヤを使用しています。したがって、たとえばテーブル名が実際のものであるかどうか、または変更された場合は関係ありません。 。

この例では、投稿タイプをチェックしなくなり、空の文字列を除外します。

    $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)
2
benz001

Foreachで以下を使う

 $key = get_post_custom_values( 'key' );

カスタムフィールドキーの名前は

0
Dev