it-swarm.com.de

Taxonomie-Archive basierend auf dem benutzerdefinierten Beitragstyp

Ich habe drei verschiedene benutzerdefinierte Beitragstypen generiert (z. B. Bücher, Filme, Spiele). Ich habe auch eine benutzerdefinierte Taxonomie für alle von ihnen erstellt (z. B. Genre).

Was ich brauche, sind Archive für die Taxonomie basierend auf den Beitragstypen. Zum Beispiel: "Bücher-Genre", "Filme-Genre" ...

Gibt es dafür eine Lösung? Jetzt habe ich nur noch das Taxonomiearchiv für "Genre".

2
Cray

Hier ist ein vollständiges Beispiel, das mit add_rewrite_rule() möglich gemacht wurde. Die Grundkonfiguration für dieses Beispiel wird zuerst dokumentiert, dann werden wir mit add_rewrite_rule() zum eigentlichen Teil der Lösung gelangen.

Taxonomie und Post Type Registrierung

Registrieren Sie die Taxonomie genre und die Beitragstypen book, movie und game(Beachten Sie, dass in diesem Beispiel die singuläre Version jedes dieser Namen verwendet wird, da dies als Best Practice gilt.

// Create taxonomy: genre for post types: book, movie, and game
// https://codex.wordpress.org/Function_Reference/register_taxonomy
add_action( 'init', 'wpse247013_register_taxonomies', 0 );
function wpse247013_register_taxonomies() {
    $args = [
        'public'            => true,
        'hierarchical'      => false,
        'label'             => __( 'Genres', 'textdomain' ),
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => 'genre',
        'rewrite'           => [ 'slug' => 'genres' ],
    ];

    register_taxonomy( 'genre', [ 'book', 'movie', 'game' ], $args );
}

// Create post types: movie, book, and game
// https://developer.wordpress.org/reference/functions/register_post_type/
add_action( 'init', 'wpse247013_register_post_types' );
function wpse247013_register_post_types() {
    $book_args = [
        'label'              => __( 'Books', 'textdomain' ),
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => [ 'slug' => 'books' ],
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => [ 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ],
        'taxonomies'         => [ 'genre' ],
    ];
    register_post_type( 'book', $book_args );

    $movie_args = [
        'label'             => __( 'Movies', 'textdomain' ),
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => [ 'slug' => 'movies' ],
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => [ 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ],
        'taxonomies'         => [ 'genre' ],
    ];
    register_post_type( 'movie', $movie_args );

    $game_args = [
        'label'             => __( 'Games', 'textdomain' ),
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => [ 'slug' => 'games' ],
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => [ 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ],
        'taxonomies'         => [ 'genre' ],
    ];
    register_post_type( 'game', $game_args );
}

Grundlegende URL-Beispiele

Basierend auf dem obigen Setup erhalten wir diese URLs sofort:

Archiv-URLs nach Beitragstyp

URLs mit einem Beitragstyp

Taxonomie-Archiv-URLs

Regeln zum Umschreiben handhaben

Umschreiberegeln müssen hinzugefügt werden, um einen bestimmten Genrebegriff auf einen einzelnen Beitragstyp zu beschränken. Für die Paginierung ist für jeden Beitragstyp eine zusätzliche Regel erforderlich.

/**
 * Add rewrite rules for genre terms limited to book, movie, and game post types.
 * Pagination issue fix via http://wordpress.stackexchange.com/a/23155/2807
 * @link https://codex.wordpress.org/Rewrite_API/add_rewrite_rule
 */
function wpse247013_rewrite_rules() {
    // Book Genres
    add_rewrite_rule( '^books/book-genres/([^/]+)/?$',
            'index.php?taxonomy=genre&post_type=book&term=$matches[1]', 'top' );

    // Book Genres pagination
    add_rewrite_rule( '^books/book-genres/([^/]+)/page/([0-9]+)?$',
            'index.php?post_type=book&genre=$matches[1]&paged=$matches[2]', 'top' );

    // Movie Genres
    add_rewrite_rule( '^movies/movie-genres/([^/]+)/?$',
            'index.php?taxonomy=genre&post_type=movie&term=$matches[1]', 'top' );

    // Movie Genres pagination
    add_rewrite_rule( '^movies/movie-genres/([^/]+)/page/([0-9]+)?$',
            'index.php?post_type=movie&genre=$matches[1]&paged=$matches[2]', 'top' );

    // Game Genres
    add_rewrite_rule( '^games/game-genres/([^/]+)/?$',
            'index.php?taxonomy=genre&post_type=game&term=$matches[1]', 'top' );

    // Game Genres pagination
    add_rewrite_rule( '^games/game-genres/([^/]+)/page/([0-9]+)?$',
            'index.php?post_type=game&genre=$matches[1]&paged=$matches[2]', 'top' );
}
add_action( 'init', 'wpse247013_rewrite_rules', 10, 0 );

Stellen Sie sicher, dass Sie die Umschreiberegeln leeren, indem Sie Einstellungen> Permalinks aufrufen, nachdem Sie diesen Code zu Ihrem Plugin oder Thema hinzugefügt haben. Wenn Sie ein Plugin verwenden, können Sie die Regeln programmgesteuert mit register_activation_hook löschen.

Benutzerdefinierte URLs

Die oben hinzugefügten Umschreiberegeln ermöglichen die folgenden neuen URLs:

5
Dave Romsey

Sie können Taxonomie dynamisch wie folgt registrieren,

add_action('init',function(){

    $postType = array( 'books','movies','games' );

    foreach ( $postType as $k => $cpt ) {

        $tax_slug = strtolower( $cpt ) . '-genre';

        register_taxonomy(
            $tax_slug,
            strtolower( $cpt ),
            array(
                    'label' => 'Genre',
                    'rewrite' => array( 'slug' => $tax_slug ),
                    'hierarchical' => true,
                )
        );
    }
});
1
Govind Kumar