Memasukkan istilah dalam Taksonomi Hierarkis

17

Saya benar-benar mengalami beberapa masalah dengan memasukkan istilah. Ini skenario saya: Saya punya taksonomi yang disebut 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);

Jelas ini hierarki. Level atas berisi tipe rilis ieDVD, blu-ray. Tingkat di bawah itu adalah daerah yaitu. Wilayah 1, Wilayah 2, dll. Jadi, Hirarki yang saya inginkan adalah: DVD --Region 0 --Region 1 --Region 2 --Region 3 --Region 4 --Region 5 --Region 5 --Region 6 Blu-Ray - -Region A --Region B --Region C

Saya membuat fungsi yang disebut insert_term di kelas saya untuk memeriksa apakah ada istilah, lalu masukkan jika tidak:

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;
        }       
}

Dan kemudian saya memanggil fungsi kata untuk memasukkan istilah:

    $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']));

Masalah yang saya alami adalah bahwa meskipun istilah dimasukkan dalam database, mereka tidak muncul di halaman taksonomi. Paling-paling, istilah tingkat atas muncul. Saya harus mencoba berbagai hal sampai memaksa WordPress untuk mengenali istilah sublevel. Adakah yang mengalami hal ini atau dapat merekomendasikan cara yang lebih baik?

EDIT: Memperhatikan sesuatu yang lain: Saya mencoba menghapus persyaratan dari basis data kemudian menonaktifkan dan mengaktifkan kembali plugin yang menyatakan persyaratan. Dua istilah induk muncul di halaman syarat, tetapi istilah anak tidak. Istilah anak DO muncul di menu tarik turun "Induk" tempat Anda ingin membuat istilah baru. Ketika saya menambahkan istilah yang orang tuanya adalah salah satu istilah anak dan menyegarkan halaman, MAKA istilah anak muncul. masukkan deskripsi gambar di sini

Manny Fleurmond
sumber
Setelah melakukan riset, sepertinya harus melakukan sesuatu dengan istilah cache. Tidak yakin apakah atau bagaimana saya bisa membersihkan cache secara konsisten untuk memperbaruinya.
Manny Fleurmond

Jawaban:

25

Hirarki di-cache dan tidak divalidasi dengan benar. Ini adalah bug, masih belum terselesaikan pada WP 3.1.

Solusinya adalah menelepon delete_option("{$taxonomy}_children");langsung.

Lihat fungsi _get_term_hierarchy ().

scribu
sumber
Saya merasa itu adalah masalah caching. Haruskah saya memasukkan ini sebelum atau setelah saya memasukkan setiap anak?
Manny Fleurmond
2
Mengambil penyegaran ekstra tetapi menempatkan kode delete_option setelah memasukkan semua istilah turunannya berhasil. Terima kasih, scribu. Ini layak untuk poin rep saya menyerah. Semoga ini bisa membantu orang lain dengan masalah yang sama
Manny Fleurmond
Terima kasih! Saya hanya menghabiskan 4 jam untuk ini. Segera setelah saya sampai pada ide melakukan diff db sebelum dan sesudah menambahkan istilah melalui admin GUI saya melihat opsi dan tahu apa yang harus Google datang ke sini.
Per Wiklander
6

2 sen saya - Saya sedang membangun ekstensi untuk plugin WooCommerce yang memungkinkan kategori katalog / manajemen produk melalui file CSV yang diunggah. Saya mengalami masalah yang sama saat membuat kategori. Solusi untuk menghapus kategori WooCommerce yang di-cache adalah menelepon delete_option("product_cat_children");setelah loop yang membuat kategori dan sub-kategori. Semoga ini bisa membantu orang lain!

Desain BWD
sumber
2

Anda mungkin dapat menerima objek kembali dari term_exists($term, $taxonomy, $parent)jika taksonomi diatur saat dipanggil. Sudah diatur dalam kode sampel yang Anda posting, jadi saya berasumsi itu masalahnya.

Pernyataan sisipan Anda mengharapkan sebuah array ketika mereka merujuk kunci ..

Misalnya.

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

..tapi Anda mungkin benar-benar mendapatkan objek kembali term_exists.

Cara cepat untuk menentukan apakah itu masalahnya adalah memperbarui baris ini.

return $result;

untuk..

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

Jika saya benar dan itu masalahnya, itu harus memperbaikinya, meskipun saya tidak akan menyebutnya perbaikan elegan.

Semoga itulah jawaban / bantuan yang Anda cari .. :)

t31os
sumber
Maaf atas jawaban yang terlambat. Terima kasih telah menangkapnya, tetapi saya pikir itu tidak menyelesaikan masalah yang saya miliki.
Manny Fleurmond
1

Terima kasih. Pertanyaan ini banyak membantu. Saya berjuang dengan unit test dan ternyata harus saya lakukan

delete_option('veda_release_type');
wp_cache_flush();

setelah menambahkan kategori tingkat atas saya, dan kemudian melakukannya lagi setelah menambahkan kategori tingkat kedua untuk memungkinkan wordpress menghapus semuanya dan membiarkan unit test lulus. Ini berfungsi di sekitar kebutuhan untuk "memuat halaman kedua / refresh ekstra" sebagaimana dimaksud dalam jawaban lain di sini.

Steve
sumber
1

solusi saya:

(mungkin diperlukan untuk membersihkan catatan cache ..)

$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();
T.Todua
sumber
Tolong jelaskan jawaban Anda serta hanya memposting kode.
s_ha_dum