【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だけでは意図した抽出ができないことがあるため、空文字との併用が必要になる場合があります。

よくある質問(FAQ)

Q. 複数のカスタムフィールドを持つ記事から特定条件のものを絞り込むには?
A. WP_Queryのmeta_queryでcompare=’!=’やNOT EXISTSを組み合わせて絞り込みます。複数フィールドの複合条件はmeta_query内のrelation=’AND’または’OR’で制御します。
Q. get_post_meta()でフィールドが空か確認してバッチ更新するスクリプトは?
A. WP_Queryで対象記事を全取得し、ループ内でget_post_meta()を確認、空の場合にupdate_post_meta()でデフォルト値を設定するPHPスクリプトをfunctions.phpかカスタムプラグインで実装します。
Q. カスタムフィールドの値を一覧CSVとしてエクスポートするには?
A. WP_Queryで記事一覧を取得し、fopen()・fputcsv()でCSVを生成します。WordPressのdownload_url()またはwp_send_json()経由でダウンロードさせます。

まとめ

カスタムフィールドが未入力の投稿だけを抽出したい場合、単に空文字を指定するだけでは不十分なケースもあります。特にACFを使っている環境では、フィールドが存在するかどうかを意識した条件分岐が必要です。今回紹介した方法を組み合わせれば、より正確に未入力の投稿だけを抽出できるようになります。投稿の管理やチェック作業を効率化したいときに、ぜひ活用してみてください。