ความสัมพันธ์หลายอย่างสำหรับ tax_query หลายรายการใน WP_Query


10

ฉันต้องการใช้WP_Query()คลาสเพื่อกรองโพสต์ของฉัน ปัญหาที่ฉันเผชิญอยู่ในขณะนี้คือการจัดการแบบสอบถามอนุกรมวิธาน โดยปกติแล้วWP_Query()จัดการเพียงหนึ่งความสัมพันธ์สำหรับtax_query()(หรือ AND หรือ OR) แต่สิ่งที่ฉันต้องการคือการใช้ความสัมพันธ์เหล่านี้ผสมกันในการtax_query()ทำอย่างไรจึงจะประสบความสำเร็จได้
เช่น

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

ฉันรู้รหัสข้างต้นไม่ทำงานฉันต้องใช้WP_Query()ตัวกรองเพื่อทำมันหรือไม่? ความคิดใด ๆ

คำตอบ:


10

สิ่งนี้สามารถทำได้โดยใช้ term_taxonomy_id แทนกระสุนซึ่งจะไม่สนใจว่าจะระบุ taxonomy ใดได้อย่างมีประสิทธิภาพและเพียงแค่ดูที่ฟิลด์เฉพาะ term_taxonomy_id สิ่งนี้จะช่วยให้คุณสามารถสร้างความสัมพันธ์ที่หลากหลายได้อย่างมีประสิทธิภาพ คุณต้องการใช้ความสัมพันธ์โดยรวมของ AND และใส่คำทั้งหมดที่ควรจะเกี่ยวข้องหรือในรายการเดียวโดยใช้ตัวดำเนินการ IN คุณจะต้องแมปคำศัพท์ที่ต้องการกับ term_taxonomy_ids ก่อน

$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );

foreach ( $taxes as $tax ) {
    $terms = get_terms( $tax );

    foreach ( $terms as $term )
        $tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}


$args['tax_query'] => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'taxonomy1',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy1'][$slug] )
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy3',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy3'][$slug] ),
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy4', // gets ignored
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

โปรดทราบว่า pre-3.5 คุณจะต้องระบุ'include_children' => falseด้วย ดูตั๋ว Trac นี้ได้ที่https://core.trac.wordpress.org/ticket/21228


6
โปรดแก้ตัวและแจ้งเตือนฉันถึงข้อผิดพลาด / ความไม่ถูกต้อง :) พิมพ์ด้วยมือข้างเดียวกับทารกคนอื่น
helenhousandi

1
สถานที่ที่ไม่$slugได้มาจาก ... ?
vancoder

1
เพียงแค่ตัวยึดตำแหน่งในรหัส ฉันคิดว่ามันคือ $ term1 ฯลฯ ในคำถามเดิม
helenhousandi

คุณพูดถูก! วิธีนี้ดูเหมือนจะใช้ได้ ฉันจะให้มันทดสอบและกลับมาลงคะแนนสำหรับคำตอบนี้ถ้ามันทำงาน ขอบคุณ
ron_dev

ดูเหมือนว่า 'taxonomy' => 'taxonomy4', // gets ignoredไม่สามารถปฏิเสธได้ หากฉันใส่ข้อความแบบสุ่มในฟิลด์นี้ไม่พบผลลัพธ์ เฉพาะเมื่อฉันกำหนดชื่อ taxonomy จริงมันจะให้ผลลัพธ์แก่ฉัน มีความคิดอะไรบ้าง
ron_dev

1

ฉันใช้งานได้อย่างคล่องแคล่วสำหรับtax_queryผู้meta_queryใช้หลายคนหรือ / และผู้ประกอบการเช่นนี้


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