web-dev-qa-db-fra.com

Jolie URL avec add_query_var

J'essaie d'ajouter un "post" à chaque message sur mon site, par exemple

site.com/product-one/changelog site.com/product-two/changelog site.com/product-three/changelog

C'est le code que j'utilise atm, que j'ai trouvé quelque part ici:

global $wp,$wp_rewrite;
$wp->add_query_var('sub-page');
$wp_rewrite->add_rule('([^/]+)/(changelog)','index.php?pagename=$matches[1]&sub-page=$matches[2]', 'top');
$wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation

Cela fonctionne bien si je navigue sur site.com/product-one?sub-page=changelog mais si je vais sur site.com/product-one/changelog je viens juste d'être redirigé vers site.com/product-one

J'ai donc désactivé la redirection canonique comme test en utilisant:

remove_filter('template_redirect', 'redirect_canonical'); 

site.com/product-one/changelog ne redirige pas alors, mais retourne un 404 et site.com/product-one?sub-page=changelog fonctionne toujours.

Y at-il quelque chose que je peux changer avec ma réécriture pour que cela fonctionne?

Remarque: je sais que je pourrais le faire facilement avec les types de publication personnalisés et que j'ai commencé à suivre cette voie, mais comme le site utilise déjà la structure% postname% permalink, je ne pourrais pas alors avoir le type de publication personnalisé. cette structure ainsi que les pages des sites.

4
Adam Dempsey
add_rewrite_endpoint( 'changelog', EP_ROOT ); 

Ajoutera le point de terminaison, changelog, que vous pourrez ensuite vérifier sur le crochet template_redirect.

En cas de correspondance, le tableau de variables ($wp_query->query) doit contenir la clé changelog contenant tout ce qui vient après la valeur /. Donc, pour l'URL example.com/product1/changelog/5, vous auriez une variable de requête nommée changelog avec la valeur 5.

S'il n'y a rien après le point de terminaison, la variable sera présente mais contiendra une chaîne vide. Notez que get_query_var() ne fonctionnera pas pour une telle utilisation car il est codé en dur pour renvoyer une chaîne vide si query var n'est pas du tout défini.

Il suffit parfois de vérifier si une variable est présente et, le cas échéant, de modifier les variables de requête dans les crochets de requête (tels que pre_get_posts) et de charger votre propre sous-message avec le modèle de journal des modifications.

Vous pouvez également essayer d’expérimenter différents masques de points de terminaison permaliens, par exemple. EP_PAGES

Références:

6
Tom J Nowell