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".
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.
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 );
}
Basierend auf dem obigen Setup erhalten wir diese URLs sofort:
Archiv-URLs nach Beitragstyp
URLs mit einem Beitragstyp
- http://example.com/books/ {book-post-slug}
- http://example.com/movies/ {movie-post-slug}
- http://example.com/games/ {game-post-slug}
Taxonomie-Archiv-URLs
- http://example.com/genres/ {genre-term-slug}
(Dieses Archiv wird all post-Typen enthalten, was nicht unser Ziel ist)
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.
Die oben hinzugefügten Umschreiberegeln ermöglichen die folgenden neuen URLs:
http://example.com/books/book-genres/ {genre-term-slug}
(listet nur Bücher auf, die dem angegebenen Genre zugeordnet sind)http://example.com/movies/movie-genres/ {genre-term-slug}
(listet nur Filme auf, die dem angegebenen Genre-Begriff-Slug zugeordnet sind)http://example.com/games/game-genres/ {genre-term-slug}
(listet nur Spiele auf, die dem angegebenen Genre-Begriff-Slug zugeordnet sind)
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,
)
);
}
});