ฉันทำการทดสอบเพิ่มเติมกับสิ่งนี้และไม่สามารถหาเหตุผลได้ว่าจะไม่ทำงาน (ยกเว้นรหัสข้างต้นเป็นเพียงตัวอย่างข้อมูลและรหัสจริงที่ตรงกับตัวอย่างของฉันด้านล่าง) อย่างไรก็ตามฉันค้นพบบางสิ่งที่อาจนำคุณไปในทิศทางที่ถูกต้อง
1) ด้วยตัวเองแบบสอบถามเมตานี้จะเท่ากับ "colours IS NULL" นั่นคือมันจะส่งคืนโพสต์ที่ไม่มีชุดคีย์นั้นในตาราง postmeta นี่เป็นกรณีที่แสดงไว้ด้านบนและควรได้ผล
'meta_query' => array(
array(
'key' => 'colors',
'compare' => 'NOT EXISTS' // this should work...
),
)
2) ก่อนหน้า WordPress 3.9 สร้างดัชนี 'ความสัมพันธ์' เป็น 'หรือ' การเปลี่ยนแปลงเงื่อนไขนี้ มันส่งคืนสิ่งที่ตรงกันข้าม อย่าถามฉันทำไม สิ่งนี้มีความสำคัญอย่างยิ่งเมื่อทำแบบสอบถามหลายรายการ ซึ่งหมายความว่าเป็นไปไม่ได้ที่จะเริ่มค้นหาข้อความที่มีการตั้งค่าคีย์ 'สี' เป็น 'สีฟ้า' (หรืออะไรก็ตาม) หรือไม่ได้ตั้งค่าเลย การค้นหาด้านล่างจะไม่สนใจเงื่อนไขแรกและคืนเฉพาะรายการที่ตรงกับเงื่อนไขที่สอง
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'colors',
'compare' => 'NOT EXISTS' // doesn't work
),
array(
'key' => 'colors',
'value' => 'blue'
)
)
3) อย่างไรก็ตามเราสามารถหลอก WordPress ให้ใช้เงื่อนไขแรกได้ถ้าเราตั้งค่า 'value' ไม่จำเป็นต้องมีค่าที่เกี่ยวข้อง (มันถูกละเว้นเท่าที่ฉันรู้) แต่จะต้องมีการตั้งค่าเพื่อให้NOT EXISTSเงื่อนไขมีผลกระทบใด ๆ
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'colors',
'compare' => 'NOT EXISTS', // works!
'value' => '' // This is ignored, but is necessary...
),
array(
'key' => 'colors',
'value' => 'blue'
)
)
สิ่งนี้เป็นจริงจนกระทั่ง WordPress 3.9 หากคุณยังคงใช้เวอร์ชั่นที่เก่ากว่านี่เป็นวิธีแก้ไขที่ใช้ได้จริง