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?
add_rewrite_tag()
peut être utilisé pour créer des espaces réservésSettings->Permalinks
. À propos de l'utilisation d'une taxonomie, est-ce une exigence d'utilisationadd_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'utilisationadd_rewrite_tag()
en conjonction avecadd_rewrite_rule()
comme suggéré dans la page du Codex .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 à utiliseradd_rewrite_tag()
.