PHP での絞り込みなら
詳しくは Codex を参照してくださいですが、query_posts()
や get_posts()
など、PHP コードでなら以下のように書けますね。
query_posts( array(
'post_type' => 'staff',
'meta_key' => 'division',
'meta_value' => 'sales',
/* 他のパラメータは省略 */
) );
メタクエリーを使えば、複数の条件を組み合わせることができます。
query_posts( array(
'meta_query' => array(
array(
'key' => 'division',
'value' => 'sales',
),
array(
'key' => 'gender',
'value' => 'male',
),
),
/* 他のパラメータは省略 */
) );
簡単な方法
同様に URL にクエリパラメータを付ければできそうな気がしますが、
http://example.com/staff/?meta_key=division&meta_value=sales
これは無視されます。URL に使用できるクエリ変数は wp-includes/class-wp.php
の始めの方で $public_query_vars
に指定されています。で、 これには meta_key, meta_value
がありません。
ないなら、付け足せばいいじゃない的な解決方法が以下です。テーマフォルダの functions.php に書けば OK。
add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $public_query_vars ) {
return array_merge( $public_query_vars, array( 'meta_key', 'meta_value' ) );
}
これで、先ほどの ?meta_key=division&meta_value=sales
が有効になります。ただし、複数の条件を指定することはできません。
よりクールな方法
いやでも URL に meta_key
とか meta_value
とかダサくないだろうか。えびちゃんドン引きしちゃうんじゃないだろうか。こんなことならカスタムフィールドじゃなくてカスタム分類(タクソノミー)で作っておけばよかった。カスタム分類なら、
http://example.com/staff/?division=sales
ってスマートに書けるのに。カスタム分類は敷居が高いからずっと避けていた。納期もアレだから安直にカスタムフィールドで済ませてしまっていた。いつまでもそうやって逃げてるの?そう言われて何も言い返せなかった。オレ、このままでいいんだろうか。。。
と、お悩みのアナタに以下のコードを捧げます。テーマの functions.php に書きましょう◎
global $my_public_query_vars;
$my_public_query_vars = array( 'division', 'gender' );
add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $public_query_vars ) {
global $my_public_query_vars;
return array_merge( $public_query_vars, $my_public_query_vars );
}
add_action( 'pre_get_posts', 'my_pre_get_posts' );
function my_pre_get_posts( $query ) {
if ( ! is_admin() && is_post_type_archive( 'staff' ) /* && 'staff' == $query->get( 'post_type' ) */ ) {
$meta_query = array();
global $my_public_query_vars;
foreach ( $my_public_query_vars as $key ) {
if ( $val = $query->get( $key ) ) {
$meta_query[] = array(
'key' => $key,
'value' => $val,
);
}
}
if ( ! empty( $meta_query ) ) {
$query->set( 'meta_query', $meta_query );
}
}
}
もちろん、以下のような複数条件も指定できます。
http://example.com/staff/?division=sales&gender=male
おまけ:クエリ変数付きの URL を PHP で作る方法
投稿タイプが staff で、部署が sales で性別が male な URL は
add_query_arg(
array(
'division' => 'sales',
'gender' => 'male',
),
get_post_type_archive_link( 'staff' )
);
で作成できます。add_query_arg()
って何やねん、と気になったコードジャンキーな方は PHPXref 0.7: WordPress でソース見てみてん◎
CONCLUSION
コンテンツ設計というかデータ設計というか、そういうものはしっかりキッチリ練っておきましょうね!
動作確認バージョン
- WordPress 3.2.1
【ブログ】WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/wZiN7vCB @wordpress_fan #wordpressjp
【ブログ】WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/wZiN7vCB @wordpress_fan #wordpressjp
【ブログ】WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/wZiN7vCB @wordpress_fan #wordpressjp
【ブログ】WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/wZiN7vCB @wordpress_fan #wordpressjp
【ブログ】WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/wZiN7vCB @wordpress_fan #wordpressjp
WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する | wpxtreme: http://t.co/T1WyIfCO (via Pinboard.in)
WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/IJCLjoUV @kzxtremeさんから
WordPress のURLクエリストリング カスタムフィールド絞込み
WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する
http://t.co/bZqEHgwC
WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する | wpxtreme http://t.co/9ZobEiBF
カスタムフィールドの値による検索を調べ中。 – WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する http://t.co/IJCLjoUV @kzxtremeさんから
“WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する | wpxtreme” http://t.co/RZuocLV6
師匠!やっぱ天才だわw
助かりました。ありがとうございますぅ;;
“WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する | wpxtreme” http://t.co/3okQQumzhw
“/?meta_key=”