Özel taksonomiler ve temel isim / ebeveyn vergisi / çocuk vergisi / özel posta sonrası tipi gibi özel posta türleri ile kalıcı bir yapı oluşturma


53

Bu siteyi taradım ve cevap için google'ı gördüm ve tamamen boş geldim. Temel olarak bu yazının tam olarak ne istediğini yapmak istiyorum , ancak hiyerarşik bir taksonomiye ihtiyacım var. Bu gönderide verilen cevap harika, ancak sadece tek bir seviye taksonomisiyle. İstediğimi yapmak mümkün mü? Milyonlarca şey denedim, ama hiçbiri işe yaramaz, en iyi ihtimalle doğru perlinkleri alabilirim ama onlar 404 geldi.

Ne istediğimi görsel olarak göstermek için:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

Bu paragrafı yerleşik postalar ve kategorilerle yapabilirsiniz, özel taksonomiler ve özel yazı tipleri ile nasıl yaparsınız? Ben kullanmak gerektiğini biliyoruz 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),arşiv sayfalarında çalışıyor hiyerarşik tanelerini, almak, ama ben kaldırırsanız özel yayın türünde yayınlar 404. gelip 'hierarchical' => truesonra mesajlar çalışmak parçasını, ama hiyerarşik URL'ler kaybetmek (yalnızca / basename / torun-kedi / isim / eser.

Peki, herhangi bir çözüm? Çok teşekkür ederim, bu şimdi yaklaşık 3 hafta boyunca beni deli ediyor.

Yanıtlar:


68

Bir sürü başka cevabı birleştirdikten sonra, çalışmasını sağladım! İşte burada da bununla mücadele edenlerin çözümü:

Bu yazı ve bu bana biraz yardımcı oldu, bu yüzden bu adamlar için teşekkürler.

Tüm bu kodlara ek olarak, ilk özel posta türünüzü ve taksonomi kayıt kodunu da functions.phpdosyanızda bulunduğunu unutmayın .

Özel gönderi tiplerinizi ve taksonomilerinizi tanımlarken ilk önce sümüklü böceklerinizi doğru alın: özel gönderi tipi için olması gerektiği gibi, basename/%taxonomy_name%ve taksonominiz için sümüklü böcek sadece olmalıdır basename. 'hierarchical' => trueURL’nize yerleştirilmiş terimler almak için taksonomiyi yeniden yazma dizisine eklemeyi de unutmayın . Ayrıca her iki durumda query_varda ayarlandığından emin olun true.

Yeni bir yeniden yazma kuralı eklemeniz gerekir, böylece WordPress URL yapınızı nasıl yorumlayacağınızı bilir. Benim durumumda uri'nin özel yazı tipi kısmı her zaman 5. uri segmenti olacak, bu yüzden maç kuralımı buna göre tanımladım. Daha fazla veya daha az uri segmenti kullanıyorsanız, bunu değiştirmeniz gerekebileceğini unutmayın. Farklı düzeylerde iç içe geçmiş terimleriniz varsa, son uri segmentinin özel bir yazı türü olup olmadığını veya hangi kuralı ekleyeceğini bilmek için bir taksonomi terimi olup olmadığını kontrol etmek için bir işlev yazmanız gerekir (yardıma ihtiyacınız olup olmadığını sorun ) o.

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

Daha sonra, işlenecek yazının %taxonomy_name%özel yazı tipini yeniden yazma sümüklüböcek yapınızda nasıl kullanılacağına izin vermek için bu kodu eklemeniz gerekir :

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Wordpress'in kendisine göre özel bir fonksiyon oluşturdum get_category_parents:

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

O zaman kalıcı bağlantılarınızı temizlemeniz gerekir (yalnızca kalıcı bağlantı ayarları sayfanızı yükleyin).

Şimdi her şey umarım işe yaramalı! Bir takım taksonomi terimleri yapın ve bunları doğru şekilde yerleştirin, ardından bazı özel yazı tipi yayınları yapın ve bunları doğru şekilde sınıflandırın. Ayrıca sümüklü böcek içeren bir sayfa da yapabilirsiniz basenameve her şey benim sorumla belirttiğim gibi çalışmalı. Nasıl göründüklerini kontrol etmek ve iç içe kategorilerinizi kenar çubuğunda göstermek için bir tür taksonomi widget eklentisi eklemek için bazı özel taksonomi arşiv sayfaları oluşturmak isteyebilirsiniz .

Umarım bu yardımcı olur!


Sabit - soru bakın. Jeff, açıklaman için teşekkürler! Ancak özel posttype / taxonomy yapısını göndermeniz mümkün olabilir mi? Yani neyi yanlış yapıyorum görebilirim ? Gerçekten müteşekkir olurdu!
Reitze Bos

Hey Jeff, cevabın için teşekkürler! Neredeyse oradayım, 4 saat bununla kavga ettikten sonra. Tek sorunum, posta adından önce bir çift eğik çizgi çizmem (bu şekilde: portföy / diseno-grafico-2 / logo // alquimia-sonora /) Bana yardım edebilir misin?
Cmorales

1
@Cmorales, Kodunuzu görmeden emin değilsiniz, ancak belki de cpt slug kaydı ya da filter_post_type işlevinde olduğu gibi, gönderim adınızdan önce bir eğik çizgiyi el ile tanımladığınız bir yer mi arıyorsunuz? Fazladan eğik çizgi eklediğiniz yeri bulamıyorsanız, son karakteri sadece filter_post_type_link içinde çağrılan get_taxonomy_parents işlevinin döndürülen değerinden soyun. çift. İyi şanslar.
Jeff,

1
“Farklı düzeylerde iç içe terimleriniz varsa, son uri segmentinin özel bir yazı türü veya ek kuralı eklemek için bir kural türü olup olmadığını kontrol etmek için bir işlev yazmanız gerekir (yardıma ihtiyacınız olup olmadığını sorun Bunun üzerine) ... "Bana yardım eder misin, lütfen? :)
Cmorales

2
^ tam olarak ihtiyacım olan şey buydu. kimse nasıl yapılacağını bilen var mı? burada
sorumu görün

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.