web-dev-qa-db-fra.com

Plusieurs valeurs dans une règle de réécriture, est-ce possible?

J'utilise des réécritures d'URL pour un filtre que je construis. La solution actuelle fonctionne pour une valeur sélectionnée. Donc si je sélectionne un type de plat comme le dîner, il passe à/recettes/dîner /.

Mais que faire si je veux filtrer le dîner et le déjeuner? Est-ce possible avec add_rewrite_rule?

La solution actuelle est la suivante.

add_filter( 'query_vars', function( $vars ) {
    $vars[] = 'course';
    return $vars;
} );

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

add_action( 'init', function() {
    add_rewrite_rule( '^recipes/([^/]*)/?', 'index.php?page_id=11&course=$matches[1]', 'top' );
}, 10, 0 );

Et s’il est possible, quelle serait la structure logique d’une URL à suivre?

3
Roy

Si j'ai bien compris, vous savez qu'il est possible d'avoir une URL telle que example.com/recipes/dinner/ ou example.com/recipes/lunch/, mais maintenant vous souhaitez également une URL telle que example.com/recipes/dinner-lunch/ qui extrait les messages des cours "dinner" et "lunch".

À l’état actuel de WP réécrit, ceci n’est pas possible uniquement avec add_rewrite_rule, mais vous devez également utiliser pre_get_posts pour modifier la requête en fonction de la valeur interceptée par la règle de réécriture.

Par exemple:

add_filter('query_vars', function($vars) {
    $vars[] = 'course';
    return $vars;
} );

add_action('init', function() {
    add_rewrite_rule('^recipes/([^/]*)/?', 'index.php?page_id=11&course=$matches[1]', 'top');
}, 10, 0);

add_action('pre_get_posts', function($query) {
  if (! is_admin() && $query->is_main_query() && $query->get('course')) {
     // explode the value of matched course by -
     $courses = explode('-', $query->get('course'));
     // update the value in query with an array
     $query->set('course', $courses);
  }
});

Le problème ici est que si un "cours" a un trait d'union dans le nom, le explode cassera la requête, vous pouvez donc peut-être utiliser un séparateur moins commun.

0
gmazzap