この記事は最後に更新してから1年以上経過しています。
説明
先週3回にわたってtax_queryパラメータを使ったカテゴリーや投稿タグ、投稿フォーマットの絞り込みを整理したが、その途中で目に付いたのが'meta_query'パラメータ。この'meta_query'パラメータは、カスタムフィールドの絞り込み条件を指定するためのもので、3.2で登場した新しいパラメータのようだ。まずはカスタムフィールド関連パラメータのおさらいから。
これまでの query_posts関数でカスタムフィールドを使うケースとしては、特定のカスタムフィールドが設定されているものを絞り込む場合と、カスタムフィールドの値でソートする場合がある。例えば'ranking'が'1'の投稿を絞り込む場合は
query_posts( 'meta_key=ranking&meta_value=1' );
また'ranking'で昇順にソートする場合なら
query_posts( 'meta_key=ranking&orderby=meta_key&order=asc' );
'meta_query'を使ってみる
先ほどの'ranking'が'1'の投稿を絞り込みを'meta_query'パラメータで指定するとquery_posts(
array(
'meta_query' => array(
array( 'key'=>'ranking',
'value'=>'1'
)
)
)
);
データ型と多彩な条件指定が可能
カスタムフィールドの値は基本的に文字列形式で保存されているが、それらは文字列としてではなく、数値、日時として使用することもあるだろう。'meta_query'パラメータでは、データ型を指定することで、数値や日時として条件指定できる。使用できるデータ型は次の通り。データ型 | 意味 |
---|---|
'CHAR' | 文字 |
'NUMERIC' | 'SIGNED'の別名 |
'DECIMAL' | 浮動小数点数 |
'SIGNED' | 整数(符号あり) |
'UNSIGNED' | 整数(符号なし) |
'DATE' | 日付 |
'DATETIME' | 日時 |
'TIME' | 時刻 |
'BINARY' | バイナリー |
データ型 | 意味 | 有効なデータ型 |
---|---|---|
'=' | 値と一致する | すべて(省略時) |
'!=' | 値と一致しない | すべて |
'>' | 値より大きい | 数値系・日時系 |
'>=' | 値以上 | 数値系・日時系 |
'<' | 値より小さい | 数値系・日時系 |
'<=' | 値以下 | 数値系・日時系 |
'LIKE' | 値で指定した文字列に一致する | 'CHAR' |
'NOT LIKE' | 値で指定した文字列に一致しない | 'CHAR' |
'IN' | 値(配列)で指定した何れかに一致する | すべて |
'NOT IN' | 値(配列)で指定した何れにも一致しない | すべて |
'BETWEEN' | 2つの値で指定した範囲内(境界を含む) | 数値系・日時系 |
'NOT BETWEEN' | 2つの値で指定した範囲外 | 数値系・日時系 |
基本的な使い方
それぞれの条件の使い方は、次の通りである。・カスタムフィールド'addr1'の値が'東京都'の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr1',
'value'=>'東京都',
'compare'=>'='
)
)
)
);
・カスタムフィールド'addr1'の値が'東京都'以外の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr1',
'value'=>'東京都',
'compare'=>'!='
)
)
)
);
・カスタムフィールド'price'の値が500より大きい投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'price',
'value'=>'500',
'compare'=>'>',
'type'=>'NUMERIC'
)
)
)
);
・カスタムフィールド'price'の値が500以上の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'price',
'value'=>'500',
'compare'=>'>=',
'type'=>'NUMERIC'
)
)
)
);
・カスタムフィールド'visited_at'の値が'2011/09/15'より前の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'visited_at',
'value'=>'2011/09/15',
'compare'=>'<',
'type'=>'DATE'
)
)
)
);
・カスタムフィールド'visited_at'の値が'2011/09/15'以前の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'visited_at',
'value'=>'2011/09/15',
'compare'=>'<=',
'type'=>'DATE'
)
)
)
);
・カスタムフィールド'addr2'の値に'横浜市'が含まれている投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr2',
'value'=>'横浜市',
'compare'=>'LIKE'
)
)
)
);
・カスタムフィールド'addr2'の値に'横浜市'が含まれていない投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr2',
'value'=>'横浜市',
'compare'=>'NOT LIKE'
)
)
)
);
・カスタムフィールド'addr1'の値が'東京都'、'神奈川県'、'千葉県'の何れかの投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr1',
'value'=>array( '東京都','神奈川県','千葉県' ),
'compare'=>'IN'
)
)
)
);
・カスタムフィールド'addr1'の値が'東京都'、'神奈川県'、'千葉県'以外の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr1',
'value'=>array( '東京都','神奈川県','千葉県' ),
'compare'=>'NOT IN'
)
)
)
);
・カスタムフィールド'wakeup_at'の値が'05:00:00'~'07:00:00'の範囲(境界を含む)の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'wakeup__at',
'value'=>array( '05:00:00', '07:00:00' ),
'compare'=>'BETWEEN',
'type'=>'TIME'
)
)
)
);
・カスタムフィールド'wakeup_at'の値が'05:00:00'より早いか'07:00:00'より遅い投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'wakeup__at',
'value'=>array( '05:00:00', '07:00:00' ),
'compare'=>'NOT BETWEEN',
'type'=>'TIME'
)
)
)
);
複数の条件を組み合わせる
ここまでは単純な条件1つのみを指定した場合について紹介してきたが、これらの条件は複数を組み合わせることができる。・カスタムフィールド'addr1'の値が'東京都'で、'price'の値が500以上の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'addr1',
'value'=>'東京都',
'compare'=>'='
),
array( 'key'=>'price',
'value'=>'500',
'compare'=>'>=',
'type'=>'NUMERIC'
),
'relation'=>'AND'
)
)
);
・カスタムフィールド'wakeup_at'の値が'01:00:00'~'03:00:00'の範囲か'05:00:00'~'07:00:00'の範囲の投稿
query_posts(
array(
'meta_query' => array(
array( 'key'=>'wakeup__at',
'value'=>array( '01:00:00', '03:00:00' ),
'compare'=>'BETWEEN',
'type'=>'TIME'
),
array( 'key'=>'wakeup__at',
'value'=>array( '05:00:00', '07:00:00' ),
'compare'=>'BETWEEN',
'type'=>'TIME'
),
'relation'=>'OR'
)
)
);
いくつか注意点
'meta_query'パラメータは、SQLの知識があれば使いこなしは容易だろう。使いこなす上でポイントの1つは、大小や範囲指定の条件では必ず数値系や日時系のデータ型を指定すること。データ型の指定を忘れると、意図した検索結果を得ることができない。あとは便利だからといって、複雑な条件の組み合わせることはできるだけ避けた方がいい。特に'LIKE'条件との組み合わせはデータベースの検索処理を複雑にしてしまい、結果的に検索時間が長くなってしまう可能性が高い。
最後に'meta_query'パラメータ使用時の'orderby'パラメータで'meta_key'を指定した場合の振る舞いについて少しだけ。このページの冒頭付近で触れたように'orderby'パラメータで'meta_key'を指定し、'meta_key'パラメータでカスタムフィールドの名前を指定することで、そのカスタムフィールドの値に従って検索結果をソートできるのだが、'meta_query'パラメータで指定した条件によっては意図した並び順にならないケースがあった。将来的に改善されるとは思うが、カスタムフィールドによるソートは注意が必要だろう。
最終更新 : 2011年09月15日 13:10
関連
お勧め
get_post_time(2018年5月27日 更新)
mixed get_post_time( [ string $d = 'U' [ , bool $gmt = false [ , mixed $post = null [ , bool $translate = false ] ] ] ] )
パラメータ$dで指定されたフォーマットに従って投稿データの投稿時刻を取得する。
has_tag(2012年1月17日 更新)
bool has_tag( [ mixed $tag = '' [ , mixed $post = null ] ] )
投稿記事に投稿タグが付属しているか調べる。
delete_term_meta(2018年5月27日 更新)
bool delete_term_meta( int $term_id, string $meta_key [ , mixed $meta_value = '' ] )
タームのメタ情報を削除する。
wp_save_post_revision(2023年4月3日 更新)
int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。
safecss_filter_attr(2023年3月31日 更新)
string safecss_filter_attr( string $css [ , string $deprecated = '' ] )
インラインスタイルをサニタイズする。