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_query
に NOT 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
が未設定の投稿- かつ
status
がactive
の投稿
これにより、チェックボックスの有無を考慮しつつ、他の条件も適用できます。
まとめ
開発の途中で Smart Custom Fields
で新しいチェックボックスを追加し、それを meta_query
で絞り込む場合、すべての投稿にデータが入っているとは限りません。そのため、 NOT EXISTS
を活用して、カスタムフィールドが未設定の投稿も考慮に入れることで、意図しない除外を防ぐことができます。
さらに、AND
を活用すれば、他のカスタムフィールドの条件と組み合わせることも可能です。
もし「チェックボックスを追加したら投稿が表示されなくなった!」というトラブルに遭遇したら、meta_query
の NOT EXISTS
や AND
を活用してみてください!