Özel posta tipleri, taksonomiler ve kalıcı bağlantılar


62

Bu beni deli ediyor ve eminim basit ama aradığım hiçbir şey basit bir yapıya sahip değil (her şey çok karmaşık).

Özel bir yazı türüne product_listingve özel bir taksonomisine sahibim product_cat(ki bu hiyerarşiktir ve benzer kategorilere sahip olmalıdır).

Sadece URL'lerin şöyle görünmesini istiyorum:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Ama hayatım boyunca, ne yaparsam yapayım, 404 sorununu anlıyorum. Sayfalar iyi çalışıyor ve Gönderiler iyi çalışıyor ancak özel gönderilerim düzgün çalışmıyor. Şunu gösteriyorlar:

mysite.com/products/product-name1
mysite.com/products/product-name2

Bu gerçekten işe yarıyor ! Sadece özel taksonomimi orada görmek istiyorum, ayrıca şu şekilde taxonomy.phpayarlayarak kurduğum şablona da erişebilmek istiyorum :

mysite.com/products/category1/
mysite.com/products/category2/

Sümüklü böceklerimin hiçbiri aynı değil, onların olmasını da istemiyorum. İşte dosyamın yazı tipi ve taksonomisi kısmı functions.php:

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

Ayrıca, bir scentsçeşit dostça url'ye sahip olmak istediğimden daha özel bir taksonomiye sahibim ama bu konuda daha açıkım. Tüm koku listesine gidip, belki mysite.com/products/scentsde kategoriye özel olmak zorunda olmadıklarını söyleyebilirim .

Birisi bana yardım edebilir mi?

Yanıtlar:


63

Değişim slugiçin yazılan tipi argümanlar içinde products/%product_cat%ve slugsizin taksonomisi argümanları sadece üzere products, sonra kuralları yeniden yıkayın. WordPress şimdi ele almalı /products/my-product-cat/post-name/!

Şimdi nihayet, WordPress'e kalıcı bağlantılar oluşturma konusunda biraz yardım etmemiz gerekiyor (kutudan çıktığında permastruct etiketini tanımıyor %product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

Unutulmaması gereken bir şey, bu sadece ismiyle sipariş edilen yazı için ilk ürün kategorisini kapacak . Tek bir ürüne birden fazla kategori atadıysanız, kalıcı bağlantıda hangisinin kullanılacağını nasıl belirleyeceğini kolayca değiştirebilirim.

Lemme, bununla nasıl başa çıktığını biliyor ve diğer sorunları çözebiliriz!


Oh WOW Huşu yaşıyorum! Bu çalıştı! En sonunda! Hiç bir şeyin olacağını düşünmedim !!! SOOOOOO teşekkür ederim çok !!! ............ Şimdi, taksonomi URL'sini kendi kendine kapmak için nasıl bir link (the_permalink gibi bir şey) oluşturabilirim? / products / my-product-cat /
RodeoRamsey 14:10

Sanırım işe yaradı ^ ^ ^ ............ ama şimdi Pagination üzerinde sıkışıp kaldım. Herhangi bir sayfalama işlemi (özel işlev veya yerleşik) / products / my-product-cat / tamam görünüyorsa kırılmış gibi görünüyor / tamam / ürünler / my-product-cat / page / 2/404 döndürür ve taxonomy.php dosyasını buraya bırakır. index.php dosyasının lehine. Bulabildiğim her şeyi ve hala hiçbir şeyi denedim.
RodeoRamsey

1
Yeniden yazılan tek ürünü değiştirmeyi düşünür müsünüz product/cat-name/product-name? (tekilliği not edin) Sorun, taksonomi sayfalandırması için yeniden yazma kuralının tetiklenmemesidir, çünkü tek ürünler için daha önceki bir kural tarafından yakalanmaktadır!
TheDeadMedic

Ben ona açığım. Ancak, kafamın etrafına dolanması, bir 'kategori' sayfasına karşı tek bir ürün sayfasını görüntülüyorsanız, ürünlerin farklı bir URL yoluna sahip olacağı anlamına mı gelir? Yani bekar ürün / kedi ismi / eşya adı olabilir, ancak kediler ürün / kedi ismi / olur mu? Bu tür "insan dostu" URL'lerin amacını yitirmez mi? Müvekkillerimin wp panosunu öğrenmelerine yardımcı olmakta zorlanıyorum, bu farkı tek başıma bırakın ... Yanlış anlıyorsam lütfen bana bildirin! Ayrıca ürün-kedi / ürün-adı ve sadece ürün-kedi / gibi NO ön dizinlerinden memnun olabilirim . Bu işe yarayabilir mi?
RodeoRamsey

2
Anladınız - arşivler ( ) ve tekil öğeler ( ) arasında açık bir ayrım olduğu için "insan dostu" olduğunu söylesem de . Ve hayır, 'ön dizini' saklardım - yazılardan ve sayfalardan açık bir ayrım yapmanıza yardımcı olur, ayrıca aksi takdirde performans sorunlarıyla (yani ayrıntılı yeniden yazma kuralları) sonuçlanabilirsiniz. products/product/
TheDeadMedic

6

Thanks @ TheDeadMechanic, cevabınız bana yardımcı oldu, ama sadece kısmen. @RodeoRamsey'nin istediği şeyi yapmak istedim, ancak iç içe kategoriler (yani:) ile mysite.com/products/category1/child-category-1/grandchild-category-1/product-nameçözümünüz bunun için işe yaramadı.

Sonunda işe yarayan soruma genişletilmiş bir çözüm buldum, bu yüzden eğer başka biri iç içe kategorilere / alt kategorilere ihtiyaç duyuyorsa, kendi sorumla ilgili ayrıntılı bir çözüm görebilirsiniz . Umarım başkalarına yardımcı olur ve ilk adımlar için teşekkürler.


4

Wp'nin bu yapıyı kutudan desteklediğinden emin değilim - ancak bunu yapmak için kendi yeniden yazma kurallarınızı kolayca oluşturabilirsiniz.

Burada daha önceki bir cevaba göz atın Yazar url yeniden yazın .

Çizgiyi değiştirebilirsiniz

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

gibi bir şeye

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

Buradaki product_cat kısmı gereksiz olabilir - Gerekip gerekmediğinden emin değilim.

İstediğiniz kuralları ekleyebilirsiniz ve dahili kurallara göre önceliği olacaktır.


Peki bu ilginç değil. Ah, sanırım özel yeniden yazma kuralları benden öte. Yukarıdaki kodu (ve diğer postadan geri kalanını) denedim ve hiçbir şey değişmedi. Her şeyi temizledim ve sonra tekrar denedim ve hala bir değişiklik yapmadım, bu yüzden özel yazı tiplerinde ve taksonomilerinde belirtilen tüm yeniden yazma kurallarını yorumladım ve hiçbir şeyi temizlemedim.
RodeoRamsey

2

Evet, özel yazı tipi için kalıcı bağlantıyı ayarlamadan önce beni deli ediyordu. Özel yazı tipini işlemek için bir eklenti buldum. Kullanımı çok kolay. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP bunu bir çekirdek özellik olarak eklemeli! Aslan burcu


Bunu daha önce görmüştüm ve "hiyerarşik olmayan" taksonomiler için dediği için kullanmaktan kaçındım. Hiyerarşik olarak ayarlanmış bir tane vardı, bu yüzden işe yarayacağını düşünmemiştim, ama şimdiye kadar hile yapmış gibi görünüyor! Ayrıca, elde etmeye çalıştığım / products / cat-name / prod-name / yapısını başarmaya çalışıyor gibi görünüyor (diğer cevaba yorum yapınız). @TheDeadMedic, bu uygun bir seçenek midir? Yoksa, yeniden yapılanma Fonksiyonları ile yapmalı mıyım?
RodeoRamsey

0

Aslında, oldukça kolay. Sadece bir satıra ihtiyacın var. İşte kodum

create_product_taxonomies () işlevi
{
// Yeni taksonomi ekleyin, hiyerarşik yapın (kategoriler gibi)
    $ labels = dizi (
        'name' => _x ('Kategoriler', 'taksonomi genel adı'),
        'singular_name' => _x ('Kategori', 'taksonomi tekil adı'),
        'search_items' => __ ('Arama Kategorileri'),
        'all_items' => __ ('Tüm Kategoriler'),
        'parent_item' => __ ('Ebeveyn Kategorileri'),
        'parent_item_colon' => __ ('Ana Kategoriler:'),
        'edit_item' => __ ('Kategori Düzenle'),
        'update_item' => __ ('Güncelleme Kategorisi'),
        'add_new_item' => __ ('Yeni Kategori Ekle'),
        'new_item_name' => __ ('Yeni Kategori Adı'),
        'menu_adı' => __ ('Kategori'),
    );

    register_taxonomy ('product_cat', dizi ('product_listing'), dizi (
        'hiyerarşik' => doğru,
        'labels' => $ etiketleri,
        'show_ui' => doğru,
        'query_var' => true,
        'rewrite' => array ('hiyerarşik' => doğru),
    ));

Ve GenerateWP.com dan İncelemeler CPT için oluşturulan taksonomisine uygulanır. Bunu kendi WordPress sitemde kullanıyorum, https://www.wpstarters.com

işlev reviews_category_taxonomy () {

    $ labels = dizi (
        'name' => _x ('Değerlendirme Kategorileri', 'Taksonomi Genel Adı', 'reviews_category'),
        'singular_name' => _x ('Değerlendirme Kategorisi', 'Taksonomi Tekil Adı', 'reviews_category'),
        'menu_name' => __ ('Değerlendirme Kategorisi', 'reviews_category'),
        'all_items' => __ ('Tüm İnceleme Kategorileri', 'reviews_category'),
        'parent_item' => __ ('Üst İnceleme Kategorisi', 'reviews_category'),
        'parent_item_colon' => __ ('Üst İnceleme Kategorisi:', 'reviews_category'),
        'new_item_name' => __ ('Yeni İnceleme Kategorisi Adı', 'reviews_category'),
        'add_new_item' => __ ('Yeni İnceleme Kategorisi Ekle', 'reviews_category'),
        'edit_item' => __ ('İnceleme Kategorisini Düzenle', 'reviews_category'),
        'update_item' => __ ('Güncelleme İnceleme Kategorisi', 'reviews_category'),
        'view_item' => __ ('İnceleme Kategorisini Görüntüle', 'reviews_category'),
        'separa_items_with_commas' => __ ('Öğeleri virgülle ayır', 'reviews_category'),
        'add_or_remove_items' => __ ('Öğe ekle veya kaldır', 'reviews_category'),
        'choose_from_most_used' => __ ('En çok kullanılanlardan seç', 'reviews_category'),
        'popular_items' => __ ('Popüler İnceleme Kategorileri', 'reviews_category'),
        'search_items' => __ ('Arama Öğeleri', 'reviews_category'),
        'not_found' => __ ('Bulunamadı', 'reviews_category'),
        'no_terms' => __ ('İnceleme Kategorisi Yok', 'reviews_category'),
        'items_list' => __ ('İnceleme Kategorileri Listesi', 'reviews_category'),
        'items_list_navigation' => __ ('Kategori listesi gezinmesini incele', 'reviews_category'),
    );
    $ args = dizi (
        'labels' => $ etiketleri,
        'hiyerarşik' => doğru,
        'public' => doğru,
        'show_ui' => doğru,
        'show_admin_column' => doğru,
        'show_in_nav_menus' => doğru,
        'show_tagcloud' => yanlış,
        'show_in_rest' => doğru,
        'rewrite' => array ('hiyerarşik' => doğru),
    );
    register_taxonomy ('reviews_category', dizi ('wps_reviews'), $ args);

}
add_action ('init', 'reviews_category_taxonomy', 0);

Tek ihtiyacınız olan bu yüzden 'rewrite' => array ('hierarchical' => true) koyun,

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.