teratail header banner
teratail header banner
質問するログイン新規登録
パーマリンク

パーマリンクは、ウェブサイトの各ページに対して個別に与えられているURLのことです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

0回答

193閲覧

wordpress カテゴリーのスラッグ名とカテゴリーベースで同じものを使いたい

shichimi73

総合スコア1

パーマリンク

パーマリンクは、ウェブサイトの各ページに対して個別に与えられているURLのことです。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2025/04/03 02:49

0

0

実現したいこと

アーカイブページを/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');

しかし上記を追記したら、
アーカイブページは表示されたけれとそれ以外違うページに飛ぶようになってしまいました。
カスタムリライトルールでなんとかできるのではと思うのですが、
詳しくわからず、ご教示いただけますと幸いです。よろしくお願いいたします。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tabuu

2025/04/04 01:32

> /news/記事タイトル/` を個別投稿として定義 > add_rewrite_rule('news/([^/]+)/([^/]+)/?$', 'index.php?category_name=$1&name=$2', 'top'); コメントとプログラムが一致していませんが、想定はどちらでしょうか? (a) /news/カテゴリ/記事 (b) /news/記事
shichimi73

2025/04/04 05:44

コメントありがとうございます! chatgptが作成したものを読み取れておらず、失礼いたしました。 (b) /news/記事 を作りたいです。
tabuu

2025/04/04 07:15

>(b) /news/記事 を作りたいです。 /news/カテゴリー名 /news/記事名 パターンが一致するのでカテゴリー名の方でrewriteされていると思います。 /news/記事ID/記事名 のように3階層にして記事IDで取得してはいかがでしょうか?
shichimi73

2025/04/04 07:50

/news/カテゴリー名 /news/記事名 やはりこれを作ることはできないのでしょうか。
tabuu

2025/04/04 08:06

custom_rewrite_rules関数でURLの第一階層がnewsの場合、第二階層を抜き出して それがカテゴリーに存在するかどうか判定した後にadd_rewrite_ruleのindex.php?の パラメータを設定すれば可能だと思います。
shichimi73

2025/04/04 08:37

add_rewrite_rule('news/([^/]+)/?$', 'index.php?name=$matches[1]&post_type=post', 'top'); こう修正したのですが、 WP上で /news/カテゴリー が表示されませんでした。
tabuu

2025/04/07 03:58

日本語で説明するとざっくり下記のような感じになると思います。 if (URLの2階層目の文字がカテゴリーに存在する場合) { add_rewrite_rule('news/([^/]+)/?$', 'index.php?category_name=$1', 'top'); } else { add_rewrite_rule('news/([^/]+)/?$', 'index.php?name=$1', 'top'); }
shichimi73

2025/04/09 02:06

phpに詳しくないので、chatgptを使い上記参考にし書き換えたのですが news/カテゴリー名 は表示されないままでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問