WordPress開発の途中でスマートカスタムフィールドのチェックボックスを追加して、meta_queryを追加したとき、すべての記事更新をしなおさなくてもいいんです。

WordPressのカスタムフィールドを簡単に追加できる「Smart Custom Fields(スマートカスタムフィールド)」は非常に便利なプラグインです。しかし、開発の途中で新しくチェックボックスの項目を追加し、それを meta_query で絞り込もうとしたとき、意図しない動作をすることがあります。

特に、新しいカスタムフィールドが追加されたばかりの状態では、すべての投稿にそのメタデータが保存されているわけではありません。そのため、 meta_query を追加すると、条件を満たさない投稿がすべて除外されてしまうことがあります。

なぜすべて入力しなくてもいいのか?

チェックボックスのカスタムフィールドを追加すると、フィールドをチェックした投稿には meta_key が保存されますが、未入力の投稿には meta_key 自体が保存されません。ここで meta_query を設定すると、以下のような問題が起こります。

【問題点】

'meta_query' => array(
    array(
        'key'     => 'custom_checkbox',
        'value'   => '1',
        'compare' => '=',
    ),
),

上記の meta_query では custom_checkbox に「1」という値が入っている投稿のみ取得されます。しかし、新しくこのカスタムフィールドを追加したばかりで、多くの投稿が meta_key 自体を持っていない場合、それらの投稿はすべて除外されてしまいます。

NOT EXISTS を使って未入力も考慮する

すべての投稿を考慮しながら、新しく追加したチェックボックスが未入力でも問題なく動作させるためには、meta_queryNOT EXISTS を追加する方法が有効です。

【改善後の meta_query

'meta_query' => array(
    'relation' => 'OR',
    array(
        'key'     => 'custom_checkbox',
        'value'   => '1',
        'compare' => '=',
    ),
    array(
        'key'     => 'custom_checkbox',
        'compare' => 'NOT EXISTS',
    ),
),

このように OR 条件を使い、「チェックボックスが 1 の投稿」または「 custom_checkbox が存在しない投稿」の両方を取得できるようになります。これにより、新しいチェックボックスが追加されても、フィルタが適用されていない投稿を除外せずに済みます。

AND との併用方法

AND を使って他の条件と組み合わせることも可能です。例えば、custom_checkbox が 1 または未設定であり、かつ status というカスタムフィールドが active の投稿のみ取得したい場合、次のように設定できます。

【AND 条件を含めた meta_query

'meta_query' => array(
    'relation' => 'AND',
    array(
        'relation' => 'OR',
        array(
            'key'     => 'custom_checkbox',
            'value'   => '1',
            'compare' => '=',
        ),
        array(
            'key'     => 'custom_checkbox',
            'compare' => 'NOT EXISTS',
        ),
    ),
    array(
        'key'     => 'status',
        'value'   => 'active',
        'compare' => '=',
    ),
),

この場合、以下の条件を満たす投稿が取得されます。

  • custom_checkbox が 1 または custom_checkbox が未設定の投稿
  • かつ statusactive の投稿

これにより、チェックボックスの有無を考慮しつつ、他の条件も適用できます。

まとめ

開発の途中で Smart Custom Fields で新しいチェックボックスを追加し、それを meta_query で絞り込む場合、すべての投稿にデータが入っているとは限りません。そのため、 NOT EXISTS を活用して、カスタムフィールドが未設定の投稿も考慮に入れることで、意図しない除外を防ぐことができます。

さらに、AND を活用すれば、他のカスタムフィールドの条件と組み合わせることも可能です。

もし「チェックボックスを追加したら投稿が表示されなくなった!」というトラブルに遭遇したら、meta_queryNOT EXISTSAND を活用してみてください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です