Réécriture d’URL ou url rewriting
Posted by djudorange - 21/05/10 at 08:05:13Lorsque vous travaillez avec les taxinomies et les catégories, on peut avoir besoin de réécrire l’url afin d’atteindre la taxonomie et la catégorie en même temps.
Exemple : dans la taxinomie « genre », les terms « hommes » et « femmes ». Mais tous les deux ont les catégories « habillements » et « accessoires » mais avec des articles différents. Le mieux étant d’encodé l’url en site.com/genre/[hommes ou femmes]/category/[habillements ou accessoires].
Pour cela, il faut dans un plugin réécrire l’url:
add_action( 'generate_rewrite_rules', 'addRewriteRules' ); function addRewriteRules( $wp_rewrite ) { $new_rules = array( 'genre/([^/]+)/category/([^/]+)/?$' => 'index.php?ge=' . $wp_rewrite->preg_index(1) .'&ca=' . $wp_rewrite->preg_index(2) ); $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; } add_filter( 'query_vars', 'addQueryVar' ); function addQueryVar( $qvars ) { $qvars[] = 'ge'; $qvars[] = 'ca'; return $qvars; } add_action( 'parse_query', 'parseQuery' ); // To parse query and add the cible taxo + category function parseQuery( $query ) { remove_action( 'parse_query', 'parseQuery' ); // Options date $genre = stripslashes(get_query_var('ge')); $category = stripslashes(get_query_var('ca')); if ( !empty($genre) && !empty($category)) { // Add post_type on Query $query->is_tax = true; $query->is_category = true; $query->is_home = false; $query->query_vars['taxonomy'] = 'genre'; $query->query_vars['genre'] = $genre; $query->query_vars['term'] = $genre; $cat = get_category_by_slug($category); $query->query_vars['cat'] = $cat->term_id; $query->query_vars['category__in'] = array($cat->term_id); } }
Explications:
- la fonction addRewriteRules va ajouter la réécriture d’url qu’il faut. Elle va transformer le « /genre/hommes/category/habillements » en « index.php?ge=homme&ca=category ». Elle fonctionne avec les posix comme type de regex
- la fonction addQueryVar va rajouter dans le query les clés « ge » et « ca ».
- la fonction parseQuery va parser le query pour insérer les valeurs qu’il faut pour afficher les articles que l’on souhaite
- Enfin vous pouvez toujours utiliser l’action ‘template_redirect’ pour rediriger vers le template de votre choix. Voire l’article associé à cette fonction
Edit du 27 août 2010
Lorsque l’on rajoute une règle de réécriture, il est préférable de rajouter la possibilité de pagination ainsi que les flux xml. Pour cela vous pouvez rajouter ces règles (je prends le même contexte que avant):
function addRewriteRules( $wp_rewrite ) { $new_rules = array( 'genre/([^/]+)/category/([^/]+)/?$' => 'index.php?ge=' . $wp_rewrite->preg_index(1) .'&ca=' . $wp_rewrite->preg_index(2) ); $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; $new_rules = array( 'genre/([^/]+)/category/([^/]+)/page/page/?([0-9]{1,})/?$' => 'index.php?ge=' . $wp_rewrite->preg_index(1) .'&ca=' . $wp_rewrite->preg_index(2) . '&paged=' . $wp_rewrite->preg_index(3) ); // Pour la pagination $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; $new_rules = array( 'genre/([^/]+)/category/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?ge=' . $wp_rewrite->preg_index(1) .'&ca=' . $wp_rewrite->preg_index(2) . '&feed=' . $wp_rewrite->preg_index(3) ); // Pour le feed $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; $new_rules = array( 'genre/([^/]+)/category/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?ge=' . $wp_rewrite->preg_index(1) .'&ca=' . $wp_rewrite->preg_index(2) . '&feed=' . $wp_rewrite->preg_index(3) ); // Pour le feed $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; }
Voilà la pagination et le feed supportés.
Attention, si vous utiliser template_redirect pour charger votre template de votre choix, il faut rajouter ce qui suit afin que WordPress affiche les xml
if( is_feed() ) : return; endif;
Powered by WordPress with GimpStyle Theme design by Horacio Bella.
Entries and comments feeds.
Valid XHTML and CSS.