la taxonomie personnalisée et les pages réécrivent le conflit de limaces donne 404

9

J'utilise le plug-in d'interface utilisateur de type de publication personnalisé pour créer mes taxonomies personnalisées. J'ai un portefeuille composé de projets (type de poste personnalisé) avec 2 taxonomies personnalisées de technologies et de clients. La taxonomie des clients a un slug de réécriture personnalisé de portfolio/clients/, tandis que la taxonomie des technologies a un slug de réécriture personnalisé deportfolio/

Réécrit:
portfolio/html <- la page affiche tous les projets en HTML
portfolio/clients/client-a<- la page affiche tous les projets pour le client A

Maintenant, lorsque j'essaie de créer une page de destination pour les clients qui ont une URL, /portfolio/clientsj'obtiens la page 404. Je suis à peu près sûr que cela est dû à des réécritures d'URL conflictuelles de la taxonomie des technologies. J'imagine qu'il cherche dans la taxonomie technologique, il n'existe pas alors il crache la page 404. Alors, comment puis-je faire fonctionner le slug de réécriture d'URL de sorte que lorsque je frappe /portfolio/clients, il ne renvoie pas la page 404 et utilise le modèle de page correct?

Johannes Pille
la source

Réponses:

16

Vous semblez avoir besoin de "règles de réécriture verbeuses partielles". Les règles de réécriture détaillées signifient que toutes les pages sont mises en haut parce que WordPress ne peut pas comprendre la différence entre une page et un message. Ici, il pense que c'est possible, car toutes les URL du formulaire portfolio/([^/]+)/proviennent de votre portfoliotaxonomie, sauf celle-ci portfolio/clients/. Vous devrez mettre celui-là au-dessus des règles de réécriture, afin qu'il corresponde avant la taxonomie de portefeuille plus générique. Vous pourriez probablement aussi forcer toutes les règles de réécriture à être verbeuses, mais cela affectera les performances si vous avez beaucoup de pages.

Cette réponse est écrite avec ma compréhension récente des règles de réécriture, donc j'espère que c'est une bonne façon de le faire et que l'exemple de code ne contient pas trop d'erreurs.

Une page ne génère pas une seule règle de réécriture, elle génère un groupe:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

Vous n'avez pas à les créer vous-même, vous pouvez réutiliser le pouvoir de WP_Rewrite. Regardez sa page_rewrite_rules()méthode: si nous sommes en mode verbeux, il obtient une liste de toutes les pages (via page_uri_index()) et de leurs pièces jointes, écrase la %pagename%balise de réécriture et génère les règles de réécriture pour cette page. Nous pouvons aussi le faire:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

Cela nous donnera les règles pour les pages, mais pas encore pour les pièces jointes utilisées dans la page. Si vous les souhaitez également, vous répétez l'étape pour chaque pièce jointe, mais avec add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(voir page_rewrite_rules()pour plus de détails).

Bien, nous avons les règles, mais maintenant vous devez les ajouter à la structure de réécriture complète d'une manière ou d'une autre. Vous pouvez le faire avec add_rewrite_rule(), mais vous devez l'appeler pour chaque règle générée dans le $page_rewrite_rulestableau. Pour cette raison, beaucoup de gens crochet dans le rewrite_rules_arrayfiltre , puisque vous pouvez simplement modifier le tableau là - bas.

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

Après avoir inclus ce filtre, vous devez vider les règles de réécriture (une fois, pas une à chaque chargement de page, car il est assez lourd). Vous pouvez le faire en appelant flush_rewrite_rules()ou en visitant la page des paramètres "Permaliens".

Jan Fabry
la source
Excellent! Merci Jan! Cela a fonctionné. Je n'aurais pas pu recevoir une meilleure explication.