แยก Taxonomy อย่างมีประสิทธิภาพ


9

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

ตัวอย่างเช่นฉันจะใช้ร้านค้า

ได้รับ:

  • อนุกรมวิธานของแบรนด์ผลิตภัณฑ์
  • อนุกรมวิธานกลุ่มผลิตภัณฑ์
  • ประเภทโพสต์ผลิตภัณฑ์
  • เทมเพลตเก็บถาวรสำหรับ taxonomies ด้านบน

วิธีที่มีประสิทธิภาพมากที่สุดคือวิธีการแสดงเมนูแบรนด์เมื่ออยู่ในการจัดเก็บประเภทผลิตภัณฑ์และประเภทผลิตภัณฑ์เมื่ออยู่ในการจัดเก็บแบรนด์ แต่จะแสดงเฉพาะคำที่ใช้กับการโพสต์ในกลุ่มนั้น

ตัวอย่างเช่นถ้าฉันอยู่ในกลุ่มผลิตภัณฑ์ 'ผู้หญิง' มันจะแสดงแบรนด์ทางด้านซ้าย แต่เฉพาะแบรนด์ที่ระบุไว้สำหรับผลิตภัณฑ์ในกลุ่มผลิตภัณฑ์ 'ผู้หญิง' เช่นแบรนด์ 'Fancy womens clothes Inc' จะแสดง แต่ไม่ใช่ 'Manly mens Manly ltd'

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

แก้ไข: ตัวอย่างที่ 2:

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

คำตอบ:


13

เพื่อพูดคุยเรื่องนี้เป็นปัญหาในการเรียกดูเงื่อนไขทั้งหมดของ taxonomy A ที่โพสต์ด้วยคำเฉพาะของ taxonomy B มี

แม้ว่านี่จะเป็นไปไม่ได้ในหลาย ๆ ขั้นตอนและมีการวนลูปผ่านโพสต์ (ซึ่งจะไม่มีประสิทธิภาพแน่นอน) แต่ฉันคิดว่ามันสมเหตุสมผลที่จะใช้ SQL เพื่อประสิทธิภาพ

สิ่งที่ฉันทำคร่าวๆคือ:

/**
 * Get all terms of $tax_to taxonomy that posts in $term_from of $tax_from have.
 *
 * @param string $tax_from  taxonomy name
 * @param string $term_from term slug
 * @param string $tax_to    taxonomy name
 *
 * @return array|WP_Error
 */
function get_intersected_terms( $tax_from, $term_from, $tax_to ) {

    global $wpdb;

    $term_from = get_term_by( 'slug', $term_from, $tax_from );

    $query = "
    SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = '{$tax_to}' AND term_taxonomy_id IN (
        SELECT term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN (
            SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = {$term_from->term_taxonomy_id}
        )
    )
    ";

    $term_ids = $wpdb->get_col( $query );

    if( empty( $term_ids) )
        return array();

    return get_terms( $tax_to, array( 'include' => $term_ids ) );
}

// example
var_dump( get_intersected_terms( 'category', 'cat-a', 'post_tag' ) );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.