カスタムフィールドでループ条件を絞るmeta_queryが便利【wordpress】

ワードプレスではカスタムループをよく利用します。WP_Queryやget_postsを使うのが一般的ですが、そこの引数にカスタムフィールドを指定できるって知ってましたか?

これを知ってから、今までずいぶん遠回りしないとできなかったことが一発でできるようになりました。

meta_queryの使い方

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'color',
            'value' => 'blue',
            'compare' => 'NOT LIKE'
        )
    )
);
$query = new WP_Query($args);

配列でkey, value, compareを指定するだけです。上の設定を言葉で説明すると、カスタム投稿タイプがプロダクトの記事の中から、カラーの設定がブルー以外をループで表示させるということになります。 'compare'には整数の比較など様々な設定を入れることができます。

使える値は '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' および 'NOT EXISTS' です。デフォルトは '=' です。 詳しくはcodexを読んでね。

具体的な用途【公開期限をすぎたらループから除外】

公開期限を設定するカスタムフィールドを作り、現在の日付を取得と比較するようにmeta_queryを設定すれば、公開期限を過ぎた投稿ループから除外することも可能です。

カスタムフィールド deadlineに公開期限日を入力。inputに入力する日付を正しいフォーマットで入力しなければいけないので、カレンダーピカー、デートピッカー、などで検索してjsプラグインを利用すると入力に間違いはありません。

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'relation' => 'OR',
            array(
                'key' => 'deadline',
                'value' => date_i18n('Ymd'),
                'compare' => '>='
            ),
            array(
                'key' => 'deadline',
                'value' => '',
                'compare' => '='
            ),
        )
    )
);
$query = new WP_Query($args);

シリアライズされたデータも扱える

ワードプレスのカスタムフィールドに配列を保存しようとすると、勝手にシリアライズしてくれる仕様になっています。取り出す時も勝手に戻してくれます。

このカスタムフィールドに保存したシリアライズデータもmeta_querで指定することなさができます。

しかしデータベースには保存されるのは配列の長い文字列なので、一致するデータがあるかないかを判断することしかできませんので、'compare'の設定はLIKEかnot likeしか使えないですね。

それ以外の用途で扱いたい場合は、配列ではなく、独立したカスタムフィールドに保存する必要があるので注意してね。

具体的な用途、カスタムフィールドに並んだチェック数でループを判別

カスタムフィールドにチェックボックスが10個並んでたとします。

そこから1と2のチェックボックスにチェックが入っていた場合のみループするという指定がこちらです。

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'relation' => 'AND',
            array(
                'key' => 'array_field',
                'value' => 's:7:"項目1";s:2:"on";',
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'array_field',
                'value' => 's:7:"項目2";s:2:"on";',
                'compare' => 'LIKE'
            )
        )
    )
); 
$the_query = new WP_Query( $args );

細かくループ条件を指定したいけど、カスタムタクソノミーを使うまでもない時に使えます。

より細かく複合条件を設定もできる

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'relation' => 'OR',
            array(
                'key' => 'deadline_field',
                'value' => date_i18n('Ymd'),
                'compare' => '>='
            ),
            array(
                'key' => 'deadline_field',
                'compare' => 'NOT EXISTS'
            ),
        ),
        array(
            'relation' => 'AND',
            array(
                'key' => 'array_field',
                'value' => 's:7:"項目1";s:2:"on";',
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'array_field',
                'value' => 's:7:"項目2";s:2:"on";',
                'compare' => 'LIKE'
            )
        )
    )
); 
$the_query = new WP_Query( $args );

meta_queyの内容をまとめたテーマを作りましたので、参考までにどうぞ。

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら