web-dev-qa-db-ja.com

カスタム投稿タイプに基づく分類アーカイブ

私は3つの異なるカスタム投稿タイプ(書籍、映画、ゲームなど)を生成しました。私はまたそれらすべてのためにカスタム分類法(例えばジャンル)を作成しました。

必要なのは、投稿の種類に基づく分類法のアーカイブです。たとえば、 "books-genre"、 "movies-genre"などです。

それを解決する方法はありますか?今、私は "genre"の分類アーカイブだけです。

2
Cray

add_rewrite_rule() を使用して可能になった完全な例を次に示します。この例の基本的なセットアップを最初に文書化してから、add_rewrite_rule()を使用してソリューションの実際の部分に進みます。

分類と投稿タイプの登録

genre分類法とbookmovie、およびgame投稿タイプを登録します(これらの名前のそれぞれの単数形が ベストプラクティスと見なされるため、この例で使用されています。

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

基本的なURLの例

上記の設定に基づいて、これらのURLをそのまま使用できます。

投稿タイプのアーカイブURL

シングルポストタイプURL

タクソノミー用語アーカイブURL

  • http://example.com/genres/ {genre-term-slug}
    (このアーカイブには、all投稿タイプが含まれますが、これは後のものではありません)

書き換えルールを処理する

特定のジャンル用語を単一の投稿タイプに制限するには、書き換えルールを追加する必要があります。各投稿タイプのページネーションには追加のルールが必要です。

/**
 * 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 );

このコードをプラグインまたはテーマに追加した後、Settings> Permalinksにアクセスして、書き換えルールを必ずフラッシュしてください。プラグインを使用している場合、 register_activation_hook を使用してプログラムでルールをフラッシュできます。

カスタムURL

上記で追加された書き換えルールにより、次の新しいURLが有効になります。

5
Dave Romsey

このように分類法を動的に登録できます。

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