it-swarm.com.de

Verschachtelte individuelle Beitragstypen mit Permalinks

Ich versuche, eine mehrstufige benutzerdefinierte Beitragstypstruktur mit Permalinks wie authors/books/chapters einzurichten, wobei Autoren, Bücher und Kapitel als eigene benutzerdefinierte Beitragstypen eingerichtet sind. Eine typische URL auf dieser Site könnte beispielsweise wie folgt aussehen: example.com/authors/stephen-king/the-shining/chapter-3/

Jedes Kapitel kann nur zu einem Buch gehören, und jedes Buch kann nur zu einem Autor gehören. Ich habe darüber nachgedacht, Taxonomien anstelle von CPTs für Autoren und Bücher zu verwenden, aber ich muss jedem Element Metadaten zuordnen, und ich bevorzuge dafür die Post-Schnittstelle.

Ich bin meistens auf dem Weg dorthin, indem ich einfach jeden benutzerdefinierten Post als Kind eines Eintrags im CPT eine Ebene höher einrichte. Zum Beispiel erstelle ich "Chapter 3" und weise "The Shining" als übergeordnetes Element mit einer benutzerdefinierten Meta-Box zu. "The Shining" wiederum hat "Stephen King" als Eltern. Ich hatte keine Probleme, diese Beziehungen aufzubauen.

Ich verwende Rewrite-Tags in den CPT-Slugs und die Permalinks möchten funktionieren, aber sie stimmen nicht ganz. Unter Verwendung eines Analyseprogramms für das Neuschreiben kann ich feststellen, dass die Neuschreibregeln tatsächlich generiert werden, aber sie scheinen nicht in der richtigen Reihenfolge zu sein, sodass andere Regeln zuerst verarbeitet werden.

Here's a screenshot of my rewrite analyzer.

So habe ich meine CPTs registriert:

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

Gibt es eine Möglichkeit, die Priorität meiner Umschreiberegeln so zu ändern, dass zuerst Autoren, Bücher und Kapitel abgeglichen werden?

Ich weiß auch, dass ich einen post_type_link-Filter hinzufügen muss, aber das scheint zweitrangig zu sein, um die Permalinks richtig zu machen. Wenn jemand weiß, wo ich einen umfassenden Überblick über die Funktionsweise dieses Filters finden kann, wäre er dankbar.

9
Dalton

Wenn Sie "Autoren" als Basis-Slug in den Permalinks beibehalten möchten, z. B. example.com/authors/stephen-king/ für das CPT "Autoren", example.com/authors/stephen -king/the-shining/für das CPT "Bücher" und example.com/authors/stephen-king/the-shining/chapter-3/ für das CPT "Kapitel" wird WordPress denke, so ziemlich alles ist ein "Autoren" -Post oder ein hierarchisches Kind eines "Autoren" -Posts, und da dies nicht der Fall ist, wird WordPress letztendlich sehr verwirrt.

Trotzdem gibt es eine Problemumgehung, die recht einfach ist, aber so lange Ihre Permalink-Struktur immer der gleichen Reihenfolge folgt, dh auf das Wort "Autoren" folgt immer ein Autoren-Slug, auf den immer ein Buch-Slug folgt durch eine kapitelschnecke, dann solltest du gut gehen.

In dieser Lösung ist es nicht erforderlich, den Umschreibungs-Slug in der benutzerdefinierten Post-Typdefinition für "Kapitel" und "Bücher" zu definieren, sondern den Umschreibungs-Slug für "Autoren" einfach als "Autoren" festzulegen. Platzieren Sie den folgenden Code in Ihrer functions.php Datei und "leeren" Sie Ihre Umschreiberegeln.

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

Erfahren Sie mehr über das CPT-onomies-Plugin

11
Rachel Carden

Ich habe keine persönlichen Erfahrungen mit einem solchen Szenario, aber Randy Hoyt hat am vergangenen Wochenende im WordCamp San Fran einen Vortrag über "Subordinate Post Types" gehalten, der sich so anhört, als würden Sie darüber reden.

Hier ist seine Seite für den Vortrag, die seine Präsentationsfolien und Links zu einem Plugin enthält, das er für die Arbeit mit untergeordneten Beitragstypen erstellt hat: http://randyhoyt.com/wordpress/subordinate-post-types/

4
mannieschumpert

Die Regeln werden zum extra_rules_top von WP_Rewrite in der Reihenfolge hinzugefügt, in der die zusätzlichen Permastrukturen hinzugefügt werden. Wenn Sie also die Reihenfolge ändern, in der Sie die Beitragstypen registrieren, wird die Reihenfolge geändert, in der die Umschreiberegeln generiert werden, sodass die Kapitelumschreibung zuerst abgeglichen wird. Da Sie jedoch query_var von den anderen post_types verwenden, stimmt die wp_query möglicherweise mit einem der abgefragten post-Namen überein, bevor Sie das gewünschte Kapitel abgleichen.

Ich würde neue Umschreibungs-Tags erstellen, um die Platzhalter für den übergeordneten Autor und das übergeordnete Buch darzustellen, dh:

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

Wenn Sie dies tun, müssen Sie 'query_vars' filtern, um 'parent_book' öffentlich zu machen. Dann müssen Sie pre_get_posts einen Filter hinzufügen, der den als parent_book query_var festgelegten Namen in die post_id konvertiert und als post_parent festlegt.

1
prettyboymp