WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する

例として、スタッフ紹介ページに[部署][性別]のカスタムフィールドがある場合、で話をしますね。
  • 投稿タイプ:staff
  • カスタムフィールド:division, gender
な感じの記事にカスタムフィールドの条件をつけて検索してみましょう。

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

15 Comments

  • 【ブログ】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=”