Comment créer des itinéraires d'URL personnalisés?


50

J'ai une exigence très particulière, j'espère pouvoir l'expliquer sans trop de confusion. J'ai créé un modèle de page dans lequel je liste certaines propriétés issues d'un fichier XML externe. Jusqu'à présent, aucun problème, supposons que l'URL ressemble à ceci:

http://www.example.com/properties/

Chaque propriété a un lien qui devrait rediriger l'utilisateur vers une page "Propriété unique" qui affiche plus d'informations à ce sujet. Je me demandais s'il y avait un moyen de faire le lien comme ceci:

http://www.example.com/properties/123

123serait l'id de la propriété. Donc, si j'ai l'URL comme properties/some_idje veux pouvoir charger un fichier de vue (comme le single.phpou les page.phpfichiers) mais spécifique à cette condition d'URL.

Est-ce possible?

Réponses:


58

Ajoutez ceci au functions.php de votre thème, ou mettez-le dans un plugin .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Cela ajoute une règle de réécriture qui dirige les requêtes /properties/avec n'importe quelle combinaison de nombres après pagename properties, avec le property_idparamètre var var . Assurez-vous simplement de visiter la page des paramètres de votre permalien et de l’enregistrer pour vider les règles de réécriture afin que cette nouvelle règle soit incluse.

Dans votre page-properties.phpmodèle, get_query_var('property_id')l'id de la propriété sera retourné s'il a été défini, sinon, affichez la page de propriétés par défaut.


4
C'était proche de travailler pour moi, mais je devais ajouter: add_filter ('init', 'flushRules'); fonction flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel

19
@tooshel vous ne voulez certainement pas vider les règles à chaque requête, c'est une opération coûteuse qui ralentira votre site. il suffit de vider les règles une seule fois, lors de l'activation d'un plugin ou simplement en visitant la page des paramètres de permaliens.
Milo

Oui, je comprends ça. . . mais quand vous testez, c'est bien que ce soit là!
Tooshel

3
Une regexp url plus intelligente pourrait être une expression rationnelle ^properties/([0-9]+)/?. Sinon, cela correspondrait à quelque chose commeexample/properties/1
Ryan Taylor

@RyanTaylor êtes-vous sûr de cela? il ne capture pas example/properties/1quand je le teste.
Milo

9

Une autre façon de le faire:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex Rewrite API / règle de réécriture add

Codex Rewrite API / balise add rewrite


2
La réponse acceptée fonctionne avec 4.7 (et 4.8), vous ne savez pas pourquoi vous pensez que non. Votre code fait essentiellement la même chose, add_rewrite_tagajoute la requête var au même tableau que le query_varsfiltre.
Milo

@Milo, ça n'a probablement pas fonctionné pour moi, mais je n'ai plus de 4.7, donc je ne peux pas vérifier. Je vais éditer ma réponse.
Christian Lescuyer

@Milo Bien que je préfère personnellement réécrire tag, mais toujours testé la réponse acceptée et cela fonctionne. Juste quelques goûts personnels, cependant.
Jack Johansson

1
Les étiquettes de réécriture de @JackJohansson sont nécessaires lorsque vous l'utilisez de manière permanente . C'est juste un peu plus de données que WordPress n'utilise jamais dans ce cas.
Milo

les deux règles peuvent être ajoutées à la même méthode, aboutissant à une fonction plus propre et plus utile pour revenir et déterminer si un travail de maintenance est
nécessaire
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.