IT女子のお気に入りフォルダ

管理人の備忘録と実践を兼ねた(出来るだけ)役に立つ情報を配信するブログです。

[WordPress] カスタムフィールドで絞り込んで一覧表示する

WordPressでカスタムフィールドの値によって投稿を絞り込む方法のメモです。

カスタムフィールドが特定の値の投稿を取得する

カスタムフィールドが特定の値の投稿を取得する方法です。
例として、投稿タイプ『test』で『city』というカスタムフィールドの値が『神戸』という投稿を絞り込んで取得します。

投稿タイプ(post_type):test
カスタムフィールドキー(meta_key):city
カスタムフィールド値(meta_value):神戸

$args = Array(
            'post_type' => 'test',
            'posts_per_page' => -1,
            'meta_key' => 'city',
            'meta_value' => '神戸'
        );
$the_query = new WP_Query($args);
if($the_query -> have_posts()):
    while($the_query -> have_posts()): $the_query -> the_post();
        //ここに処理を記述
    endwhile;
endif;
wp_reset_postdata();

posts_per_pageは-1で全件取得です。
以後、7行目以降の記述は同じなので省略します。今後は条件部分だけの記述にします。

カスタムフィールドの値で並び替える

今度はカスタムフィールドの値で並び替える方法です。
例として、カスタムフィールドキーが『city』の投稿をそのカスタムフィールドの値で降順(DESC)に並び替えます。

$args = Array(
            'post_type' => 'test',
            'posts_per_page' => -1,
            'meta_key' => 'city',
            'orderby' => 'meta_value',
            'order' => 'DESC'
        );

※明言どおり条件部分だけの記述にしました。

meta_queryを使って条件を指定する

meta_queryを使うとパラメータが異なり、違った条件指定ができるようになります。
例えばLIEK検索。『address』というカスタムフィールドに『神戸市』が含まれている投稿を取得する場合

$args = Array(
            'post_type' => 'test',
            'posts_per_page' => -1,
            'meta_query' => array(array(
                                'key' => 'address',
                                'value' => '神戸市',
                                'compare' => 'LIKE'
                            ))
        );

SQLのように『%』付ける必要はありません。WP_Query実行時に値の前後に自動で『%』が付与されるからです。
LIKEだけでなく、NOT LIKEやINなども指定できます。
使用できるパラメーターは以下の「5.12 カスタムフィールドパラメータ』を参考にしてください。
関数リファレンス/WP Query

もっと複雑な条件を指定してみる

meta_queryを使えば、もっと複雑な条件も指定することができるようになります。
例として、カスタムフィールド『pref』が『兵庫県』のみに絞り込み、カスタムフィールド『address』の値で昇順に並び替えてみます。

$args = Array(
            'post_type' => 'test',
            'posts_per_page' => -1,
            'meta_key' => 'address',
            'orderby' => 'meta_value',
            'order' => 'ASC',
            'meta_query' => array(array(
                                'key' => 'pref',
                                'value' => '兵庫県'
                            ))
        );

他にも、カスタムフィールド『pref』が『兵庫県』のみに絞り込み、カスタムフィールド『city』の値が『西宮』『尼崎』『伊丹』以外の投稿を取得する場合は、以下のようになります。

$no_cities = array('西宮', '尼崎', '伊丹');
$args = Array(
            'post_type' => 'test',
            'posts_per_page' => -1,
            'meta_key' => 'pref',
            'meta_value' => '兵庫県',
            'meta_query' => array(array(
                                'key' => 'city',
                                'value' => $no_cities,
                                'compare' => 'NOT IN'
                            ))
        );

いろんな絞り込みができるようになるのでとても便利です。

【参考サイト】
query_posts(WP_Queryクラス)でカスタムフィールドを使う