この記事は最後に更新してから1年以上経過しています。

各投稿記事で設定されているカスタムフィールドの値を取得するには

説明

投稿記事ごとに設定されているカスタムフィールドの値は get_post_meta関数で取得できるが、すべての投稿記事で設定されているカスタムフィールドの値を一覧を取得する関数が見当たらない。カテゴリーや投稿タグのようにそれぞれの値と実際に使用されている投稿記事件数を取得したいのだが、探し方が悪いのか見つからないのだ。
カスタムフィールドに関連する関数の多くは、/wp-includes/meta.phpに定義されているのだが、上から下まで目を通してみても目的の関数が見当たらなかった。需要があれば定義されていてもおかしくないわけで、どうやらそういった需要はなかったということらしい。
まあ、定義されていないものは作ればいい。実際に作った関数はこんな感じ(関数名はそれっぽくしてみた)。
function get_post_meta_values( $meta_key = '' ) {
	global $wpdb;
	if ( !is_string( $meta_key ) || trim( $meta_key ) == '' )
		return false;
	$query = $wpdb->prepare(
		"SELECT meta_value, count(*) AS count FROM $wpdb->postmeta
		WHERE meta_key = %s GROUP BY meta_value", $meta_key );
	return $wpdb->get_results( $query );
}
このget_post_meta_values関数は、パラメータ$meta_keyで指定されたカスタムフィールドの値を配列を返すもの。配列内のカスタムフィールドの値はオブジェクトでmeta_valueフィールドにはカスタムフィールドの値が、countフィールドには登録数(≒投稿数)が格納されている。使い方はこんな感じ。
$addr1_values = get_post_meta_values( 'addr1' );
foreach ( $addr1_values as $addr1_value ) {
	// 値は $addr1_value->meta_value に
	// 登録数は $addr1_value->count に
}
さて関数の説明を少しだけ。ポイントになっているグローバル変数$wpdbは、データベースについて様々な操作を行う重要なオブジェクト。postmetaフィールドには、カスタムフィールドの情報を保存しているテーブル名が格納されている。prepareメソッドを使ってデータベースを操作するためのSQL文を作成し、get_resultsメソッドでSQLを実行。ここではデータベースからカスタムフィールドの値情報を取得している。
最近、カスタムフィールドを使うか、カスタムタクソノミーを使ったほうがいいのか悩むことがある。結果的にはよりお手軽なカスタムフィールドを使うケースがほとんどなんだけどね。

最終更新 : 2011年09月16日 19:44


お勧め

is_blog_admin(2011年6月23日 更新)

bool is_blog_admin( )
リクエストページがブログ管理者ページ(/wp-admin/内)か調べる。

post_class(2018年5月27日 更新)

void post_class( [ string $class = '' [ , int $post_id = null ] ] )
投稿情報の種別に応じたクラス属性(class="post-?? post ...")を表示する。具体的なクラス名は、投稿ID(post-番号)、投稿種別(postやpage)、カテゴリー(category-名前)、タグ(tag-名前)などがある。これらクラス名に合わせたCSSを準備することで、投稿ページのユニークなデザインが表現可能になる。

get_the_password_form(2014年3月3日 更新)

string get_the_password_form( [ mixed $post = 0 ] )
パスワード保護されている投稿のパスワード入力フォームを取得する。

get_template_directory_uri(2018年5月27日 更新)

string get_template_directory_uri( )
現在のテンプレートのパス名(URI)を取得する。

wp_get_single_post(2014年11月16日 更新)

mixed wp_get_single_post( [ int $post_id = 0 [ , string $mode = OBJECT ] ] )
投稿情報を取得する。取得する情報には、標準の投稿情報に区分けカテゴリーIDと投稿タグ名の配列が含まれる。