web-dev-qa-db-fra.com

Pourquoi add_rewrite_endpoint est-il incompatible avec la structure /% category% /% postname%/permalink?

J'ai ajouté un point de terminaison myvar/myvalue à EP_ALL qui peut être ajouté à n'importe quelle URL d'une installation WP. Un plugin WP agira en conséquence. Cette partie est cool mais cela ne fonctionne pas lorsque la structure de permalien est /%category%/%postname%/. Cela fonctionne bien avec toutes les structures intégrées et sélectionnables. Il pourrait y avoir d'autres structures avec lesquelles il ne fonctionne pas.

Ne fonctionne pas = erreur 404.

Le chemin ressemble à ceci: /mycategory/mypost/myvar/myvalue

J'ai le plugin d'analyse Rewrite qui me dit qu'il est interprété comme (top 4, dans l'ordre):


Ce n'est pas ça ... (surligné en jaune)

(.?.+?)/myvar(/(.*))?/?$
nom de page: mycategory/mypost
myvar: ma valeur


Apparemment, cela s'habitue mais il fait encore froid ...

.?.+?/([^/]+)/myvar(/(.*))?/?$
pièce jointe: mypost
myvar:/myvalue


Tout simplement faux ...

(.?.+?)(/[0-9]+)?/?$
nom de page: mycategory/mypost/myvar
page:/myvalue


Ça y est, mais il ne s'en rend pas compte!

(.+?)/([^/]+)/myvar(/(.*))?/?$
category_name: mycategory
nom: mypost
myvar: ma valeur


Et je sors global $query_string; qui me dit que c'est
attachment=mypost&myvar=%2Fmyvalue (en passant, il ne devrait pas inclure la barre oblique% 2f).

Alors, quelqu'un peut-il m'éclairer s'il s'agit d'un bogue dans WP, ou y a-t-il quelque chose que je puisse faire pour y remédier?

Mon idée est à peu près ceci
if ( '/%category%/%postname%/' == $wp_rewrite->permalink_structure ){ ... }
et en indiquant manuellement WP la catégorie et le nom et en affichant ce contenu. Mais je ne sais pas ce qui se passe en tant que ... et en quoi devrais-je l'accrocher?.

1
Firsh - LetsWP.io

Pourquoi ça ne marche pas? Je ne suis pas sûr. Ce modèle particulier est identique à une demande de page parent/enfant. WordPress doit effectuer des requêtes supplémentaires pour déterminer si une publication existe sous ce nom ou s'il s'agit d'une page. Pourquoi cela se casse-t-il lorsque vous ajoutez un point de terminaison? Je n'ai pas encore fouillé dans le code pour le déterminer.

Comment pouvez-vous le faire fonctionner? Il semble que si vous n'utilisez pas le masque EP_ALL, mais plutôt l'opérateur OR avec tous les masques individuels, les règles seront générées de manière à ce que ces points de terminaison soient correctement résolus.

Par exemple:

function wpa_myvar_endpoint(){
    add_rewrite_endpoint( 'myvar', EP_PERMALINK | EP_PAGES );
}
add_action( 'init', 'wpa_myvar_endpoint' );
2
Milo