パターンA
https://hogehoge.com/カスタム投稿名/
https://hogehoge.com/カスタム投稿名/ターム名/
https://hogehoge.com/カスタム投稿名/記事名/
<?php
/////////////////////////////////////////////////////////
// カスタム投稿タイプ
/////////////////////////////////////////////////////////
function register_custom_post_types() {
// Works投稿タイプ
$works_labels = array(
'name' => 'Works',
'all_items' => '投稿一覧',
);
$works_args = array(
'labels' => $works_labels,
'public' => true,
'menu_position' => 6,
'menu_icon' => 'dashicons-admin-post',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'has_archive' => true,
'rewrite' => array('slug' => 'works', 'with_front' => false), // カスタム投稿タイプ
'show_in_rest' => true,
);
register_post_type('works', $works_args);
// カスタムタクソノミー: ctg (作品タイプ)
register_taxonomy(
'ctg', // タクソノミースラッグ
'works', // 適用する投稿タイプ
array(
'hierarchical' => true,
'label' => '作品タイプ',
'public' => true,
'show_ui' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'works', 'with_front' => false), // スラッグ: works/web/
)
);
// カスタムタクソノミー: elem (エレメント)
register_taxonomy(
'elem',
'works',
array(
'hierarchical' => true, // タグ形式でも良い
'label' => 'エレメント',
'public' => true,
'show_ui' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'works', 'with_front' => false), // スラッグを統一
)
);
}
add_action('init', 'register_custom_post_types');
/////////////////////////////////////////////////////////
// カスタムリライトルールの追加
/////////////////////////////////////////////////////////
function add_custom_rewrite_rules() {
// すべてのタームを取得
$ctg_terms = get_terms(array(
'taxonomy' => 'ctg',
'hide_empty' => false,
));
$elem_terms = get_terms(array(
'taxonomy' => 'elem',
'hide_empty' => false,
));
// ctg タクソノミーのリライトルール追加
if (!is_wp_error($ctg_terms) && !empty($ctg_terms)) {
foreach ($ctg_terms as $term) {
add_rewrite_rule(
'^works/' . $term->slug . '/?$',
'index.php?taxonomy=ctg&term=' . $term->slug,
'top'
);
}
}
// elem タクソノミーのリライトルール追加
if (!is_wp_error($elem_terms) && !empty($elem_terms)) {
foreach ($elem_terms as $term) {
add_rewrite_rule(
'^works/' . $term->slug . '/?$',
'index.php?taxonomy=elem&term=' . $term->slug,
'top'
);
}
}
// 投稿タイプ "works" のシングルページ
add_rewrite_rule(
'^works/([^/]+)/?$',
'index.php?post_type=works&name=$matches[1]',
'top'
);
}
add_action('init', 'add_custom_rewrite_rules');
/////////////////////////////////////////////////////////
// フラッシュリライトルール(必要時に実行)
/////////////////////////////////////////////////////////
// function flush_custom_rewrite_rules() {
// add_custom_rewrite_rules();
// flush_rewrite_rules();
// }
// register_activation_hook(__FILE__, 'flush_custom_rewrite_rules');
/////////////////////////////////////////////////////////
// タームスラッグを自動追加するためのパーマリンク保存フック
/////////////////////////////////////////////////////////
function update_custom_rewrite_rules_on_term_save($term_id, $taxonomy) {
if (in_array($taxonomy, array('ctg', 'elem'))) {
flush_rewrite_rules();
}
}
add_action('edited_term', 'update_custom_rewrite_rules_on_term_save', 10, 2);
add_action('create_term', 'update_custom_rewrite_rules_on_term_save', 10, 2);
?>
コメントを残す