3

アップデート

書き換え API のコーデックス ドキュメントを調べたところ、 functions.php に次の内容が含まれています。

function my_rewrite_rules() {
    add_rewrite_rule('(a|b|c|d)/?$', 'index.php?pagename=$matches[1]-overview&myVar=var', 'top');
}
add_action('init', 'my_rewrite_rules');

はい、パーマリンク ページに移動して、調整後にルールをフラッシュします。ページが存在し、アドレスバーに直接入力してアクセスできる場合でも、動作は同じです。404 より上のルールです。ただし、正規表現の一致の 1 つを次のようにハードコードすると、次のようになります。

function my_rewrite_rules() {
    add_rewrite_rule('(a|b|c|d)/?$', 'index.php?pagename=a-overview&myVar=var', 'top');
}
add_action('init', 'my_rewrite_rules');

その後、すべてが期待どおりに機能し、クエリ変数が正しく設定されます。アイデア?


元の質問

私はかなり前からWordpressの書き換えルールを機能させようとしてきましたが、次のコード(functions.php内)が機能しない理由について完全に困惑しています:

function my_rewrite_rules($rules) {
    $my_rules = array('(a|b|c|d)/?$' => 'index.php?pagename=$matches[1]-overview&my_var=somevar');

    return array_merge($my_rules, $rules);
}
add_filter('page_rewrite_rules', 'my_rewrite_rules');

正規のリダイレクトを無効にし、書き換えは 404 のみです。リダイレクトが有効になっている場合、正しいページに移動しますが、クエリ変数が削除されます。「$matches[1]」を削除して a、b、c、または d に置き換えると、標準リダイレクトが無効になっていて、すべてが期待どおりに機能します。いくつかの回避策があることはわかっていますが、次の方法が機能しない理由を理解したいだけですか? ありがとう!

4

1 に答える 1

0

どうやら、ページ名クエリ変数の直後に $matches 変数を持つことは、Wordpress の url_to_post() 関数で特別なケースとして扱われます。そのコードのスニペットを次に示します。

if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) {
    // this is a verbose page match, lets check to be sure about it
    if ( ! get_page_by_path( $matches[ $varmatch[1] ] ) )
        continue;
}

これを正しく読むと、Wordpress は $matches 変数がページ パスと一致する必要があると (誤って) 想定しているようです。aしたがって、あなたの例では、名前が,のページがない場合bcまたはd書き換えルールは完全にスキップされます (continue が呼び出されます)。

私はWordpressのコードを読んでこれを推測しましたが、私の理論をテストしていません(実際にWordpressを使ったことはありません)。a、、、、という名前のページを作成しb、コードを再度実行することでc、 私の理論をテストできます。d私が正しければ、これでルールが機能するはずです。ページ名の後ろに使用しないことを-overviewお勧めします。これにより、問題が解決します。

于 2013-03-06T10:57:30.780 に答える