【WP】カスタムフィールドの値が存在しない記事を取得したい

社畜の遠藤です^^

カスタムフィールドに‘○○○’と入っている記事だけ取得したい!ということは良くありますよね。たとえば、sample_field というカスタムフィールドに‘OK’と入力がある記事だけ取得したい。WP_Queryを使えば、こんな感じです。

$args = array(
    'post_type'     => 'post',
    'post_status'   => 'publish',
    'meta_query'    => array(
    array(
        'key'   => 'sample_field',
        'value' => 'OK'
        )
    )
);
$query = new WP_Query( $args );

WP_Queryを使った初歩ですね^^
では次は、カスタムフィールドの値が‘OK’に拘らず、カスタムフィールド sample_field になんらかの値が入力されている記事を取得する、としてみます。

$args = array(
    'post_type'     => 'post',
    'post_status'   => 'publish',
    'meta_query'    => array(
    array(
        'key'     => 'sample_field',
        'value'   => '',
        'compare' => '!='
        )
    )
);
$query = new WP_Query( $args );

きちんと検索されました^^
パラメーターに compare という項目が追加されています。これは value に対するテスト演算子を指定しています。

テスト演算子とは、この(value)の値をどうやって調べるの?同じ?大きさ?混じってる?と探し方を指定する値です。デフォルトでは「=」が設定されています。「=」イコール、valueとイコールの値、ですね。最初のWP_Queryパラメーターを読み解くと、カスタムフィールド sample_field に ‘OK’ と同じ値が入っている記事を探す、ですね。

今回のは「!=」です。これは、等しく無い、という意味です。valueに指定されているのは「‘’(空の値)」です。

読み解くと、カスタムフィールド sample_field に ‘’(空の値)と等しく無い記事を探す、ですね。「‘’(空の値)と等しく無い」つまり「なんらかの値が入っている」という意味です。
実にプログラミングちっく!compare に指定できるのは、‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘EXISTS’, ‘NOT EXISTS’ です。SQLに触れたことがある方には、お馴染みの値です^^

では最後に、「カスタムフィールド sample_field になんらかの値が入力されている記事」の逆を試してみましょう。

カスタムフィールド sample_field に値が存在しない記事

array(
    'key'     => 'sample_field',
    'value'   => 'なんらかの値',
    'compare' => '!='
)

うーん、これではダメです・・。値が無い、値が無い・・・、値が無い値とは、プログラムだとNULLと表現されますよね^^

なので、これはどうだ〜〜

array(
    'key'     => 'sample_field',
    'value'   => NULL,
    'compare' => '='
)

でも、これでもダメなのです。なぜなら、上記は NULL という値を検索しているので、この条件でマッチするには、カスタムフィールド sample_field に NULL が登録されていないとダメなんです。カスタムフィールドの値が存在しなかったら、という条件とはちょっと違います。
存在しない値を検索してくれるのは、「NOT EXISTS」です。値は存在しないので、パラメーターの value は省略します。

$args = array(
    'post_type'     => 'post',
    'post_status'   => 'publish',
    'meta_query'    => array(
    array(
        'key'     => 'sample_field',
        'compare' => 'NOT EXISTS'
        )
    )
);
$query = new WP_Query( $args );

それではまた〜^^