MENU

【WordPress】カスタムタクソノミーの一覧ページのスラッグをカスタム投稿タイプと同じにした時の404を回避する方法

やりたいこと。

カスタム投稿を「news」、カスタムタクソノミーを「news_cat」とし、タームにinfoを登録した場合。

カスタム投稿タイプ : news
カスタムタクソノミー : news_cat
ターム : info

カスタム投稿タイプ一覧ページ

http://example.com/news/

カスタム投稿タイプの記事ページ

http://example.com/news/ooooooo/

カスタムタクソノミーのターム一覧ページ

http://example.com/news_cat/info/
→ http://example.com/news/info/

STEP1.カスタム投稿をfunctions.phpに設定する

詳しくはこちら。

STEP2.カスタム投稿のタクソノミーを設定

$args = array(
  'label' => 'カテゴリー',
  'public' => true,
  'show_ui' => true,
  'hierarchical' => true,
  'query_var' => true
);
register_taxonomy('news_cat','news',$args);
$args = array(
  'label' => 'カテゴリー',
  'public' => true,
  'show_ui' => true,
  'hierarchical' => true,
  'query_var' => true,
  'rewrite' => array(
    'slug' => 'news', //★URLでnews_catと表記されるのをnewsに変更
    'hierarchical' => true //★true にすると階層化したURLを使用可能にする
  )
);
register_taxonomy('news_cat','news',$args);

STEP3.パーマリンクを設定する

wordpress管理画面「設定」→「パーマリンク設定」のカスタム構造にチェックを入れてカスタムパーマリンクを設定する。多分、何でも大丈夫。今回はこのように設定しました。

http://example.com/%category%/%post_id%/

STEP4.正規表現を使ってURLをリライトする

落とし穴!STEP2だけだと一見できた感じになるけど、アーカイブページでプラグインのWP-PageNaviを使ったページネーションができない。パーマリンク設定を「基本」のパラメーターに戻すと正しく動くのでindex.php?news_cat=○○と認識しているみたい。

そこで正規表現を使ってURLをリライト設定。

// カスタム投稿とカスタムタクソノミーを同一スラッグ(news)にした際に、ページネーションででる404エラーの回避
add_rewrite_rule('news/([^/]+)/page/([0-9]+)/?$', 'index.php?news_cat=$matches[1]&paged=$matches[2]', 'top');

「news」と「news_cat」とある部分を設定するカスタム投稿とカスタムタクソノミーに変えてあげるとOK。

こちらを参考にさせていただきました。
とても詳しく書かれています。

カスタムタクソノミー(カスタム分類)のスラッグ(URL)を変更してページネーションもできるようにする