web-dev-qa-db-ja.com

カスタム投稿TYPEのすべてのメタキーをエコーする

カスタム投稿タイプに属するすべての投稿で使用されているすべてのメタキーのリストをダンプする方法はありますか?

つまり、foodというポストタイプで、それぞれの食品(ハム、スパゲッティ、チキン)は、異なるメタキーを持つことができ、それは動的に生成されます。どのメタキーが追加されたのかわかりませんが、それらすべてのリストを使用できるようにしたいです。

3
marctain

単純なクエリを使用して、特定の投稿タイプに対してユーザーが入力したmeta_keysの明確なリストを取得してから、Transients APIを使用して結果をキャッシュできます。このクエリのメタキーは、アンダースコアや数字で始まらないものになります。

function generate_foods_meta_keys(){
    global $wpdb;
    $post_type = 'foods';
    $query = "
        SELECT DISTINCT($wpdb->postmeta.meta_key) 
        FROM $wpdb->posts 
        LEFT JOIN $wpdb->postmeta 
        ON $wpdb->posts.ID = $wpdb->postmeta.post_id 
        WHERE $wpdb->posts.post_type = '%s' 
        AND $wpdb->postmeta.meta_key != '' 
        AND $wpdb->postmeta.meta_key NOT RegExp '(^[_0-9].+$)' 
        AND $wpdb->postmeta.meta_key NOT RegExp '(^[0-9]+$)'
    ";
    $meta_keys = $wpdb->get_col($wpdb->prepare($query, $post_type));
    set_transient('foods_meta_keys', $meta_keys, 60*60*24); # create 1 Day Expiration
    return $meta_keys;
}

ドロップダウンを生成するためのテンプレート内のmeta_keysのリストを取得するには、次の関数を使用します。

function get_foods_meta_keys(){
    $cache = get_transient('foods_meta_keys');
    $meta_keys = $cache ? $cache : generate_foods_meta_keys();
    return $meta_keys;
}

$meta_keys = get_foods_meta_keys();
8
Brian Fegter

最初に、すべてのカスタム投稿タイプのすべてのメタキーを配列にまとめるためにクエリを実行する必要があると思います。だからこのようなもの:

$args = array(
    'post_type' => 'custom-post-type-name',
    );
$cpts = new WP_Query($args);
if($cpts->have_posts()) : while($cpts->have_posts() ) : $cpts->the_post();
    $meta_values[] = get_post_meta($post->ID);
endwhile; endif;

すべてのメタ値は$meta_values配列に格納されます。

var_dump($meta_values)を使って、確実に配列の内容を見ることができます。

1
Aaron Holbrook

すべてのキーと値を取得するには get_post_custom を使用します。

get_post_custom_keys() という名前の関数もあり、これを使ってすべてのメタキーを取得できます。

0
KeepMove