Kalıcı bağlantılarla iç içe özel yayın türleri


9

authors/books/chaptersYazarlar, kitaplar ve bölümler gibi kendi özel yazı türü olarak ayarlanmış kalıcı bağlantılar ile çok düzeyli özel yazı tipi bir yapı kurmaya çalışıyorum . Örneğin, bu sitedeki tipik bir URL,example.com/authors/stephen-king/the-shining/chapter-3/

Her bölüm sadece bir kitaba ait olabilir ve her kitap sadece bir yazara ait olabilir. Yazarlar ve kitaplar için CPT'ler yerine taksonomiler kullanmayı düşündüm, ancak meta verileri her öğe ile ilişkilendirmem gerekiyor ve bunun için yazı arayüzünü tercih ediyorum.

Ben en çok orada her özel yazı CPT bir seviye yukarı bir girişin alt öğesi olarak ayarlayarak. Örneğin, "Bölüm 3" oluşturuyorum ve özel bir meta kutu kullanarak üst öğe olarak "Parlayan" atayım. "Shining" de ebeveyn olarak "Stephen King" e sahip. Bu ilişkileri oluşturmakta hiç sorun yaşamadım.

CPT salyangozlarında yeniden yazma etiketleri kullanıyorum ve kalıcı bağlantılar çalışmak istiyor, ancak tam olarak doğru değiller. Yeniden yazma çözümleyicisini kullanarak, yeniden yazma kurallarının gerçekten oluşturulduğunu görebilirim, ancak doğru sırada görünmüyorlar ve bu nedenle önce diğer kurallar işleniyor.

İşte yeniden yazma analiz cihazımın bir ekran görüntüsü.

CPT'lerimi şu şekilde kaydettirdim:

function cpt_init() {

  $labels = array(
    'name' => 'Authors'
   );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author',
        'with_front' => FALSE,
    ),
    'with_front' => false,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('authors',$args);

  $labels = array(
    'name' => 'Books'
  );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author/%authors%',
        'with_front' => FALSE,
    ),
    'with_front' => false,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('books',$args);


  $labels = array(
    'name' => 'Chapters'
   );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author/%authors%/%books%',
        'with_front' => FALSE,
    ),
    'with_front' => FALSE,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('chapters',$args);

}

add_action( 'init', 'cpt_init' );

Öyleyse, yazarların, kitapların ve bölümlerin hepsinin önce eşleşmesi için yeniden yazma kurallarının önceliğini değiştirmenin bir yolu var mı?

Ayrıca bir post_type_linkfiltre eklemek zorunda olacağımı da biliyorum , ancak bu ilk etapta kalıcı bağlantıları elde etmek için ikincil görünüyor. Herkes bu filtrenin nasıl çalıştığına dair kapsamlı bir genel bakış nerede bulabileceğimi biliyorsa, takdir edilecektir.


Yalnızca Sayfaları kullanmayı düşündünüz mü? Doğru kalıcı bağlantı yapısını otomatik olarak elde edersiniz.
Michael Hampton

Kesinlikle düşündüm. Sayfalarla ilgili sorun, tek bir yazar için 100 torun öğemiz olabileceğidir, bu da sayfa yöneticisinde yönetilmesi çok zor olacaktır. Ayrıca, posta türüne göre sorgulama yapabilmemiz gerekir.
Dalton

Bir çözüm üzerinde çalışıyorum ama hızlı bir sorum var: her kalıcı bağlantı önünde 'yazar'ın olması önemli mi? Çünkü bu yapışkan gibi görünüyor. Bence WordPress biraz fazla kafa karıştırıyor, çünkü bu WP yazar sayfaları için de kullanılan bir kalıcı bağlantı sümük. 'Yazar' olması gerekiyorsa, her şeyin hala yapılabilir olduğunu düşünüyorum ... sadece daha karmaşık olacak.
Rachel Carden

Hata, yazarın yerleşik WP yazar sümüküyle çakışacağının farkında değildim. Hayır, bu gerekli değil, herhangi bir şey olabilir. CPT olduğu için orada bir şeye ihtiyacım olduğunu varsayıyordum , ama bu "yazarlar" ya da başka bir şey de olabilir.
Dalton

Bu karışıklığın aslında temel yazar olarak 'yazar'ı paylaşan CPT'lerde yattığını fark ettim. 'Yazar'ı CPT' yazarları 'için bilgi olarak ayarladıktan sonra CPT' kitapları 'için' yazar /% yazar% 've CPT' bölümleri için 'yazar /% yazar% /% kitap%' ', sonra WordPress' kitaplar 'için yazıları ve' bölümler 'için gönderileri' yazarlar 'için kelimenin tam anlamıyla hiyerarşik çocuk gönderileri olduğunu düşünüyor. bu mantıklı mı? Testlerimde 'yazar'ı CPT' yazarlarının 'temeli olarak tutabilirsiniz ve gayet iyi çalışır. Öyleyse önceki sorumu değiştirin: 'yazar'a ihtiyacınız var mı yoksa slug% author% ile başlayabilir mi?
Rachel Carden

Yanıtlar:


11

'Yazarları' kalıcı bağlantılarda temel bilgi olarak tutmak istiyorsanız, örneğin 'yazarlar' CPT'si için example.com/authors/stephen-king/ , örneğin , yazarlar CPT'si için example.com/authors/stephen-king/the-shining/ 'kitaplar' CPT'si ve 'bölümler' CPT'si için 'kitaplar' CPT ve example.com/authors/stephen-king/the-shining/chapter-3/ , WordPress hemen hemen her şeyin bir 'yazarlar' yazısı veya bir 'yazarların hiyerarşik çocuğu olduğunu düşünecektir. yazıyor ve durum böyle olmadığından, WordPress nihayetinde çok karışık hale geliyor.

Bununla birlikte, oldukça basit bir çözüm var, ancak kalıcı bağlantı yapınız her zaman aynı sırayı takip ettiği sürece, yani 'yazarlar' kelimesini her zaman bir yazar slug takip eder, bunu her zaman takip eden bir kitap sümük takip eder. bir bölüm sülük tarafından, o zaman gitmek için iyi olmalısın.

Bu çözümde, yeniden yazma sümüğünü 'bölümler' ve 'kitaplar' için özel yazı türü tanımında tanımlamanıza gerek yoktur, ancak 'yazarlar' yeniden yazma sümüğünü basitçe 'yazarlar' olarak ayarlayın, aşağıdaki kodu işlevlerinize yerleştirin. Php ve yeniden yazma kurallarınızı "yıkayın".

add_action( 'init', 'my_website_add_rewrite_tag' );
function my_website_add_rewrite_tag() {
    // defines the rewrite structure for 'chapters', needs to go first because the structure is longer
    // says that if the URL matches this rule, then it should display the 'chapters' post whose post name matches the last slug set
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)/([^/]*)/?','index.php?chapters=$matches[3]','top' );
    // defines the rewrite structure for 'books'
    // says that if the URL matches this rule, then it should display the 'books' post whose post name matches the last slug set
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)/?','index.php?books=$matches[2]','top' );   
}

// this filter runs whenever WordPress requests a post permalink, i.e. get_permalink(), etc.
// we will return our custom permalink for 'books' and 'chapters'. 'authors' is already good to go since we defined its rewrite slug in the CPT definition.
add_filter( 'post_type_link', 'my_website_filter_post_type_link', 1, 4 );
function my_website_filter_post_type_link( $post_link, $post, $leavename, $sample ) {
    switch( $post->post_type ) {

        case 'books':

            // I spoke with Dalton and he is using the CPT-onomies plugin to relate his custom post types so for this example, we are retrieving CPT-onomy information. this code can obviously be tweaked with whatever it takes to retrieve the desired information.
            // we need to find the author the book belongs to. using array_shift() makes sure only one author is allowed
            if ( $author = array_shift( wp_get_object_terms( $post->ID, 'authors' ) ) ) {
                if ( isset( $author->slug ) ) {
                    // create the new permalink
                    $post_link = home_url( user_trailingslashit( 'authors/' . $author->slug . '/' . $post->post_name ) );
                }
            }

            break;

        case 'chapters':

            // I spoke with Dalton and he is using the CPT-onomies plugin to relate his custom post types so for this example, we are retrieving CPT-onomy information. this code can obviously be tweaked with whatever it takes to retrieve the desired information.
            // we need to find the book it belongs to. using array_shift() makes sure only one book is allowed
            if ( $book = array_shift( wp_get_object_terms( $post->ID, 'books' ) ) ) {

                // now to find the author the book belongs to. using array_shift() makes sure only one author is allowed
                $author = array_shift( wp_get_object_terms( $book->term_id, 'authors' ) );

                if ( isset( $book->slug ) && $author && isset( $author->slug ) ) {
                    // create the new permalink
                    $post_link = home_url( user_trailingslashit( 'authors/' . $author->slug . '/' . $book->slug . '/' . $post->post_name ) );
                }

            }

            break;

    }
    return $post_link;
}

CPT-onomies eklentisi hakkında daha fazla bilgi edinin


Bu mükemmel çalışıyor, teşekkürler! Çok yeni öğrendiğimi hissediyorum. CPT-onomies eklentisi de gerçekten harika. wordpress.org/extend/plugins/cpt-onomies
Dalton

"Kütüphaneniz" büyüdükçe bazı engellerle karşılaşabileceğinizi hissediyorum ama aklımda zaten bazı kodlar var, eğer öyleyse, bana bildirin.
Rachel Carden

@RachelCarden İki kitap aynı başlığa ancak farklı yazarlara sahip olduğunda ne yaparsınız? Yeniden yazılan URL'de bir çarpışma olacak! Bunu nasıl çözersin?
Segfault

1
@Segfault Yeniden yazma kurallarına zorla kodlayabilmeniz için yazar sümüklerinin tümünü almanız gerekir: foreach ($ author_slugs $ author_slug olarak) {add_rewrite_rule ('^ authors /'. $ Author_slug. '/ ([ ^ /] *) / ([^ /] *) /? ',' index.php? authors = '. $ author_slug.' & chapters = $, [2] ',' top 'ile eşleşir); add_rewrite_rule ('^ authors /'. $ author_slug. '/([^/ Cialis*)/?','index.php?authors='. $ author_slug. '& books = $ eşleşmeler [1]', 'üst') ; }
Rachel Carden

Sen kullanabilirsiniz @Segfault get_terms () Bir CPT-onomy veya kullanıyorsanız, get_posts () sonrası adları / salyangozlar almak için.
Rachel Carden

4

Böyle bir senaryo ile kişisel deneyimim yok, ancak Randy Hoyt geçen hafta WordCamp San Fran'da "Alt Yazı Türleri" hakkında bahsettiğinize benzeyen bir sunum yaptı.

Sunum slaytlarını ve alt yazı türleriyle çalışmak için oluşturduğu bir eklentiye bağlantıları içeren konuşma sayfası: http://randyhoyt.com/wordpress/subordinate-post-types/


Teşekkürler, bu iyi bir kaynak gibi görünüyor. Bunun torun ilişkilerini destekleyip desteklemediği açık değil (testimde görünmüyor) ve aslında kalıcı bağlantılara yardımcı olmuyor. Çocuk / ebeveyn ilişkilerimi kurmanın bir yolunu buldum (bunu yapmak için güzel bir yol olmasına rağmen), ancak kalıcı bağlantılar gerçekten şu anda takıldığım sorun.
Dalton

1

Kurallar, ekstra permastriklerin eklenmesi sırasında WP_Rewrite öğesinin extra_rules_top öğesine eklenir. Bu nedenle, yazı türlerini kaydettiğiniz sırayı değiştirmek, önce bölüm yeniden yazma işlemini eşleştirerek yeniden yazma kurallarının sırasını değiştirecektir. Ancak, diğer post_types sorgu_var kullandığınız için wp_query bölüm istediğiniz gibi eşleştirmeden önce bunlardan biri sorgulanan posta adı olarak eşleşebilir.

Üst yazar ve üst kitap için yer tutucuları temsil etmek için yeni yeniden yazma etiketleri oluştururdum, yani:

add_rewrite_tag('%parent-book%', '([^/]+)', 'parent_book=');

Bunu yaparken, 'parent_book'u herkese açık hale getirmek için' query_vars'ı filtrelemeniz gerekir. Ardından, pre_get_posts öğesine parent_book query_var olarak ayarlanan adı post_id'ye dönüştürecek ve bunu 'post_parent' olarak ayarlayacak bir filtre eklemeniz gerekir.


Bahsettiğiniz filtreler için lütfen kod örnekleri verebilir misiniz? Ayrıca, yeniden yazma etiketi torun CPT'si için nasıl görünür?
Dalton
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.