web-dev-qa-db-fra.com

L'inclusion de la catégorie de base dans un post-permalien a pour résultat 404

J'ai une page de garde statique et une page séparée /news/ comme page de messages. Je voudrais avoir les URL à publication unique comme ceci:

www.example.com/news/categoryname/subcategory/postname/

et pour la catégorie archives:

www.example.com/news/categoryname/

Ce que j'ai déjà essayé:

  • Si j'ajoute news comme base de ma catégorie et /news/%category%/%postname%/ comme structure permalien personnalisée, j'obtiens les URL souhaitées, mais aussi 404 error pour les publications uniques (les deux avec news/ dans l'URL et sans elle). Toutes les autres pages (archives de catégories, pages, etc.) sont accessibles.

  • Si je laisse la catégorie vide et les permaliens comme /news/%category%/%postname%/, il y a no 404 errors, mais les URL de catégorie contiennent en outre le slug par défaut category, comme suit: www.example.com/news/category/categoryname/

  • Si j'utilise des plugins pour supprimer la base de catégorie par défaut ou simplement définir la base de catégorie sur ., elle est supprimée avec la partie news

  • Si je mets les permaliens comme /%category%/%postname%/ et ajoute uniquement la catégorie base news, il y a aussi no 404 errors, mais les liens vers les publications ne commencent pas par news: www.example.com/categoryname/subcategory/postname/

Il y a des questions similaires sans réponse: Messages ne montrant pas avec categorybase personnalisé et sous-catégories et permaliens wordpress tweeks

6
semyonfilippov

Je suis revenu à ce problème récemment et j'ai enfin trouvé la solution! Cela peut ou peut ne pas fonctionner pour vous - il y a deux cas possibles:

  1. Si certains articles de votre site sont placés dans des catégories parent et d'autres dans des sous-catégories (catégories enfants), ou si les catégories ont des niveaux de nidification différents (certaines catégories parents ne comportent que des sous-catégories alors que d'autres - sous-sous-catégories), alors il n'y a pas Solution. Il est impossible de distinguer news/category/post-name/ de news/category/subcategory/ avec regex dans les règles de réécriture.

  2. Si vous avez fixé le niveau d'imbrication pour toutes les catégories et que vous publiez uniquement dans les sous-catégories du dernier niveau, vous avez de la chance! Il y a une solution assez simple:

La raison de ces 404 pages avec news à la fois dans la structure de base de catégorie et de permalien personnalisée est que la règle de réécriture interne de base de catégorie a la priorité sur les règles de structure de permalien. Donc, news/category/subcategory/postname/ est interprété comme index.php?category_name=category/subcategory/postname et, évidemment, WordPress ne peut pas trouver une telle catégorie, renvoyant 404 pages.

Ce que vous devez faire est d’ajouter une nouvelle règle de réécriture en haut de la liste des règles. Placez ce code dans votre functions.php ou à l'endroit que vous jugerez approprié:

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' );
}

puis mettez à jour la structure permalien à partir de votre page Options générales WordPress. Le code ci-dessus concerne l'imbrication à deux niveaux. Si vous avez une structure de catégorie plus ou moins imbriquée, modifiez ensuite l'expression rationnelle et l'URL résultante.

P.S. Merci aux contributeurs de ces réponses utiles: help with add_rewrite_rule et outil pour analyser les règles de réécriture .

3
semyonfilippov

Vous devez seulement ajouter "/". après la catégorie de base:

Catégorie de base: news/. (/. Est requis car il empêche 404s de poster).

Cela a fonctionné parfaitement pour moi :)

EDIT: Ce champ supprimera les barres obliques finales ou les barres obliques sauf si vous incluez le "."

3

Structure de lien permanent personnalisée: /media/%category%/%postname%/ Base de la catégorie: .

Travaillé pour moi, WordPress 3.4.1, sans aucun plugin connexe.

Mise à jour: Plus tard, j'ai remarqué que wp_list_categories génère des liens sans "média" dans l'URL. Mais les publications sont accessibles avec la structure d'URL souhaitée et les catégories d'archives se trouvent au bon endroit. Maintenant, je cherche à changer le comportement de wp_list_categories.

0
Lev Eidinov

Je ferais mieux de poster un commentaire, mais je ne peux pas pour l'instant. Votre code fonctionne parfaitement, mais si vous ne voulez pas casser les flux RSS par catégorie, il devrait ressembler à ceci:

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' );
}

Quoi qu'il en soit, merci pour un excellent exemple de code. :)

0
talonkingvskg