Quand faut-il utiliser add_rewrite_tag ()?


22

J'ai passé quelques jours à essayer d'apprendre comment ajouter au mieux des règles de réécriture. Jusqu'à présent, ma compréhension est qu'une méthode appropriée pour ajouter des règles simples est d'utiliser add_rewrite_rules(), avec un grand merci à Jan Fabry pour cet échange qui a été très utile aux élaborations.

Bien qu'il mentionne que add_rewrite_tags()je n'ai pas vu de guide expliquant quand il est avantageux de l'utiliser, contrairement à d'autres façons d'ajouter des règles de réécriture, ou de bons exemples sur son utilisation. Cela semble être un outil plus puissant, mais c'est à peu près tout ce que je peux comprendre. Je trouve les exemples dans le Codex trop cryptiques ou incomplets . Quelqu'un pourrait-il nous en dire plus ou indiquer une ressource? Je n'ai rien trouvé d'utile sur Google.

edit: Sa page Codex parle de «généralement» l'utiliser en conjonction avecadd_rewrite_rules(), mais n'élabore pas. De même, la page du Codex pour seadd_rewrite_rules()réfère àadd_rewrite_tags()mais elle aussi est très clairsemée d'informations. Quand et comment utiliser une telle combinaison? Le seul exemple que j'ai trouvé est cette réponse de Rob Vermeer que je ne comprends pas.

Réponses:


21

La différence fondamentale est:

  • Le add_rewrite_rule()ajoute une règle particulière qui est interprétée
  • Le add_rewrite_tag()ajoute un espace réservé à utiliser dans les structures d'URL. Cet espace réservé est ensuite utilisé pour générer plusieurs règles.

Par exemple, supposons que vous soyez un agent de voyages faisant la publicité d'hôtels dans divers pays. Vous voudrez peut-être que l'URL d'un hôtel soit

  www.example.com/hotels/UK/Balmoral

Où le pays (Royaume-Uni dans cet exemple) est un terme de taxomonie personnalisé et Balmoral est un hôtel (type de poste). Nous pourrions ajouter des règles de réécriture pour cela, mais il nous faudrait alors générer une règle pour:

  • l'hôtel lui-même
  • les pièces jointes de l'hôtel
  • Une règle pour les hôtels (publications) où elle déborde sur plusieurs pages, etc.

La génération de ces règles peut devenir compliquée. En outre, nous serons probablement en concurrence avec les propres règles de WordPress pour ce type de publication - générées à partir de la structure que nous avons définie lors de l'enregistrement du type de publication. (Dans tous les cas, laissez WordPress faire le travail).

Cette `` permastructure '' - similaire à ce que vous définissez pour les publications dans les paramètres de permalien - détermine les règles de réécriture générées par WordPress. Mais comme nous voulons une structure qui contient une inconnue (le pays) - que nous voulons interpréter - nous devons fournir un espace réservé du formulaire %country%. (C'est presque identique à celui %category%des articles).

Par exemple:

add_action_init('init','wpse71305_register_types');

function wpse71305_register_types(){

     //You'll need to register the country taxonomy here too.

     //Add 'country' tag.
     add_rewrite_tag('%country%', '([^&/]+)'));

     //Register hotel post type with %country$ tag
    $args = array(  
        ...
        'has_archive'=>true,  
        'rewrite' => array(  
            'slug'=>'hotels/%country%',  
            'with_front'=> false,  
            'feed'=> true,  
            'pages'=> true  
        )  
        ...
    );  
    register_post_type('hotel',$args);  
}

Remarque: WordPress ne sait pas comment générer l'URL à partir de la %country%balise - vous devez lui dire de le faire. (Je couvre cela dans un article auquel j'ai lié ci-dessous).

Enfin, WordPress stockera également la valeur correspondante afin que vous puissiez la récupérer via get_query_var()(quelque chose que vous n'avez pas avec une règle de réécriture standard).

Vous pouvez également créer des balises à utiliser dans la permastructure des publications (définissez-la dans la page des paramètres de Permalink).

En ajoutant une balise, nous pouvons l'utiliser dans des permastructures. WordPress sait alors

  • À quoi s'attendre
  • Comment interpréter l'URL (vérifiez qu'elle correspond)
  • Comment interpréter la valeur (c.-à-d. «UK»)

(Comme référence, consultez cet article que j'ai écrit: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).

modifier

Comme indiqué dans les commentaires, l'exemple ci-dessus est médiocre comme register_taxonomy()en fait les appels add_rewrite_tag().

Concernant la documentation du Codex sur leur utilisation «en combinaison»: cela peut être trompeur car ils peuvent tous deux être utilisés indépendamment. Comme indiqué ci-dessus, cependant, add_rewrite_tag()ajoute le nom de la balise aux `` variables de requête '' de WordPress. En pratique, cela vous permet de récupérer la valeur avec get_query_var(). Ainsi, lorsqu'il add_rewrite_rule()est utilisé avec add_rewrite_tag(), la variable sera stockée par WordPress. Mais il existe d'autres façons de procéder (voir cette réponse - notez également le commentaire de Rob Vermeer).

Également lié: Comment récupérer des variables $ _GET à partir d'URL réécrites?


Merci pour cela. Une chose que je comprends de votre réponse est que cela add_rewrite_tag()peut être utilisé pour créer des espaces réservés Settings->Permalinks. À propos de l'utilisation d'une taxonomie, est-ce une exigence d'utilisation add_rewrite_tag()? Mon impression de la page Codex est que ce n'est pas le cas, mais il semble couramment utilisé. J'ai élargi ma question concernant l'utilisation add_rewrite_tag()en conjonction avec add_rewrite_rule()comme suggéré dans la page du Codex .
seron

Vous avez absolument raison sur les taxonomies (un mauvais exemple de ma part). Voir cette partie de register_taxonomy(). Un meilleur exemple serait quand vous voulez utiliser quelque chose comme %country%mais quand le pays est juste une variable de requête commune et non une taxonomie. Ces cas sont rares - je n'ai jamais eu à utiliser add_rewrite_tag().
Stephen Harris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.