web-dev-qa-db-fra.com

Archives de taxonomie basées sur un type de message personnalisé

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".

2
Cray

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().

Taxonomie et enregistrement du type de poste

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

Exemples d'URL de base

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

Taxonomy Term URLs

Gérer les règles de réécriture

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 .

URL personnalisées

Les règles de réécriture ajoutées ci-dessus activeront les nouvelles URL suivantes:

5
Dave Romsey

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,
                )
        );
    }
});
1
Govind Kumar