web-dev-qa-db-ja.com

wordpressの書き換えルールの正規表現を最適化する

私はカスタムURLの書き換えを追加するために私のwordpressのプラグインでこのコードを持っています:

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);

どうやって(.*)/(.*)/(.*)/(.*)を書き換えて$matchesを配列として得ることができますか? $matchesの最初の要素はcity_name変数値で、残りの要素はcat_name配列要素です。

今はすべてうまくいきますが、コードはもっと小さくてもかまいません。

1
Mehdi Nazari

すべての部分が?でオプションであるので、それらすべてを支配するための1つの規則を取得します。

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

しかし[]はWordPressロジックでは動作しないため、書き換えタグを数字で定義する必要があります。試してみてください。

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