Hiyerarşik Taksonomiye Terimler Ekleme


17

Terim eklemekle ilgili gerçekten birkaç sorunum var. İşte benim senaryom: veda_release_type adlı bir sınıflandırma var:

//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);

Açıkçası hierchical. Üst seviye DVD, blu-ray gibi serbest bırakma tiplerini içerir. Bunun altındaki seviye bölgelerdir. Bölge 1, Bölge 2 vb. İstediğim Hiyerarşi: DVD - Bölge 0 - Bölge 1 - Bölge 2 - Bölge 3 - Bölge 4 - Bölge 5 - Bölge 6 Blu-Ray - -Bölge A --Bölge B --Bölge C

Bir terimin var olup olmadığını kontrol etmek için sınıfımda insert_term adlı bir işlev oluşturdum ve sonra yoksa ekleyin:

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

Ve sonra terimleri eklemek için adı geçen işlevi çağırırım:

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

Sahip olduğum sorun terimler veritabanına girilse bile, sınıflandırma sayfasında görünmüyor olmasıdır. En fazla, üst düzey terimler görünür. WordPress'i alt düzey terimlerini tanımaya zorlayana kadar çeşitli şeyler denemeliyim. Herkes bunun içine girdi ya da daha iyi bir yol tavsiye edebilir?

DÜZENLEME: Başka bir şey fark ettim: Veritabanından terimleri silmeyi ve ardından terimleri bildiren eklentiyi devre dışı bırakmayı ve yeniden etkinleştirmeyi denedim. İki ana terim terimler sayfasında görünür, ancak alt terimler görünmez. Alt terimler, yeni bir terim oluşturmak istediğiniz "Üst" açılır menüsünde görünür. Üst öğesi alt terimlerden biri olan bir terimi eklediğimde ve sayfayı yenilediğimde, alt terimler ortaya çıkıyor. resim açıklamasını buraya girin


Biraz araştırma yaptıktan sonra, önbellek terimleriyle bir şeyler yapmak zorunda kalabilir. Güncellenmesi için önbelleği tutarlı bir şekilde temizleyip temizlemediğimi veya nasıl edeceğimi bilmiyorum.
Manny Fleurmond

Yanıtlar:


25

Hiyerarşi önbelleğe alınır ve düzgün bir şekilde geçersiz kılınmaz. Bu, WP 3.1'den itibaren hala çözülmemiş bir hatadır.

Bir çözüm delete_option("{$taxonomy}_children");doğrudan aramak olacaktır .

_Get_term_hierarchy () işlevine bakın.


Önbellekleme sorunu olduğunu hissettim. Bunu her çocuğu yerleştirmeden önce mi, sonra mı eklemeliyim?
Manny Fleurmond

2
Ek bir yenileme alır ancak tüm alt terimleri ekledikten sonra delete_option kodunu yerleştirmek hile yapar. Teşekkürler, scribu. Bu iyi vazgeçti rep puan değdi. İnşallah bu benzer sorunları olan başkalarına yardımcı olur
Manny Fleurmond

Teşekkürler! Ben sadece bu konuda 4 saat geçirdim. En kısa sürede yönetici GUI aracılığıyla bir terim ekledikten sonra db bir fark yapma fikrine geldiğinde ben seçeneği gördüm ve buraya gelmek için Google ne biliyordu.
Wiklander başına

6

Benim 2 sent - WooCommerce eklentisi için yüklenen bir CSV dosyası aracılığıyla katalog kategorisi / ürün yönetimi sağlayan bir uzantı oluşturuyorum. Kategorileri oluştururken de aynı sorunla karşılaştım. Önbelleğe alınmış WooCommerce kategorilerini temizleme çözümü delete_option("product_cat_children");, kategorileri ve alt kategorileri oluşturan döngüden sonra çağırmaktı . Umarım bu başka birine yardımcı olur!


2

term_exists($term, $taxonomy, $parent)Sınıflandırma çağrıldığında ayarlanmışsa, muhtemelen bir nesneyi geri alıyor olabilirsiniz. Gönderdiğiniz örnek kodda ayarlanır, bu yüzden sorun olduğunu varsayıyorum.

İnsert ifadeleriniz anahtarlara başvururken bir dizi bekliyor.

Örneğin.

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

..ama aslında bir nesneyi geri alıyor olabilirsiniz term_exists.

Sorunun bu olup olmadığını belirlemenin hızlı bir yolu bu satırı güncellemektir.

return $result;

için ..

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

Eğer haklıysam ve sorun buysa, bunu düzeltmeliydim, ama ben zarif bir düzeltme demezdim.

Umarım aradığınız cevap / yardım budur .. :)


Geç cevap verdiğim için özür dilerim. Bunu yakaladığınız için teşekkür ederim ama yaşadığım problemi çözdüğünü sanmıyorum.
Manny Fleurmond

1

Teşekkürler. Bu soru çok yardımcı oldu. Birim testleri ile uğraşıyordum ve yapmam gerektiğini buldum

delete_option('veda_release_type');
wp_cache_flush();

üst düzey kategorilerimi ekledikten sonra ve wordpress'in her şeyi temizlemesine ve birim testlerinin geçmesine izin vermek için ikinci düzey kategorileri ekledikten sonra tekrar yapın. Bu, burada başka bir cevapta değinilen "ikinci sayfa yükleme / ekstra yenileme" ihtiyacını giderir.


1

çözümüm:

(belki önbellek kayıtlarının temizlenmesi gerekiyordu ..)

$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();

Lütfen yanıtı açıklayın ve sadece kodu gönderin.
s_ha_dum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.