web-dev-qa-db-ja.com

パーマリンクの投稿にcategory-baseを含めると404になります

私は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/

いくつかの同様の未回答の質問があります: 投稿はカスタムカテゴリベースおよびサブカテゴリで表示されません および ワードプレスパーマリンクのつぶやき

6
semyonfilippov

私は最近この問題に戻り、ついに解決策を見つけました!それはあなたのために働くかもしれないし、働かないかもしれません - 2つの可能なケースがあります:

  1. あなたのサイト上のいくつかの投稿が親カテゴリの下に置かれ、いくつかがサブカテゴリ(子カテゴリ)にある場合、あるいはカテゴリが異なるネストレベルを持つ場合(いくつかの親カテゴリはサブカテゴリのみを持ち、他はサブカテゴリ)、解決策はありません。書き換え規則では、正規表現でnews/category/post-name/news/category/subcategory/を区別することは不可能です。

  2. すべてのカテゴリのネストレベルを固定し、最後のレベルのサブカテゴリにのみ投稿する場合は、運がいいです。 非常に簡単な解決策があります

カテゴリベースとカスタムパーマリンク構造の両方に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を手伝ってください そして および/ - 書き換え規則を分析するためのツール

3
semyonfilippov

「/」を追加するだけです。カテゴリーベースの後:

カテゴリー・ベース:news/.(/が404の投稿を防ぐため必須です)。

これは私のために完璧に働いた:)

編集:あなたが "。"を含まない限り、このフィールドは末尾のスラッシュや先頭のスラッシュを取り除きます。

3

カスタムパーマリンク構造:/media/%category%/%postname%/カテゴリベース:.

私のために働いていた、WordPress 3.4.1、関連するプラグインなし。

更新日:えーと、後でwp_list_categoriesがURLに "media"なしでリンクを出力することに気づきました。しかし、投稿は希望のURL構造でアクセス可能であり、カテゴリアーカイブは適切な場所にあります。今、私はwp_list_categoriesの振る舞いを変更することを検討しています。

0
Lev Eidinov

コメントを投稿したほうがいいですが、今のところできません。あなたのコードは完璧に動作しますが、あなたがカテゴリーごとの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' );
}

とにかく、すばらしいコードサンプルをありがとう。 :)

0
talonkingvskg