パターン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);

?>