カスタム投稿タイプに属するすべての投稿で使用されているすべてのメタキーのリストをダンプする方法はありますか?
つまり、foodというポストタイプで、それぞれの食品(ハム、スパゲッティ、チキン)は、異なるメタキーを持つことができ、それは動的に生成されます。どのメタキーが追加されたのかわかりませんが、それらすべてのリストを使用できるようにしたいです。
単純なクエリを使用して、特定の投稿タイプに対してユーザーが入力した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();
最初に、すべてのカスタム投稿タイプのすべてのメタキーを配列にまとめるためにクエリを実行する必要があると思います。だからこのようなもの:
$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)
を使って、確実に配列の内容を見ることができます。
すべてのキーと値を取得するには get_post_custom
を使用します。
get_post_custom_keys()
という名前の関数もあり、これを使ってすべてのメタキーを取得できます。