私はPostsページとして静的なフロントページと別のページ/news/
を持っています。私はこのような単一投稿URLを持ちたいです。
www.example.com/news/categoryname/subcategory/postname/
カテゴリアーカイブの場合:
www.example.com/news/categoryname/
私がすでに試したこと:
カテゴリベースとしてnews
を、カスタムパーマリンク構造として/news/%category%/%postname%/
を追加すると、希望するURLが得られますが、単一の投稿に対しては404エラーが発生します(URLにnews/
がある場合とない場合)。他のすべてのページ(カテゴリアーカイブ、ページなど)にはアクセスできます。
カテゴリベースを空のままにし、パーマリンクを/news/%category%/%postname%/
のままにした場合、404なしエラーが発生しますが、カテゴリURLにはデフォルトのcategory
スラッグが追加されています。www.example.com/news/category/categoryname/
プラグインを使用してデフォルトのカテゴリベースを削除するか、カテゴリベースを単に.
に設定すると、news
部分と共に削除されます。
パーマリンクを/%category%/%postname%/
に設定し、カテゴリベースnews
のみを追加した場合、no 404エラーもありますが、投稿へのリンクはnews
で始まっていません:www.example.com/categoryname/subcategory/postname/
いくつかの同様の未回答の質問があります: 投稿はカスタムカテゴリベースおよびサブカテゴリで表示されません および ワードプレスパーマリンクのつぶやき
私は最近この問題に戻り、ついに解決策を見つけました!それはあなたのために働くかもしれないし、働かないかもしれません - 2つの可能なケースがあります:
あなたのサイト上のいくつかの投稿が親カテゴリの下に置かれ、いくつかがサブカテゴリ(子カテゴリ)にある場合、あるいはカテゴリが異なるネストレベルを持つ場合(いくつかの親カテゴリはサブカテゴリのみを持ち、他はサブカテゴリ)、解決策はありません。書き換え規則では、正規表現でnews/category/post-name/
とnews/category/subcategory/
を区別することは不可能です。
すべてのカテゴリのネストレベルを固定し、最後のレベルのサブカテゴリにのみ投稿する場合は、運がいいです。 非常に簡単な解決策があります:
カテゴリベースとカスタムパーマリンク構造の両方にnews
がある404ページの理由は、カテゴリベースの内部書き換え規則がパーマリンク構造規則よりも優先されるためです。そのためnews/category/subcategory/postname/
はindex.php?category_name=category/subcategory/postname
として解釈され、明らかに、WordPressはそのようなカテゴリを見つけることができず、404ページを返します。
あなたがする必要があるのは、ルールリストの上に新しい書き換えルールを追加することです。このコードをあなたのfunctions.php
に置くか、適切だと思う場所に置きます。
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
// The regex to match the incoming URL
'news/([^/]+)/([^/]+)/([^/]+)(/[0-9]+)?/?$',
// The resulting internal URL
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Add the rule to the top of the rewrite list
'top' );
}
その後、WordPressの[一般オプション]ページからパーマリンク構造を更新します。上記のコードは2レベルのネストのためのものです。ネストしたカテゴリ構造が多かれ少なかれある場合は、それに応じて正規表現と結果のURLを編集してください。
P.Sこれらの有益な答えの貢献者のおかげで: add_rewrite_ruleを手伝ってください そして および/ - 書き換え規則を分析するためのツール 。
「/」を追加するだけです。カテゴリーベースの後:
カテゴリー・ベース:news/.
(/が404の投稿を防ぐため必須です)。
これは私のために完璧に働いた:)
編集:あなたが "。"を含まない限り、このフィールドは末尾のスラッシュや先頭のスラッシュを取り除きます。
カスタムパーマリンク構造:/media/%category%/%postname%/
カテゴリベース:.
私のために働いていた、WordPress 3.4.1、関連するプラグインなし。
更新日:えーと、後でwp_list_categories
がURLに "media"なしでリンクを出力することに気づきました。しかし、投稿は希望のURL構造でアクセス可能であり、カテゴリアーカイブは適切な場所にあります。今、私はwp_list_categoriesの振る舞いを変更することを検討しています。
コメントを投稿したほうがいいですが、今のところできません。あなたのコードは完璧に動作しますが、あなたがカテゴリーごとのRSSフィードを壊したくないなら、それはこのように見えるべきです:
add_action( 'init', 'wpa58471_category_base' );
function wpa58471_category_base() {
// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
// The regex to match the incoming URL
'news/([^/]+)/([^/]+)/([^/][^f][^e][^e][^d]+)(/[0-9]+)?/?$', //here my changes to exclude 'feed'
// The resulting internal URL
'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]',
// Add the rule to the top of the rewrite list
'top' );
}
とにかく、すばらしいコードサンプルをありがとう。 :)