การปรับปรุงเล็กน้อยอีกจากคำตอบ @sMyles
ฉันมีกรณีที่รหัสถูกเก็บไว้ทั้งสองเป็นสตริง (เช่นเมื่อนำมาจากการป้อนแบบฟอร์ม) และเป็นจำนวนเต็ม (เช่นupdate_post_meta($post_id, authorized_users', array(get_current_user_id()));
) นี่เป็นปัญหาที่เป็นที่ทราบกันดีwp_set_object_terms()
ว่าคุณสามารถใช้รหัสประจำตัวเพื่อกำหนดเงื่อนไขได้อย่างไร แต่ถ้าคุณไม่แปลงเป็นจำนวนเต็มก่อนคุณจะมีโอกาส 50% ในการสร้างคำศัพท์ใหม่ด้วยตัวเลขเหล่านั้นเป็นชื่อของพวกเขา แทน.
นี่อาจส่งผลให้พวกเขาถูกเก็บไว้ค่อนข้างแตกต่างกันในอาเรย์ที่ต่อเนื่องกันซึ่งสามารถเห็นได้จากเนื้อหาที่ตัดตอนมาจากฐานข้อมูลของเว็บไซต์ทดสอบของฉัน:
a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes
ทั้งสองข้างต้นเมื่อป้อนผ่านprint_r()
จะทำให้เป็น
Array
(
[0] => 1
)
ในการแก้ไขปัญหานี้ฉันได้ปรับแต่งเล็กน้อยmeta_query
โดยการเพิ่มrelation
และรุ่นอื่นของแบบสอบถามที่ส่งค่าเป็นจำนวนเต็มแทนที่จะเป็นสตริง
นี่คือผลลัพธ์สุดท้าย:
'meta_query' => array(
'relation' => 'OR', // Lets it know that either of the following is acceptable
array(
'key' => 'bcm_enm_authorized_users',
'value' => serialize(strval(get_current_user_id())), // Saved as string
'compare' => 'LIKE'
),
array(
'key' => 'bcm_enm_authorized_users',
'value' => serialize(intval(get_current_user_id())), // Saved as integer
'compare' => 'LIKE'
),
),
แก้ไข:เพิ่งรู้ว่าวิธีนี้สามารถเสี่ยงต่อการชนกับดัชนีอาเรย์ซึ่งอาจทำให้ใครบางคนเข้าถึงเนื้อหาที่ผิดกฎหมายหากพวกเขาไม่ได้อยู่ในอาเรย์ แต่ ID ผู้ใช้ของพวกเขาจะปรากฏเป็นดัชนี เช่นนี้แม้ว่าจะใช้งานได้หากคุณมีปัญหาที่กล่าวถึงวิธีปฏิบัติที่ดีกว่าคือการตรวจสอบให้แน่ใจว่าค่าใด ๆ ที่คุณต้องการค้นหาจะถูกแปลงเป็นสตริงก่อนที่จะบันทึกค่าเหล่านั้นเพื่อให้คุณสามารถใช้วิธีการ @sMyles แทน