私は3つの異なるカスタム投稿タイプ(書籍、映画、ゲームなど)を生成しました。私はまたそれらすべてのためにカスタム分類法(例えばジャンル)を作成しました。
必要なのは、投稿の種類に基づく分類法のアーカイブです。たとえば、 "books-genre"、 "movies-genre"などです。
それを解決する方法はありますか?今、私は "genre"の分類アーカイブだけです。
add_rewrite_rule()
を使用して可能になった完全な例を次に示します。この例の基本的なセットアップを最初に文書化してから、add_rewrite_rule()
を使用してソリューションの実際の部分に進みます。
genre
分類法とbook
、movie
、および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
- http://example.com/books/ {book-post-slug}
- http://example.com/movies/ {movie-post-slug}
- http://example.com/games/ {game-post-slug}
タクソノミー用語アーカイブ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が有効になります。
http://example.com/books/book-genres/ {genre-term-slug}
(は、指定されたgenre-term-slugに関連付けられた書籍のみをリストします)http://example.com/movies/movie-genres/ {genre-term-slug}
(指定されたgenre-term-slugに関連付けられた映画のみを一覧表示します)http://example.com/games/game-genres/ {genre-term-slug}
(指定されたgenre-term-slugに関連付けられているゲームのみをリストします)
このように分類法を動的に登録できます。
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,
)
);
}
});