การใส่คำศัพท์ลงในอนุกรมวิธานแบบลำดับชั้น


17

ฉันมีปัญหาเล็กน้อยเกี่ยวกับเงื่อนไขการแทรก นี่คือสถานการณ์ของฉัน: ฉันมี taxonomy ที่เรียกว่า veda_release_type:

//Release Type and Region
        $labels = array(
            'name'=> _x('Release Types/Regions', 'taxonomy general name' ),
            'singular_name' => _x('Release Type/Region', 'taxonomy singular name'),
            'search_items' => __('Search Release Types/Regions'),
            'popular_items' => __('Popular Release Types/Regions'),
            'all_items' => __('All Release Types/Regions'),
            'edit_item' => __('Edit Release Type/Regions'),
            'edit_item' => __('Edit Release Type/Region'),
            'update_item' => __('Update Release Type/Region'),
            'add_new_item' => __('Add New Release Type/Region'),
            'new_item_name' => __('New Release Type/Region Name'),
            'separate_items_with_commas' => __('Seperate Release Types/Regions with Commas'),
            'add_or_remove_items' => __('Add or Remove Release Types/Regions'),
            'choose_from_most_used' => __('Choose from Most Used Release Types/Regions')
        );
        $args = array( 
            'hierarchical' =>true,  
            'labels' => $labels,  
            'query_var' => true,  
            'rewrite' => array('slug' =>'release_type')     
        );
        register_taxonomy('veda_release_type', 'veda_release',$args);

เห็นได้ชัดว่ามันเป็นลำดับชั้น ระดับสูงสุดประกอบด้วยประเภทการเปิดใช้งานเช่น DVD, Blu-ray ระดับใต้นั้นคือภูมิภาคเช่น ภาค 1 ภาค 2 ฯลฯ ลำดับชั้นที่ฉันต้องการคือ: DVD - ภูมิภาค 0 - ภูมิภาค 1 - ภูมิภาค 2 - ภูมิภาค 3 - ภูมิภาค 4 - ภูมิภาค 5 - ภูมิภาค 6 Blu-Ray - - ภูมิภาค A - ภูมิภาค B - ภูมิภาค C

ฉันสร้างฟังก์ชั่นที่ชื่อว่า insert_term ในชั้นเรียนของฉันเพื่อตรวจสอบว่ามีคำใดคำหนึ่งอยู่แล้วใส่มันถ้ามันไม่:

public function insert_term ($term, $taxonomy, $args = array()) {
        if (isset($args['parent'])) {
            $parent = $args['parent'];
        } else {
            $parent = 0;
        }
        $result = term_exists($term, $taxonomy, $parent);
        if ($result == false || $result == 0) {
            return wp_insert_term($term, $taxonomy, $args);             
        } else {
            return (array) $result;
        }       
}

จากนั้นฉันก็เรียกฟังก์ชั่นดังกล่าวเพื่อแทรกคำศัพท์:

    $dvd = $this->insert_term('DVD','veda_release_type');
    $this->insert_term('Region 0','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 1','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 2','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 3','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 4','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 5','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 6','veda_release_type',array('parent'=>$dvd['term_id']));

    $bd = $this->insert_term('Blu-Ray', 'veda_release_type');
    $this->insert_term('Region A','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region B','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region C','veda_release_type',array('parent'=>$bd['term_id']));

ปัญหาที่ฉันมีอยู่คือแม้ว่าคำต่างๆจะถูกป้อนลงในฐานข้อมูล แต่ก็ไม่ปรากฏในหน้าอนุกรมวิธาน อย่างน้อยที่สุดคำศัพท์ระดับสูงสุดจะปรากฏขึ้น ฉันต้องลองสิ่งต่าง ๆ จนกว่ามันจะบังคับให้ WordPress จำคำศัพท์ย่อยได้ มีใครพบปัญหานี้หรือแนะนำวิธีที่ดีกว่า

แก้ไข: พบสิ่งอื่น: ฉันพยายามลบคำศัพท์ออกจากฐานข้อมูลจากนั้นปิดใช้งานและเปิดใช้งานปลั๊กอินที่ประกาศเงื่อนไขอีกครั้ง คำหลักสองคำปรากฏขึ้นในหน้าเงื่อนไข แต่คำศัพท์ย่อยไม่ได้ คำศัพท์ย่อยจะแสดงในเมนูแบบเลื่อนลง "ผู้ปกครอง" ซึ่งคุณต้องการสร้างคำใหม่ เมื่อฉันเพิ่มคำที่ผู้ปกครองเป็นหนึ่งในเงื่อนไขย่อยและรีเฟรชหน้าจากนั้นข้อกำหนดย่อยจะปรากฏขึ้น ป้อนคำอธิบายรูปภาพที่นี่


หลังจากทำการวิจัยบางอย่างดูเหมือนว่าอาจต้องทำอะไรบางอย่างกับแคชข้อกำหนด ไม่แน่ใจว่าฉันจะลบแคชได้อย่างสม่ำเสมอหรือไม่เพื่อให้ได้รับการอัปเดต
Manny Fleurmond

คำตอบ:


25

ลำดับชั้นแคชและไม่ถูกต้องอย่างถูกต้อง นี่เป็นข้อผิดพลาดซึ่งยังไม่ได้รับการแก้ไขตั้งแต่ WP 3.1

วิธีแก้ปัญหาคือการโทรdelete_option("{$taxonomy}_children");โดยตรง

ดูฟังก์ชัน _get_term_hierarchy ()


ฉันรู้สึกว่ามันเป็นปัญหาการแคช ฉันควรจะใส่สิ่งนี้ก่อนหรือหลังฉันใส่เด็กแต่ละคน?
Manny Fleurmond

2
รับการรีเฟรชเป็นพิเศษ แต่การวางรหัส delete_option หลังจากการใส่คำศัพท์ย่อยทั้งหมดนั้นเป็นเคล็ดลับ ขอบคุณนะ scribu นี่เป็นสิ่งที่คุ้มค่ากับคะแนนตัวแทนที่ฉันยอมแพ้ หวังว่านี่จะช่วยผู้อื่นที่มีปัญหาคล้ายกัน
Manny Fleurmond

ขอบคุณ! ฉันเพิ่งใช้เวลา 4 ชั่วโมงในการนี้ ทันทีที่ฉันมาถึงความคิดในการสร้างความแตกต่างของฐานข้อมูลก่อนและหลังการเพิ่มคำผ่าน admin GUI ฉันเห็นตัวเลือกและรู้ว่า Google จะมาที่นี่ได้อย่างไร
ต่อ Wiklander

6

My 2 cents - ฉันกำลังสร้างส่วนขยายสำหรับปลั๊กอิน WooCommerce ที่อนุญาตหมวดหมู่แคตตาล็อก / การจัดการผลิตภัณฑ์ผ่านไฟล์ CSV ที่อัปโหลด ฉันพบปัญหาเดียวกันนี้เมื่อสร้างหมวดหมู่ วิธีการล้างหมวดหมู่ WooCommerce ที่แคชไว้คือการโทรdelete_option("product_cat_children");หลังจากวนซ้ำที่สร้างหมวดหมู่และหมวดหมู่ย่อย หวังว่านี่จะช่วยคนอื่นได้!


2

คุณอาจได้รับวัตถุคืนจาก term_exists($term, $taxonomy, $parent)ถ้า taxonomy ถูกตั้งค่าเมื่อถูกเรียก มันตั้งอยู่ในรหัสตัวอย่างที่คุณโพสต์ดังนั้นฉันคิดว่านั่นเป็นปัญหา

ใบแจ้งยอดของคุณคาดหวังว่าจะมีอาร์เรย์เมื่อพวกเขาอ้างถึงคีย์ ..

เช่น.

$bd['term_id']
$dvd['term_id']

.. แต่คุณอาจได้รับวัตถุคืนจากจริง term_existsจริง

วิธีที่รวดเร็วในการตรวจสอบว่าเป็นปัญหาที่จะปรับปรุงบรรทัดนี้

return $result;

ถึง..

return is_object( $result ) ? (array) $result : $result;

หากฉันพูดถูกและเป็นปัญหานั่นน่าจะแก้ไขได้ แต่ฉันจะไม่เรียกมันว่าการแก้ไขที่สง่างาม

หวังว่านั่นคือคำตอบ / ช่วยคุณกำลังมองหา .. :)


ขออภัยสำหรับการตอบกลับปลาย. ขอบคุณสำหรับการจับ แต่ฉันไม่คิดว่าจะแก้ปัญหาที่ฉันมี
Manny Fleurmond

1

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

delete_option('veda_release_type');
wp_cache_flush();

หลังจากเพิ่มหมวดหมู่ระดับบนสุดของฉันแล้วทำอีกครั้งหลังจากเพิ่มหมวดหมู่ระดับที่สองเพื่อให้เวิร์ดเพรสสามารถล้างทุกอย่างและปล่อยให้การทดสอบหน่วยผ่าน วิธีนี้ใช้ได้ผลกับ "การโหลดหน้าเว็บที่สอง / การรีเฟรชพิเศษ" ซึ่งอ้างถึงในคำตอบอื่นที่นี่


1

ทางออกของฉัน:

(อาจจำเป็นต้องล้างข้อมูลแคช)

$PARENT_CAT= wp_insert_term('Parent_category_NAME','category',  array('slug'=> 'Parent_category_NAME'));
delete_option("category_children");
wp_cache_flush();

    $child= wp_insert_term('children_category_NAME','category',array( 'slug'=>'children_category_NAME', 'parent' =>$PARENT_CAT['term_id']));
    delete_option("category_children");
    wp_cache_flush();

โปรดอธิบายคำตอบของคุณเช่นเดียวกับการโพสต์รหัส
s_ha_dum

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