WordPressで投稿に対してカスタムフィールドを利用していると、「特定のフィールドが未入力の投稿だけを表示したい」という場面があります。たとえば、dt_specificationというフィールドが空または未設定の投稿を抽出したい場合、WP_Queryのmeta_queryを活用することで実現できます。
空のカスタムフィールドを抽出する方法
まず、カスタムフィールドが登録はされているものの値が空(空文字列)になっている投稿だけを対象としたい場合は、compareに=を指定し、valueに空文字を設定します。以下のように記述します。
$args = array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'dt_specification',
'value' => '',
'compare' => '='
)
)
);
$query = new WP_Query($args);
この記述により、「dt_specification」というカスタムフィールドが存在し、なおかつ値が空である投稿だけが抽出されます。
フィールドが未設定の投稿を抽出する方法
カスタムフィールドがまったく登録されていない投稿、つまりフィールド自体が存在しない投稿だけを抽出したい場合は、compareにNOT EXISTSを使います。次のように書きます。
$args = array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'dt_specification',
'compare' => 'NOT EXISTS'
)
)
);
$query = new WP_Query($args);
この条件では、WordPressのデータベースに「dt_specification」というキーが一切登録されていない投稿が抽出されます。特にAdvanced Custom Fields(ACF)などを使用していて、一度もその項目を保存していない場合に有効です。
空と未設定の両方を対象にする方法
多くのケースでは、カスタムフィールドが「空の状態」と「未設定の状態」の両方を対象にしたいことがあります。その場合は、上記2つの条件をORで組み合わせます。meta_queryにrelation => ‘OR’を追加し、それぞれの条件を並べる形にします。
$args = array(
'post_type' => 'post',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'dt_specification',
'value' => '',
'compare' => '='
),
array(
'key' => 'dt_specification',
'compare' => 'NOT EXISTS'
)
)
);
$query = new WP_Query($args);
このようにすることで、「dt_specification」が空の投稿と、存在していない投稿の両方を一度に抽出することができます。
ACF使用時の注意点
Advanced Custom Fields(ACF)を利用している場合、投稿を一度でも保存すると、たとえ入力されていなくてもカスタムフィールドとして空の値が保存されることがあります。このため、NOT EXISTSだけでは意図した抽出ができないことがあるため、空文字との併用が必要になる場合があります。
まとめ
カスタムフィールドが未入力の投稿だけを抽出したい場合、単に空文字を指定するだけでは不十分なケースもあります。特にACFを使っている環境では、フィールドが存在するかどうかを意識した条件分岐が必要です。今回紹介した方法を組み合わせれば、より正確に未入力の投稿だけを抽出できるようになります。投稿の管理やチェック作業を効率化したいときに、ぜひ活用してみてください。