ฉันจะสร้าง meta_query ด้วยอาร์เรย์เป็น meta_field ได้อย่างไร


16

นี่คือ args สำหรับการค้นหาของฉัน:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
        )
    )
);

สิ่งนี้ใช้ได้เมื่อtopicsเป็นสตริง แต่ไม่ใช่เมื่อเป็นอาร์เรย์ ฉันต้องการให้แบบสอบถามนี้ทำงานเมื่อtopicsเป็นตัวอย่างarray( 'sports', 'nonprofit', etc. )

มีวิธีสร้างแบบสอบถาม meta ด้วยอาร์เรย์เป็น meta_key หรือไม่


โปรดอธิบาย - คุณหมายถึงว่าค่าที่เก็บไว้ของ "หัวข้อ" เป็นอาร์เรย์หรือไม่ หรือว่าค่าที่เก็บไว้เป็นสตริงและคุณต้องการส่งหลายคำไปยังแบบสอบถามในอาร์เรย์หรือไม่
MathSmath

@MathSmath ฉันหมายความว่าค่าที่เก็บไว้เป็นอาร์เรย์
mike23

คำตอบ:


31

ป้อนแบบสอบถามอาร์เรย์ของค่าที่เป็นไปได้

หากค่าในฐานข้อมูลเป็นสตริงและคุณต้องการฟีดแบบสอบถามหลายค่า:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => array ( 'sports', 'nonprofit', 'community' ),
            'compare' => 'IN'
        )
    )
);

ค้นหาค่าเฉพาะในอาร์เรย์ของข้อมูลที่มีลำดับ

หากค่าในฐานข้อมูลเป็นอาร์เรย์ของหัวข้อต่างๆและคุณต้องการค้นหาหัวข้อเดียวภายในอาร์เรย์นั้น (โปรดทราบว่าอาร์เรย์ในฐานข้อมูลสามารถเรียกคืนได้เช่นนั้น แต่อยู่ในฐานข้อมูลในรูปแบบต่อเนื่องซึ่งเป็น สตริงด้วย):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

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

ถัดจากนั้นตัวเลือกอื่น ๆ ของคุณเท่านั้นที่จะเรียกดูโพสต์ทั้งหมดที่มีการตั้งค่าmeta_key " topic " และวนซ้ำด้วยตนเองหรือกล่าวอีกนัยหนึ่งให้ตรวจสอบค่าภายในลูปและแสดงโพสต์ตามเงื่อนไขที่กล่าวไว้


14

หากต้องการออกไปจากการตอบสนองของโยฮันเนสเนื่องจากเป็นอาเรย์ที่ต่อเนื่องกันหากคุณบังเอิญเก็บบางอย่างเช่นชื่อผู้ใช้ (ซึ่งเป็นกรณีของฉัน) คุณอาจต้องจัดการกับมันให้แตกต่างกันเล็กน้อย

โพสต์เมตากำลังถูกบันทึกเช่น:

array( "1", "23", "99");

ดังนั้นใช่พวกเขาเป็นจำนวนเต็ม แต่ผ่านupdate_post_metaพวกเขาถูกบันทึกเป็นสตริง

'meta_query' => array(
            array(
                    'key'     => 'my_meta_key',
                    'value'   => serialize( strval( 1 ) ),
                    'compare' => 'LIKE'
                )
            )

ดังนั้นคุณกำลังทำการเปรียบเทียบ LIKE กับสตริงสตริงที่เป็นอนุกรมของสิ่งที่คุณต้องการ ฉันใช้เวลาสองสามชั่วโมงในการพยายามทำสิ่งนี้ให้ได้และนี่ก็เป็นสิ่งที่ดีที่สุดที่ฉันจะได้รับ


ทำให้เป็นอันดับ (strval (1)) แก้ปัญหาของฉันขอบคุณ
Behzad

มาข้ามคำตอบเก่าโดยบังเอิญในวันนี้ ฉันชอบการเพิ่มของคุณ +1
Johannes Pille

ฉันเพิ่งเจอสิ่งนี้เช่นกันสิ่งที่ฉันต้องได้รับการโพสต์ทั้งหมดที่ user_id ไม่ได้อยู่ในอาร์เรย์ แต่วิธีการแก้ปัญหาข้างต้นไม่ทำงานดังนั้นฉันจึงทำเช่นนี้: 'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) ) เพราะเมื่อบันทึกค่าทั้งหมดเป็นอนุกรมเช่น: ' :ราคา;'
Bobz

4

การปรับปรุงเล็กน้อยอีกจากคำตอบ @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 แทน


นี่ควรเป็นคำตอบที่เลือกเชื่อถือได้มากที่สุด
อามิน

2

ฉันจะไปหาคำตอบของโยฮันเนส อย่างไรก็ตามฉันต้องการที่จะปรับปรุงเนื่องจากใช้ meta_query นั้นคุณจะพบกับกรณีเช่นนี้

คุณค่าของคุณคือ

array('sports','movies', 'sports2');

เมื่อคุณค้นหา

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

ผลลัพธ์จะส่งคืนทั้ง 'sport' และ 'sport2'

หากต้องการแก้ไขให้เปลี่ยน meta_query เป็น

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports";',
            'compare' => 'LIKE'
        )
    )
);

เป็นเพราะค่านั้นเป็นอนุกรมในฐานข้อมูลและแต่ละรายการจะถูกคั่นด้วยเครื่องหมายอัฒภาค ดังนั้น args ข้างต้นจะทำงาน

หากรายการที่มีค่าเป็นตัวเลขคุณเพียงแค่ลบเครื่องหมายคำพูดคู่ "

$args = array(
        'post_type' => 'news',
        'meta_query' => array(
            array(
                'key' => 'topics',
                'value' => '1;',
                'compare' => 'LIKE'
            )
        )
    );

1

ฉันเดินโซเซด้วยบางอย่างที่คล้ายกันในวันนี้ ฉันต้องค้นหาฟิลด์ความสัมพันธ์ ACF (ฟิลด์ที่กำหนดเองขั้นสูง) กับผู้ใช้ที่เกี่ยวข้องหลายคน (อาร์เรย์)

หลังจากอัปเดตฟิลด์ด้วย php แล้วแบบสอบถามไม่ทำงาน หลังจากอัปเดตผ่าน ACF UI แบบสอบถามจะทำงาน

ปัญหาคือรหัส php ของฉันตั้งค่าความสัมพันธ์เป็นค่า int ส่วน UI ตั้งค่าเป็นค่าสตริง เพื่อให้แน่ใจว่าทั้งสองงานฉันใช้แบบสอบถามนี้ทันที (ติดตั้งกับตัวอย่างที่นี่):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'topics',
            'value' => '1;',  // works for int-array
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'topics',
            'value' => '"1"',  // works for string-array
            'compare' => 'LIKE'
        ),
    )
);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.