J'ai généré trois types de publication personnalisés différents (par exemple, des livres, des films et des jeux). J'ai également créé une taxonomie personnalisée pour chacun d'eux (genre, par exemple).
Ce dont j'ai besoin, ce sont des archives pour la taxonomie basée sur les types de publication. Par exemple: "livres-genre", "movies-genre" ...
Y a-t-il une solution pour le faire? Maintenant, je n'ai que les archives de taxonomie pour "genre".
Voici un exemple complet rendu possible avec add_rewrite_rule()
. La configuration de base de cet exemple est d'abord documentée, puis nous passons à la partie réelle de la solution à l'aide de add_rewrite_rule()
.
Enregistrez la taxonomie genre
et les book
, movie
et game
post types (notez que la version singulière de chacun de ces noms est utilisée dans cet exemple car elle est considérée comme une meilleure pratique ) .
// 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 );
}
Sur la base de la configuration ci-dessus, nous obtiendrons ces URL prêtes à l'emploi:
URL de type post archive
URL de type publication unique
- http://example.com/books/ {book-post-slug}
- http://example.com/movies/ {movie-post-slug}
- http://example.com/games/ {game-post-slug}
Taxonomy Term URLs
- http://example.com/genres/ {genre-term-slug}
(cette archive inclura les typesallpost, ce qui n'est pas ce que nous recherchons)
Des règles de réécriture doivent être ajoutées afin de limiter un terme de genre particulier à un seul type de publication. Une règle supplémentaire est nécessaire pour la pagination pour chaque type de publication.
/**
* 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 );
Assurez-vous de vider les règles de réécriture en visitantSettings> Permalinksaprès avoir ajouté ce code à votre plugin ou à votre thème. Si vous utilisez un plugin, vous pouvez vider les règles par programmation en utilisant register_activation_hook .
Les règles de réécriture ajoutées ci-dessus activeront les nouvelles URL suivantes:
http://example.com/books/book-genres/ {genre-term-slug}
( répertorie uniquement les livres associés au genre-terme-slug spécifié)http://example.com/movies/movie-genres/ {genre-term-slug}
(répertorie uniquement les films associés au genre-terme-slug spécifié)http://example.com/games/game-genres/ {genre-term-slug}
(répertorie uniquement les jeux associés au genre-terme-slug spécifié)
Vous pouvez enregistrer la taxonomie de manière dynamique comme ça,
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,
)
);
}
});