Utiliser l’API Endpoint pour créer une règle de réécriture d’url simple

url

Plus de 3 minutes :)

Le Endpoint

Il n’est pas rare de vouloir créer une règle de réécriture simple et efficace sans avoir à la créer soit même, à tout penser etc…

C’est pour cela que WordPress propose l’endpoint qui fait partie de l’API de rewriting.

Comment l’utiliser ?

C’est vraiment une API très simple à utiliser, prenons l’exemple suivant :

« Je veux ajouter à la fin des liens de mes articles un paramètre qui va afficher la vidéo de l’article associée dans un champ méta ».

Alors comme ça, ça parait compliqué, mais en fait non ! Quelques lignes de code suffiront à le faire. Elles peuvent être ajoutées dans le fichier function.php du thème mais aussi dans un plugin.

Ajouter le Endpoint

Pour ajouter un endpoint, c’est tout simple, il suffit d’appeler la fonction add_rewrite_endpoint avec en premier paramètre le nom du endpoint et en deuxième paramètre les cas où WordPress va réécrire et ajouter le endpoint.
Le deuxième paramètre utilise des variables définies au sein de WordPress, vous avez accès à :

  • EP_PERMALINK
  • EP_ATTACHMENT
  • EP_DATE
  • EP_YEAR
  • EP_MONTH
  • EP_DAY
  • EP_ROOT
  • EP_COMMENTS
  • EP_SEARCH
  • EP_CATEGORIES
  • EP_TAGS
  • EP_AUTHORS
  • EP_PAGES
  • EP_ALL
Comme on peut le voir, on peut choisir où s’ajoute notre endpoint, soit dans un cas bien précis (EP_DAY s’applique aux urls des jours) ou bien partout avec EP_ALL.
Dans notre cas ce sera à la fin du lien de notre article.

<pre><code>
add_action( 'init', 'add_video_endpoint' );
function add_video_endpoint() {
// J'ajoute un endpoint nommé vidéo à la fin des liens de mes articles
add_rewrite_endpoint( 'video', EP_PERMALINK );
}

C’est donc en créant des liens du type monsite.fr/chemin_vers_larticle/video/small que WordPress va réécrire et interpréter notre endpoint.

Utiliser le endpoint

Disons que nous voulons afficher la vidéo seule, et dans un template dédié.

Il faut commencer par détecter que le endpoint est actif et puis l’utiliser à son avantage.


<pre><code>

add_action( 'parse_query', 'video_endpoint_parse_query' );

function video_endpoint_parse_query( $query ){
// Si je détecte dans nos query vars la vidéo et que la vlauer dans la query vars est small,medium ou marge
if( isset( $query->query_vars['video'] ) && in_array( $query->query_vars['video'], array( 'small', 'medium', 'large' ) ) ) {
// J'ajoute mon action au moment du template redirect
add_action( 'template_redirect', 'video_endpoint_template_loader' );
}
}

function video_endpoint_template_loader() {
global $wp_query;
// Récupérons le slug de la vidéo ( déjà vérifié plus haut )
$slug = $wp_query->query_vars['video'];
// Créons le nom du template à utiliser
$templates = array(
'single-video-'.$slug.'.php',
'single-video.php',
'single.php'
);
// Localisons le template
locate_template( $templates, true );
// Terminons tout ça :)
exit();
}

Donc là nous avons tout simplement détecté la présence de notre endpoint et vérifié qu’il soit renseigné comme nous l’attendions ( ici small, medium ou large ).

Puis nous avons ajouté une action lors du template_redirect et demandé le template correspondant au slug détecté plus haut. Donc les templates chargés peuvent être :

  • single-video-small.php
  • single-video-medium.php
  • single-video-larger.php
  • single-video.php si ceux-ci n’existent pas !
  • Finalement single.php si aucun de ces templates ne sont trouvés

Et là on peut faire ce que l’on veut dans notre template, avoir une présentation spéciale, demander d’être connecté avant de continuer etc..

Conclusion

L’API des endpoint peut être très facilement utilisée et surtout dans des petits cas pratiques comme celui-ci. Afficher une mise en page pour l’impression, afficher l’article avec une présentation spéciale etc…
Elle est très rapide à mettre en place et il ne faut pas perdre de vue qu’elle reste très limitée, il va falloir ajouter les règles de réécriture à la main dans WordPress pour des cas plus compliqués, mais ce sera sûrement l’objet d’un autre article ;).

Share on Google+0Tweet about this on Twitter3Share on Facebook0Pin on Pinterest0

12 thoughts on “Utiliser l’API Endpoint pour créer une règle de réécriture d’url simple

  1. j’ai rarement vu des articles aussi intéressants en français, au sujet de wordpress.
    par contre c’est très confus. Et pas très bien écrits malheureusement (on dirait un article traduit par google translate par moment)
    C’est dommage parce que ça pourrait être un super bon article !

  2. excellent !

    Une petite remarque, je crois qu’il y a un point-virgule en trop (ligne5) ici : isset( $query->;query_vars[‘video’] )

    et deux questions :

    1- EP_PERMALINK c’est uniquement pour les articles seuls (single.php) ? et EP_ROOT c’est pour quoi ?

    2-comment tu fais passer la taille (small, medium, large) dans le query var ?

    • Effectivement un ; de trop ! :)

      EP_PERMALINK, c’est bien pour les articles en single
      EP_ROOT, c’est pour la base du site donc http://tonsite.fr/video/small : ça marche :)

      Pour les variables quand tu fais un add_endpoint, WordPress fait un add_query_var directement avec le nom de ton slug. Donc elle est ajoutée aux query vars de WordPress et un $wp_query->query_vars[‘video’] suffit pour récupérer cette valeur :).

      • je viens de tester. J’ai ajouter ton premier code (celui avec la fonction add_video_endpoint) dans mon fichier function. Mais mes urls d’article n’ont pas changé. Il faut faire un truc en plus ?
        Et si dans mon header.php j’ecris
        query_vars[‘video’]; ?>
        rien ne s’affiche

        • Ah mais les urls des articles ne changent pas, il faut faire
          http://nomdetonsite.fr/chemin de l’article normal]/video/[small/medium/large].

          Et là ton contenu spécifique à ton appel s’affiche :).

          Dans ton header il faut faire « global $wp_query » avant de pouvoir faire le var_dump( $wp_query->query_vars ); :)

  3. Ah ok !
    Donc j’ai mis tout le code dans function.php
    j’ai créé un clone de mon fichier single.php que j’e l’ai nommé single-video-small.php
    ensuite je vais sur un article et j’ajoute à son url /video/small
    mais là c’est page 404 qui s’affiche ^^

  4. par ailleurs $wp_query->query_vars['video'] ne retourne rien apparemment

  5. Yes ! ça marche

    Donc en résumé, cette api permet de créer des urls qui n’existaient pas. avec cette « contrainte » que ces urls sont + ou – « calquées » sur les urls existantes.
    Et on peut attribuer à ces urls des templates spécifiques.

    C’est cool !

    Il faudrait éventuellement approfondir les autres usages possibles de cette technique, ce serait super intéressant !

    Merci pour l’article Nicolas !

  6. Félicitations pour cet article qui soulève le voile d’un des points obscurs du codex. Même en anglais, les sources sur le sujet sont rarissimes (en général les blogueurs mettent le END_POINT sous le tapis d’un discret « vous n’avez pas besoin d’y toucher sauf si vous savez vraiment ce que vous faites »)

Add Comment Register



Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>