実現したいこと
アーカイブページを/news/
カテゴリーページを/news/カテゴリー名(news)
記事ページを/news/記事タイトル
newsの配下となるように表示させたい。カテゴリー名にはnewsをいれたい。
発生している問題・分からないこと
このままだと/news/が競合してしまうようで、
パーマリンクのカスタム構造に /news/%postname%/
カテゴリーベースに news
を入れると、アーカイブページ、カテゴリーページがきちんと表示されるが記事ページが表示されなくなる。
現在、下記をfunction.phpに記述しているけれど、問題はありますか?
該当のソースコード
function.php
1// 投稿のアーカイブページを作成する 2function post_has_archive($args, $post_type) 3{ 4 if ('post' == $post_type) { 5 $args['rewrite'] = true; // リライトを有効にする 6 $args['has_archive'] = 'news'; // 任意のスラッグ名 7 } 8 return $args; 9} 10add_filter('register_post_type_args', 'post_has_archive', 10, 2); 11
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
元々スラッグ名とカテゴリーベースを同じにすることはできないみたいですが、
chatgptに尋ねたところカスタムリライトルールを追加することでできるようでした。
function.php
1// カスタムリライトルールを追加 2function custom_rewrite_rules() { 3 // `/news/` を投稿アーカイブとして定義 4 add_rewrite_rule('news/?$', 'index.php?post_type=post', 'top'); 5 6 // `/news/カテゴリー名/` をカテゴリーページとして定義 7 add_rewrite_rule('news/([^/]+)/?$', 'index.php?category_name=$1', 'top'); 8 9 // `/news/記事タイトル/` を個別投稿として定義 10 add_rewrite_rule('news/([^/]+)/([^/]+)/?$', 'index.php?category_name=$1&name=$2', 'top'); 11} 12add_action('init', 'custom_rewrite_rules'); 13 14// pre_get_posts でカテゴリーページを認識させる 15function fix_news_permalink($query) { 16 if (!is_admin() && $query->is_main_query()) { 17 if ($query->is_category) { 18 $query->set('post_type', 'post'); 19 } 20 } 21} 22add_action('pre_get_posts', 'fix_news_permalink');
しかし上記を追記したら、
アーカイブページは表示されたけれとそれ以外違うページに飛ぶようになってしまいました。
カスタムリライトルールでなんとかできるのではと思うのですが、
詳しくわからず、ご教示いただけますと幸いです。よろしくお願いいたします。
補足
特になし

あなたの回答
tips
プレビュー