Farklı özel yazı türleri arasında ebeveyn-çocuk ilişkisi nasıl ayarlanır


14

Ben sadece bir yazı tipi "bölüm" ve bir yazı tipi "çizgi dizi" arasında bir yazı / ebeveyn ilişkisi kurduk.

Başka bir yazı türünden üst öğe atamak için meta kutusuna eklemek için bu kod biraz kullandım:

add_action('admin_menu', function() {
    remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
    } // end hierarchical check.
}

Bu, yönetici bölümünde diziyi bölümün bir üst öğesi olarak ayarlamama izin verdi, ancak gönderiyi görüntülemeye çalıştığımda, bir 404 alıyorum. Url yapısı:

domain/episodes/series-name/episode-name

Serinin URL'si:

domain/cartoon-series/series-name

Bölümün URL'sinin olmasını istiyorum:

domain/cartoon-series/series-name/episode-name

Neyi kaçırıyorum? Bir yazı türünün tamamını başka bir yazı türünün alt öğesi yapmak mümkün müdür? Böylece, bölüm listesinin URL'sini bile alabilirim:

domain/cartoon-series/series-name/episodes

Teşekkürler! Mat


İstendiği gibi, söz konusu iki özel gönderi türünün kodu şöyledir:

$labels = array(
    "name" => "Cartoon Series",
    "singular_name" => "Cartoon Series",
    "menu_name" => "Cartoon Series",
    "all_items" => "All Cartoon Series",
    "add_new" => "Add New",
    "add_new_item" => "Add New Cartoon Series",
    "edit" => "Edit",
    "edit_item" => "Edit Cartoon Series",
    "new_item" => "New Cartoon Series",
    "view" => "View",
    "view_item" => "View Cartoon Series",
    "search_items" => "Search Cartoon Series",
    "not_found" => "No Cartoon Series Found",
    "not_found_in_trash" => "No Cartoon Series Found in Trash",
    "parent" => "Parent Cartoon Series",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "cartoon-series", $args );

$labels = array(
    "name" => "Episodes",
    "singular_name" => "Episode",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "episodes", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "episodes", $args );

CPT UI eklentisini kullanıyorum, bu yüzden bu kodu doğrudan düzenleyemiyorum. Bu sadece CPT UI ihracat kodu sağlar.

İki CPT'yi bağlayan başka bir kodum yok. Belki de eksik olan budur. Az önce bağlantıyı yapmak için sayfaya meta kutusunu yerleştiren bu kodu çevrimiçi buldum. İşi yapmak yeterli değil mi? Görünüşe göre post_parent ayarlıyor.

Teşekkürler! Mat


Üzgünüm ama yanılmışım. Üst-alt ilişkisi doğru ayarlanmış. Meta kutu bir meta alan kullanmıyor (ilk başta beni şaşırtan şey budur), parent_idsorgu var kullanır ve ilişkiyi ayarlamak için daha fazla kodlamaya gerek yoktur. Sorun, oluşturulan URL'nin WordPress tarafından tanınmamasıdır. Çalışmasını sağlayan bir yeniden yazma kuralı bulmaya çalışıyordum, ancak başarılı olamadım. Şimdi bir çözüm araştırıyorum.
cybmeta

Biraz araştırmadan sonra, istediğiniz gibi çalıştıramayacağınızı düşünüyorum. Bir gönderi türünün başka bir gönderi türünün üst öğesi olması mümkün görünmemektedir. Eh, kodunuzla ilişkinin gerçekten ayarlanmış olması mümkündür, ancak alt yazı dozunu görmek ön uçta işe yaramaz. Kuralları yeniden yazmayı denedim ve pre_get_postssorguyu başarı ile değiştirmek için uğraştım, daha karmaşık bir şey anlayamadım. Bir kedinin köpeğin ebeveyni olması gibi. Ben sadece bir hiyerarşik yazı türü kullanmanızı veya meta alanları kullanarak realtionship ayarlamak öneririz .
cybmeta

Bir hirarchical yazı tipinin durumunuza mükemmel bir şekilde uyduğunu düşünüyorum.
cybmeta

2
Gerçekten bu konuda karmaşık DEĞİL çalışıyorum. Daha zarif bir çözüm mevcutsa, ben hep kulaktayım. Genel olarak WP'de yeniyim ve şimdiye kadar çok iyi başladım, ama bu beni çok üzdü. Tipik olarak, sadece çizgi film serisini bir kategori haline getirir ve bölüme atarım. Sorun şu ki, çizgi dizi altına gitmek için bölümler dışında başka iç içe verilerim var. Yani çizgi film serisinin de CPT olması gerektiği anlaşılıyor. Karmaşık! :-D Sadece tek bir hiyerarşik yazı türü kullanarak ne demek istediğinizi açıklayabilir misiniz?
Mattaton

Yanıtlar:


9

Sonunda çalışan bir çözüm buldum. Eğer yaptım ama bölüm özel yayın türleri (I WordPress ilişki kullanılarak ayarlanırsa üst içerik çocuk içerik olarak aynı türden olmalı beklediğini düşünüyorum hirarchical olamaz olarak karikatür serisi kaydedilebilir post_parentiçinde wp_postsveritabanı tablosu).

Bölümleri kaydederken, yeniden yazma kuralı istediğiniz slug'a ayarlanmalıdır cartoon-series/%series_name%. Ardından, çizgi dizisi yazı tipi istendiğinde ve ne zaman bir bölüm olduğunda WordPress'e %series_name%ana cartoon-seriesyazı türünün gerçek adı ve WordPress'e söylenecek bir yeniden yazma kuralıyla değiştirilecek bölümler bağlantısını filtreleyebiliriz .

add_action('init', function(){
    $labels = array(
        "name" => "Cartoon Series",
        "singular_name" => "Cartoon Series",
        "menu_name" => "Cartoon Series",
        "all_items" => "All Cartoon Series",
        "add_new" => "Add New",
        "add_new_item" => "Add New Cartoon Series",
        "edit" => "Edit",
        "edit_item" => "Edit Cartoon Series",
        "new_item" => "New Cartoon Series",
        "view" => "View",
        "view_item" => "View Cartoon Series",
        "search_items" => "Search Cartoon Series",
        "not_found" => "No Cartoon Series Found",
        "not_found_in_trash" => "No Cartoon Series Found in Trash",
        "parent" => "Parent Cartoon Series",
    );

    $args = array(
        "labels" => $labels,
         "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => true,
        "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "cartoon-series", $args );

    $labels = array(
        "name" => "Episodes",
        "singular_name" => "Episode",
    );

    $args = array(
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "cartoon-series/%series_name%", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "episodes", $args );

});

add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
}

add_action( 'init', function() {

    add_rewrite_rule( '^cartoon-series/(.*)/([^/]+)/?$','index.php?episodes=$matches[2]','top' );

});

add_filter( 'post_type_link', function( $link, $post ) {
    if ( 'episodes' == get_post_type( $post ) ) {
        //Lets go to get the parent cartoon-series name
        if( $post->post_parent ) {
            $parent = get_post( $post->post_parent );
            if( !empty($parent->post_name) ) {
                return str_replace( '%series_name%', $parent->post_name, $link );
            }
        } else {
            //This seems to not work. It is intented to build pretty permalinks
            //when episodes has not parent, but it seems that it would need
            //additional rewrite rules
            //return str_replace( '/%series_name%', '', $link );
        }

    }
    return $link;
}, 10, 2 );

NOT : Yukarıdaki kodu kaydettikten ve denemeden önce yeniden yazma kurallarını temizlemeyi unutmayın. Gidin wp-admin/options-permalink.phpve kuralları yeniden regerenate için kaydet tıklayın.

NOT 2 : Örneğin, paginate gönderileri için daha fazla yeniden yazma kuralının eklenmesi gerekebilir. Ayrıca, örneğin cartoon-seriestüm alt bölümleri de silerken, eksiksiz bir çözüm elde etmek için biraz daha çalışmaya ihtiyaç olabilir mi? Bölümleri posta üst öğesine göre filtrelemek için yönetici düzenleme ekranına filtre eklensin mi? Üst seri adını göstermek için yönetici düzenleme ekranındaki bölüm başlığı değiştirilsin mi?


Bunu incelediğiniz için teşekkürler! Gönderdiğiniz kod, karikatür dizisinin adını url'den düşürüyor gibi görünüyor. % Series_name% yerine bölümün adını koymak yerine,% series_name% bölümün üst öğesinin adı olmalıdır. Bölüm adı bundan sonra olacaktır. Bazı nedenlerden dolayı, bir ebeveyn seçmem için Çizgi Serisi kutusu doldurulmuyor. Bu yüzden bölümlerin hiyerarşik olması gerektiğini düşündüm. Nedenini anlamaya çalışıyorum.
Mattaton

Evet, Cartoon Series meta kutusunun doldurulması için bölümlerin hiyerarşik olması gerekir.
Mattaton

Ebeveynleri ayarlayabilmem için bölümler hiyerarşik olarak, url daha da kötüye gitti. Slug önerdiğin gibi, seri adını url'de iki kez alıyorum. Yani, daha domain/episodes/series-name/episode-nameönce olduğu gibi, aldımdomain/episodes/series-name/series-name/episode-name
Mattaton

Dediğim gibi, bölümler hiyerarşik olamaz. Hiyerarşik olmayan yazı türleriyle doldurulacak meta kutu kodunu değiştirdim. Gönderdiğim tam kodu kullanın, test ettim ve çalışıyor. Başka bir kod kullanırsanız neyin yanlış olduğunu bilemem. Sadece kodu cevaptan kopyalayıp yapıştırın ve test edin. CPT UI eklentisini devre dışı bırakmanız veya en azından özel kod türlerini kodda kaydedildiklerinden eklentiden silmeniz gerekebilir.
cybmeta

Ah, özür dilerim, çabucak taradım ve bu kısmın aynı olduğunu düşündüm. Haklısınız, sayfa şimdi yükleniyor ve URL doğru görünüyor.
Mattaton


-1

Bunun için kendi URL ayrıştırma kodunuzu yazmanız gerekir, çünkü wordpress, url yapısına dayalı olarak DB'den almaya çalıştığı postanın türünü bilmelidir ve url yapınız buna herhangi bir ipucu vermez.

Bu, wordpress'in yeniden yazma kuralları API'si ile yapılması çok kolay bir şey değildir, ancak yeniden yazma mekanizmasını atlamanızı ve URL'leri kendiniz ayrıştırmanızı engelleyen hiçbir şey yoktur. Gibi bir şey 1. wordpress yeniden yazma kurallarını çalıştırın. Bir içerik görüntülendiyse ve çıktıktan sonra 2. url'nin ilk bölümünü alın, URL'nin geri kalan kısımlarında beklenen gönderi türü 3 döngüsüyle eşleşen bir gönderi olup olmadığını kontrol edin. doğru türde. 4. her şey eşleşen son gönderiyi görüntülerse, başka bir 404 sayfası görüntüler

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.