web-dev-qa-db-fra.com

Quand faut-il utiliser add_rewrite_tag ()?

J'ai passé quelques jours à essayer d'apprendre le meilleur moyen d'ajouter des règles de réécriture. Jusqu'ici, j'ai cru comprendre qu'un moyen approprié d'ajouter des règles simples consiste à utiliser add_rewrite_rules(), avec un grand merci à Jan Fabry dans cet échange pour qui ses précisions ont été très utiles.

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

edit: _ Sa La page Codex parle de son utilisation générale en conjonction avec add_rewrite_rules(), mais ne précise pas. De même, la page Codex for add_rewrite_rules() fait référence à add_rewrite_tags() mais elle est également très rare en informations. Quand et comment une telle combinaison serait-elle utilisée? Le seul exemple que j'ai trouvé est cette réponse de Rob Vermeer que je ne comprends pas.

21
seron

La différence fondamentale est:

  • La add_rewrite_rule() ajoute une règle particulière interprétée
  • La 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 qui annonce des hôtels dans différents pays. Vous voudrez peut-être l'URL d'un hôtel

  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 nous devrions 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 (posts) où il déborde sur plusieurs pages etc.

Générer ces règles peut devenir compliqué. De plus, nous serons probablement en concurrence avec les propres règles de WordPress pour ce type de message, générées à partir du permastructure que nous avons défini lors de l’enregistrement du type de message. (Dans tous les cas, laissez WordPress faire le travail).

Cette "permastructure" - similaire à celle 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 contenant unknown (le pays) - que nous voulons interpréter - nous devons fournir un espace réservé de la forme %country%. (C'est presque identique à %category% pour les posts).

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 balise %country% - vous devez lui indiquer de le faire. (Je couvre cela dans un article que 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 ne pouvez pas utiliser avec une règle de réécriture standard).

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

En ajoutant un tag, nous pouvons l’utiliser dans les permastructures. WordPress sait alors

  • Quoi attendre
  • Comment interpréter l'URL (cochez-la)
  • Comment interpréter la valeur (c'est-à-dire 'UK')

(Comme référence voir cet article, 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 pauvre car register_taxonomy() appelle en fait add_rewrite_tag().

En ce qui concerne la documentation du Codex sur leur utilisation "en combinaison": c'est peut-être trompeur, car ils peuvent tous deux être utilisés indépendamment. Comme indiqué ci-dessus, toutefois, 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, lorsque add_rewrite_rule() est utilisé avec add_rewrite_tag(), la variable sera stockée par WordPress. Mais il existe d'autres moyens de le faire (voir cette réponse - remarquez également le commentaire de Rob Vermeer).

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

19
Stephen Harris