web-dev-qa-db-fra.com

optimiser wordpress rewrite rule regex

j'ai ces codes dans mon plugin wordpress pour ajouter des réécritures d'URL personnalisées:

add_action('init', function() {
    add_rewrite_rule( '^cities/(.*)/browse/(.*)/(.*)/(.*)/(.*)',
        'index.php?city_name=$matches[1]&cat_name[]=$matches[2]&cat_name[]=$matches[3]&cat_name[]=$matches[4]&cat_name[]=$matches[5]',
        'top' );

    add_rewrite_rule( '^cities/(.*)/browse/(.*)/(.*)/(.*)',
        'index.php?city_name=$matches[1]&cat_name[]=$matches[2]&cat_name[]=$matches[3]&cat_name[]=$matches[4]',
        'top' );

    add_rewrite_rule( '^cities/(.*)/browse/(.*)/(.*)',
        'index.php?city_name=$matches[1]&cat_name[]=$matches[2]&cat_name[]=$matches[3]',
        'top' );

    add_rewrite_rule( '^cities/(.*)/browse/(.*)',
        'index.php?city_name=$matches[1]&cat_name[]=$matches[2]',
        'top' );

    add_rewrite_rule( '^cities/?([^/]*)/browse',
        'index.php?city_name=$matches[1]',
        'top' );


    flush_rewrite_rules(true);

}, 10, 0);

comment puis-je réécrire (.*)/(.*)/(.*)/(.*) et obtenir $matches sous forme de tableau? Le premier élément de $matches est la valeur de la variable nom_cité et le reste sont des éléments du tableau nom_cat.

maintenant tout fonctionne mais je sais que le code peut être beaucoup plus petit.

1
Mehdi Nazari

Avec toutes les parties facultatives avec ?, vous obtenez une règle pour les gouverner toutes:

add_rewrite_rule(
    '^cities/(.*)/(browse)?/?(.*)?/?(.*)?/?(.*)?/?(.*)?/?',
    'index.php?city_name=$matches[1]&cat_name[]=$matches[3]&cat_name[]=$matches[4]&cat_name[]=$matches[5]',
    'top'
);

mais le [] ne peut pas fonctionner avec la logique WordPress, vous devez donc définir la balise de réécriture avec un nombre. essayez ça:

add_rewrite_tag("%cat_name.%", "([^&]+)");

add_rewrite_rule(
    '^cities/([^/]*)/(browse)?/?([^/]*)?/?(^/)?/?([^/]*)?/?([^/]*)?/?',
    'index.php?city_name=$matches[1]&cat_name1=$matches[3]&cat_name2=$matches[4]&cat_name3=$matches[5]',
    'top'
);
1
mmm