【WordPress】特定のカスタムフィールドが未入力の投稿だけを抽出する方法

【WordPress】特定のカスタムフィールドが未入力の投稿だけを抽出する方法 WordPress

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を使っている環境では、フィールドが存在するかどうかを意識した条件分岐が必要です。今回紹介した方法を組み合わせれば、より正確に未入力の投稿だけを抽出できるようになります。投稿の管理やチェック作業を効率化したいときに、ぜひ活用してみてください。