แบบสอบถาม Meta ที่มีค่าบูลีนจริง / เท็จ


11

ฉันพยายามแสดงอสังหาริมทรัพย์ให้เช่าทั้งหมดก่อนโดยคุณสมบัติทั้งหมดที่ยังไม่ได้ให้เช่าจากนั้นตามด้วยคุณสมบัติทั้งหมดที่เช่าอยู่ในปัจจุบัน มีประเภทโพสต์ที่กำหนดเอง 'เช่า' ที่มีเมตาโพสต์ที่กำหนดเองสำหรับราคาเช่า (_price_rented) ซึ่งเป็นช่องทำเครื่องหมาย (ส่งกลับทั้งจริงหรือเท็จ ... จริงถ้ามันถูกเช่า) ฉันต้องเปลี่ยนคิวรีเพื่อแสดงคุณสมบัติทั้งหมดที่มีคุณสมบัติ (ที่ไม่ได้เช่า) ที่มีอยู่ปรากฏขึ้นก่อนจากนั้นจึงจะมีอสังหาริมทรัพย์ที่ให้เช่าปรากฏขึ้น

นี่คือคำถามของฉัน:

$ts_properties = new WP_Query( 
    array( 
    'post_type' => 'rent', 
    'paged' => $paged, 
    'posts_per_page' => -1,
    'meta_key' => '_price_rented',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
        'key' => '_price_rented',
        'value' => false,
        'type' => 'BOOLEAN',
        ),
    ) 
) 
);

ด้วยเหตุผลบางอย่างแบบสอบถามนี้แสดงคุณสมบัติทั้งหมดที่มีการเช่า เมื่อฉันเปลี่ยนค่าจาก 'false' เป็น 'true' ใน meta_query มันจะไม่แสดงคุณสมบัติใด ๆ

ดังนั้นฉันคิดว่าค่าส่งคืนเป็นเท็จ (สำหรับคุณสมบัติที่เช่า) หรือ NULL (สำหรับคุณสมบัติที่ไม่ได้เช่า) แต่ไม่แน่ใจว่าจะค้นหาผลลัพธ์ NULL ได้อย่างไร (ไม่ใช่เท็จ) ฉันเพิ่ม ' เปรียบเทียบ 'อาร์กิวเมนต์กับ meta_query และตั้งค่าเป็น'! = 'แต่นั่นก็ไม่ได้ผลเช่นกัน

EDIT: var_dump ส่งคืนอพาร์ทเมนต์ที่มีให้เช่าstring(0) ""และไม่เช่า:string(1) "1"


ใช้ค่า 1 และ 0 อาจจะ?
reikyoushin

meta_query type => สตริง ค่าที่เป็นไปได้คือ 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' ค่าเริ่มต้นคือ 'CHAR'
iEmanuele

@reikyoushin: การใช้ '1' จะส่งคืนคุณสมบัติที่เช่าทั้งหมดและ '0' จะไม่ส่งคืนคุณสมบัติ
Kegan Quimby

1
@iEmanuele: การเปลี่ยนแปลงที่ดูเหมือนจะไม่มีผลกระทบ (ฉันคิดเหมือนกัน) ฉันเห็นว่าจากบทความนี้: thethemefoundry.com/blog/…
Kegan Quimby

1
มีการ_price_rentedตั้งค่าจริงสำหรับทั้งสองtrueและfalseค่าหรือเป็นเพียงการตั้งค่าสำหรับtrue? โปรดตรวจสอบฐานข้อมูล ฉันถามเพราะไม่มีการทำเครื่องหมายที่กล่องกาเครื่องหมายไม่ผ่านPOSTเลยดังนั้นฉันสงสัยว่าค่าถูกตั้งค่าทั้งหมดสำหรับกรณีเหล่านั้นหรือไม่
s_ha_dum

คำตอบ:


4

WP_Meta_Query เป็นส่วนหนึ่ง "ไม่มั่นคงดังนั้น" ในแกนกลางและถ้าคุณไม่ใส่ใจอย่างมากก็สามารถทำลายได้อย่างง่ายดาย

เมื่อคุณทำnew WP_Query()และมีmeta_query => array()ข้อโต้แย้งหรือคีย์ / คู่ค่าที่เทียบเท่าจากนั้นก็new WP_Meta_Query()กระโดดตามด้วยการแยกวิเคราะห์ทันที

$this->meta_query = new WP_Meta_Query();
$this->meta_query->parse_query_vars( $q );

ค่าที่อนุญาต

เมื่อคุณค้นหาข้อมูลเมตาแสดงว่ามีboolตัวเลือกอยู่ และหากคุณต้องการใช้มันก็จะย้อนกลับไปCHARที่ค่าเริ่มต้นซึ่งเป็นอาร์เรย์ของค่าที่อนุญาตคือ:

'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'

ที่จะถูกรีเซ็ตNUMERICSIGNED

แก้จุดบกพร่อง

มีตัวกรองจำนวนมากที่สามารถส่งผลกระทบต่อกระบวนการบันทึกโพสต์ดังนั้นสิ่งแรกที่ต้องทำคือตรวจสอบค่าต่าง ๆ ภายในลูป:

var_dump( get_post_meta( get_the_ID(), '_price_rented', true ) );

จากนั้นขึ้นอยู่กับค่าส่งคืนคุณจะต้องใช้SIGNEDหากผลลัพธ์นั้นเป็น0หรือ1หรือ"true"หรือ"false"ผลลัพธ์นั้นเป็นสตริง หากเป็นบูลีนจริงๆฉันก็ยังแนะนำให้ใช้stringเพื่อให้แน่ใจว่ามันผ่าน$GLOBALS['wpdb']ซึ่งสามารถส่งผ่าน%sสายอักขระและ%dตัวเลขผ่านเท่านั้น

หมายเหตุเพิ่มเติม

ขณะที่ผมเพิ่งอัปเดตรายการ Codex สำหรับWP_Meta_Queryวันนี้ผมเห็นว่ามีจำนวนมากกำลังของผลที่แตกต่างกัน (การเพิ่มจำนวนมากมายที่ไม่จำเป็นJOINSซึ่งจะกล่าวถึงในTrac ที่นี่และที่นี่มีออกแพทช์เดียวย้ายเข้าหลัก) ที่เป็นไปได้ (ติดตามตั๋วสำหรับANDชิ้นส่วนที่นี่ ) จุดคือมันเป็นไปได้ที่จะใช้การรวมกันของmeta_*ข้อโต้แย้งข้างmeta_queryอาร์เรย์และ subarrays ผลลัพธ์ไม่เป็นที่รู้จักมากนักนอกจากคุณจะถ่ายโอนข้อมูลดังนั้นIMHOคุณจึงควรใช้วิธีการเพิ่มอินพุตหรืออีกวิธีหนึ่ง โดยเฉพาะเมื่อคุณเท่านั้นการใช้meta_keyเนื่องจากผลลัพธ์นี้เป็น "การสืบค้นเฉพาะคีย์เท่านั้น" ในบางกรณี

สารละลาย

ตามที่ระบุไว้ในความคิดเห็น:

(... ) var_dumpส่งคืนรายการต่อไปนี้สำหรับอพาร์ทเมนต์ที่ว่างและไม่เช่า: string(0) ""และสำหรับอพาร์ทเมนต์ที่ไม่มีให้เช่าเช่า:string(1) "1"

ตอนนี้meta_queryมีการใช้

'meta_query' => array( 'relation' => 'OR', array(
    'meta_key'     => '_price_rented',
    'meta_value'   => '1',
    'meta_compare' => '='
) );

หากคุณต้องการได้รับอพาร์ทเมนท์ "ไม่ว่างให้เช่า" หรือใช้'!='เพื่อเรียกคืนอพาร์ทเมนท์ "ไม่เช่า"

หมายเหตุ: เป็นไปได้ค่าmeta_compareอยู่หรือ'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' ค่าเริ่มต้นคือ'RLIKE''='


3

ผมประสบปัญหาเดียวกันและหลังจากชั่วโมงของการค้นหาพบ"NOT EXISTS"และคุ้มค่า"EXISTS" ( only in WP >= 3.5 )ดังนั้นไม่จำเป็นต้องขอค่าเมตาเพียงตรวจสอบว่ามี meta_key อยู่หรือไม่:

'meta_key'     =>   '_price_rented'  ,
'meta_compare' =>   'NOT EXISTS'     ,

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


3

TL; DR:ปัญหานี้อาจเกิดขึ้นส่วนใหญ่เมื่อสร้างฟิลด์บูลีนเป็นทางเลือก คุณสามารถแก้ไขได้ด้วยการทำให้มันเป็นที่ต้องการหรือใช้แบบสอบถามที่ซับซ้อนมากขึ้นเพื่อดึงกรณีและปัญหาเริ่มต้น

รายละเอียดเพิ่มเติม:

มีปัญหาการแสดงข้อมูลสองปัญหาที่เกิดขึ้นที่นี่: หนึ่งคือค่าข้อมูลที่จะถูกใช้เพื่อเป็นตัวแทนของจริง / เท็จและอื่น ๆ ที่เป็นที่เก็บข้อมูลหรือไม่ถ้ามันเป็นค่าเริ่มต้น (มักจะเท็จ) ค่า

ส่วนที่ 1: ฉันดู SQL ที่สร้างขึ้นโดยWP_Meta_Queryเปรียบเทียบกับความจริงและเท็จและพบว่าจริงจะแทนที่ '1' และสำหรับเท็จ '' (สตริงว่าง) ดังนั้นสิ่งที่คุณเขียนลงในฐานข้อมูลจำเป็นต้องเห็นด้วยกับว่าถ้าคุณจะทำแบบสอบถามเปรียบเทียบกับค่าจริงและเท็จจริง โดยเฉพาะอย่างยิ่งคุณไม่ต้องการเขียน '0' สำหรับเท็จ มันอาจจะเข้าใจผิดได้มากกว่าการเขียนและทดสอบสำหรับ 0 และ 1 แทน (และผู้สร้างแบบฟอร์มหลายคนทำเช่นนั้น) แต่ตรวจสอบเพื่อดูสิ่งที่ถูกเขียนไปยังฐานข้อมูลและเก็บไว้ในใจเมื่อสร้างแบบสอบถามของคุณ

ส่วนที่ 2: สมมติว่า false เป็นค่าเริ่มต้นการค้นหาระเบียนที่มีค่าเป็นจริงนั้นง่าย:

... 'meta_key' => 'my_key', 'meta_value' => 1 (หรือจริง)

แต่อีกด้านหนึ่งกำลังท้าทาย: อาจมีค่าเท็จหรืออาจไม่มีค่าใด ๆ เลย สิ่งนี้สามารถเกิดขึ้นได้หากค่าถูกระบุว่าเป็นทางเลือกในรูปแบบ --- ตราบใดที่ผู้ใช้ไม่ได้ตั้งค่าไว้อย่างชัดเจนหรือเปลี่ยนแปลงค่านั้นจะไม่ถูกเพิ่มลงในฐานข้อมูล โปรดทราบว่าหากคุณใช้งานเพียงอย่างเดียวget_post_metaมันจะทำงานได้ดีด้วยวิธีนี้: การคืนค่าเท็จและการคืนค่าไม่มีค่าใดจะสำเร็จในสิ่งเดียวกัน

แต่เมื่อคุณใช้WP_Queryมันไม่ง่ายเลย (หรือถ้าเป็นฉันก็ยังไม่ทราบวิธี)

คุณมีสองตัวเลือก (หรืออาจจะสาม):

  1. ตรวจสอบให้แน่ใจว่าฟิลด์นั้นได้รับการกำหนดค่าเริ่มต้นเป็นค่าจริงเสมอ ในบางผู้สร้างแบบฟอร์มคุณทำสิ่งนี้โดยการทำให้ฟิลด์ที่ต้องการและให้มันเป็นค่าเริ่มต้น จากนั้นคุณสามารถทดสอบ...'meta_value' => 0 ได้อย่างน่าเชื่อถือ

  2. ทำสองแบบสอบถามแรกที่ทดสอบสำหรับค่าเท็จและที่สองทดสอบซึ่งไม่มีค่า สิ่งเหล่านี้สามารถรวมกันเป็น WP_Query เดียวเช่นนี้

    meta_query => {
        relation => 'OR'
        array(
            'key'     => 'my_key',
            'value'   => 0,
            'compare' => '='
        ),
        array(
            'key'     => 'my_key',
            'compare' => 'NOT EXISTS',
        ),
    )
    

นี่อาจจะไม่ใช่แบบสอบถามที่มีประสิทธิภาพ มันอาจจะเป็นการดีกว่าที่จะคืนค่าวัตถุทั้งหมดและกรองในรหัสของคุณทั้งนี้ขึ้นอยู่กับปัจจัยหลายอย่าง

  1. เป็นไปได้ที่จะใช้ 'ไม่มีค่า' เพื่อหมายถึงเท็จ การทำเช่นนี้เมื่อใดก็ตามที่มีมูลค่าที่ควรจะตั้งค่าเป็นเท็จคุณจะต้องลบค่าเมตาแทนการอัปเดตมัน

ในกรณีนั้น'NOT EXISTS'แบบสอบถามแบบเดี่ยวจะส่งคืนวัตถุที่ถูกต้องได้อย่างน่าเชื่อถือ (ฉันไม่คิดว่าผู้สร้างแบบฟอร์มหรือปลั๊กอินจำนวนมากสนับสนุนพฤติกรรมนี้ดังนั้นฉันจะใช้เฉพาะในรหัสที่กำหนดเองเท่านั้น)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.