web-dev-qa-db-fra.com

taxonomie personnalisée et pages réécrire conflit de slug donne 404

J'utilise le plug-in Custom Post Type UI 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é de portfolio/

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

Maintenant, lorsque j'essaie de créer une page d'arrivée pour les clients qui a un slug d'URL de /portfolio/clients, la page 404 s'affiche. Je suis à peu près sûr que c'est à cause de réécritures d'URL contradictoires de la taxonomie des technologies. Je suppose qu’en cherchant dans la taxonomie des technologies, il n’existe pas, alors il crache la page 404. Alors, comment puis-je faire en sorte que le slug de réécriture d'URL fonctionne de telle sorte que lorsque je clique sur /portfolio/clients, il ne renvoie pas la page 404 et utilise le modèle de page correct?

9
jaysonp

Vous semblez avoir besoin de "règles de réécriture verbales partielles". Des règles de réécriture verbales signifient que toutes les pages sont placées au premier plan, car WordPress ne peut pas déterminer la différence entre une page et une publication. Ici, il pense que c'est possible, car toutes les URL de la forme portfolio/([^/]+)/ proviennent de votre taxonomie portfolio, à l'exception de celle-ci portfolio/clients/. Vous devrez mettre celle-ci au-dessus des règles de réécriture afin qu'elle corresponde avant la taxonomie plus générique du portefeuille. Vous pouvez probablement aussi forcer toutes les règles de réécriture à être détaillées, mais cela aura un impact sur 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. J'espère donc que c'est un bon moyen 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'êtes pas obligé de les créer vous-même, vous pouvez réutiliser le pouvoir de WP_Rewrite . Regardez sa méthode page_rewrite_rules() : si nous sommes en mode verbose, il obtient une liste de toutes les pages (via page_uri_index() ) et leurs pièces jointes, écrase la balise de réécriture %pagename% et génère les règles de réécriture de cette page. . Nous pouvons le faire aussi:

// 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, 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 vous devez maintenant les ajouter à la structure de réécriture complète. Vous pouvez le faire avec add_rewrite_rule(), mais vous devez l'appeler pour chaque règle générée dans le tableau $page_rewrite_rules. Pour cette raison, beaucoup de gens accrochent dans le filtre rewrite_rules_array , puisque vous pouvez simplement modifier le tableau à cet endroit.

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 de paramètres "Permalinks".

16
Jan Fabry