どうも、鶏です。
WordPressのカスタム投稿タイプってすこぶる便利ですよね。

通常の投稿とカスタム投稿タイプで同じカテゴリーやタグを使いたい時は、register_taxonomy() 関数で設定できます。

カスタム投稿タイプ(hoge, piyo)で通常の投稿と同じカテゴリーとタグを使う

register_taxonomy( 'category', array('hoge', 'piyo'), array( 'label' => '共通カテゴリー' ) );
register_taxonomy( 'post_tag', array('hoge', 'piyo'), array( 'label' => '共通タグ' ) );

これでカスタム投稿タイプでも、通常の投稿と同じカテゴリーとタグが使える。と、思ったら甘かった。

register_taxonomy()は規定値を無視する

3つ目の引数で設定値を指定するわけですが、これに書かれていないものは規定値ではなく、デフォルト値・・・つまり過去に設定したスラッグや名称もリセットされてしまう。これにより多くの問題が起きる。

今回ひっかかったのは、タグのリンクが正常に動作しなくなること。
WordPressのデフォルトのタグは タクソノミーが「post_tag」、スラッグが「tag」に設定されています。
上述の記述をすると、スラッグが「post_tag」にセットされ、タグの一覧のリンクURLも /tag/ から /post_tag/ に書き換わります。
すると、WordPressは通常のタグを /tag/として処理しているのかタグのページがおかしなことになってしまう。パーマリンク設定を変えても変化なし。

手軽に回避してみる

何か別の方法があるかもしれないけど、単純に規定値を変数に読み込んで全部 register することで回避した 。

taxonomyの規定値はget_taxonomy()で取得

$post_tag_taxonomy = get_taxonomy('post_tag');

まず、冒頭のコードの実行前と実行後で設定値がどう変わっているか比較してみよう

## 実行前に $post_tag_taxonomy = get_taxonomy('post_tag'); して出力

object(stdClass)#134 (19) {
  ["labels"]=>
  object(stdClass)#164 (21) {
    ["name"]=>
    string(6) "タグ"
    ["singular_name"]=>
    string(6) "タグ"
    ["search_items"]=>
    string(15) "タグを検索"
    ["popular_items"]=>
    string(15) "人気のタグ"
    ["all_items"]=>
    string(18) "すべてのタグ"
    ["parent_item"]=>
    NULL
    ["parent_item_colon"]=>
    NULL
    ["edit_item"]=>
    string(15) "タグの編集"
    ["view_item"]=>
    string(15) "タグを表示"
    ["update_item"]=>
    string(15) "タグを更新"
    ["add_new_item"]=>
    string(21) "新規タグを追加"
    ["new_item_name"]=>
    string(15) "新規タグ名"
    ["separate_items_with_commas"]=>
    string(66) "タグが複数ある場合はコンマで区切ってください"
    ["add_or_remove_items"]=>
    string(33) "タグの追加もしくは削除"
    ["choose_from_most_used"]=>
    string(42) "よく使われているタグから選択"
    ["not_found"]=>
    string(42) "タグが見つかりませんでした。"
    ["no_terms"]=>
    string(12) "タグなし"
    ["items_list_navigation"]=>
    string(36) "タグリストナビゲーション"
    ["items_list"]=>
    string(15) "タグリスト"
    ["menu_name"]=>
    string(6) "タグ"
    ["name_admin_bar"]=>
    string(8) "post_tag"
  }
  ["description"]=>
  string(0) ""
  ["public"]=>
  bool(true)
  ["hierarchical"]=>
  bool(false)
  ["show_ui"]=>
  bool(true)
  ["show_in_menu"]=>
  bool(true)
  ["show_in_nav_menus"]=>
  bool(true)
  ["show_tagcloud"]=>
  bool(true)
  ["show_in_quick_edit"]=>
  bool(true)
  ["show_admin_column"]=>
  bool(true)
  ["meta_box_cb"]=>
  string(18) "post_tags_meta_box"
  ["rewrite"]=>
  array(4) {
    ["with_front"]=>
    bool(true)
    ["hierarchical"]=>
    bool(false)
    ["ep_mask"]=>
    int(1024)
    ["slug"]=>
    string(3) "tag"
  }
  ["query_var"]=>
  string(3) "tag"
  ["update_count_callback"]=>
  string(0) ""
  ["_builtin"]=>
  bool(true)
  ["cap"]=>
  object(stdClass)#135 (4) {
    ["manage_terms"]=>
    string(17) "manage_categories"
    ["edit_terms"]=>
    string(17) "manage_categories"
    ["delete_terms"]=>
    string(17) "manage_categories"
    ["assign_terms"]=>
    string(10) "edit_posts"
  }
  ["name"]=>
  string(8) "post_tag"
  ["object_type"]=>
  array(1) {
    [0]=>
    string(4) "post"
  }
  ["label"]=>
  string(6) "タグ"
}

## 実行後に $post_tag_taxonomy = get_taxonomy('post_tag'); して出力
object(stdClass)#2108 (19) {
  ["labels"]=>
  object(stdClass)#2112 (22) {
    ["name"]=>
    string(21) "共通タグ"
    ["singular_name"]=>
    string(21) "共通タグ"
    ["search_items"]=>
    string(15) "タグを検索"
    ["popular_items"]=>
    string(15) "人気のタグ"
    ["all_items"]=>
    string(21) "共通タグ"
    ["parent_item"]=>
    NULL
    ["parent_item_colon"]=>
    NULL
    ["edit_item"]=>
    string(15) "タグの編集"
    ["view_item"]=>
    string(15) "タグを表示"
    ["update_item"]=>
    string(15) "タグを更新"
    ["add_new_item"]=>
    string(21) "新規タグを追加"
    ["new_item_name"]=>
    string(15) "新規タグ名"
    ["separate_items_with_commas"]=>
    string(66) "タグが複数ある場合はコンマで区切ってください"
    ["add_or_remove_items"]=>
    string(33) "タグの追加もしくは削除"
    ["choose_from_most_used"]=>
    string(42) "よく使われているタグから選択"
    ["not_found"]=>
    string(42) "タグが見つかりませんでした。"
    ["no_terms"]=>
    string(12) "タグなし"
    ["items_list_navigation"]=>
    string(36) "タグリストナビゲーション"
    ["items_list"]=>
    string(15) "タグリスト"
    ["menu_name"]=>
    string(21) "共通タグ"
    ["name_admin_bar"]=>
    string(21) "共通タグ"
    ["archives"]=>
    string(21) "共通タグ"
  }
  ["description"]=>
  string(0) ""
  ["public"]=>
  bool(true)
  ["hierarchical"]=>
  bool(false)
  ["show_ui"]=>
  bool(true)
  ["show_in_menu"]=>
  bool(true)
  ["show_in_nav_menus"]=>
  bool(true)
  ["show_tagcloud"]=>
  bool(true)
  ["show_in_quick_edit"]=>
  bool(true)
  ["show_admin_column"]=>
  bool(false)
  ["meta_box_cb"]=>
  string(18) "post_tags_meta_box"
  ["rewrite"]=>
  array(5) {
    ["with_front"]=>
    bool(true)
    ["hierarchical"]=>
    bool(false)
    ["ep_mask"]=>
    int(0)
    [0]=>
    string(0) ""
    ["slug"]=>
    string(8) "post_tag"
  }
  ["query_var"]=>
  string(8) "post_tag"
  ["update_count_callback"]=>
  string(0) ""
  ["_builtin"]=>
  bool(false)
  ["label"]=>
  string(21) "共通タグ"
  ["cap"]=>
  object(stdClass)#2106 (4) {
    ["manage_terms"]=>
    string(17) "manage_categories"
    ["edit_terms"]=>
    string(17) "manage_categories"
    ["delete_terms"]=>
    string(17) "manage_categories"
    ["assign_terms"]=>
    string(10) "edit_posts"
  }
  ["name"]=>
  string(8) "post_tag"
  ["object_type"]=>
  array(7) {
    [0]=>
    string(4) "post"
    [1]=>
    string(10) "hogehoge"
  }
}

labels の中身なんか、実行の前後で設定値がかなり変わってますね。実際にコントロールパネルのいろんな箇所のラベルがおかしなことになります。

そこで、get_taxonomy()で規定値を入れてみると…

        register_taxonomy(
            'post_tag',
            $slugs,
            get_taxonomy('post_tag')
        );

期待通りの結果が返ってくるはず。ぜひお試しあれ