web-dev-qa-db-ja.com

add_rewrite_rule:$はvarにマッチし、キャプチャされた値に置き換えられません

ファイルの実際のパスを公開せずにプラグインファイルにアクセスしたい(<a>がクリックされたとき)。私は次の書き換え規則を使っています。

add_rewrite_rule( 'continue/([0-9]+)/?$', 'wp-content/plugins/my-plugin/continue.php?where=$matches[1]', 'top' );

リクエストはcontinue.phpにリダイレクトされますが、私はcontinue.phpの中で$_GET['where']=$matches[1]の代わりに常に$_GET['where']=123を受け取ります。それはいくつかの数字に置き換えられているはずです。

これ のようなものが欲しい

更新

Monkeyman Rewrite Analyzerを試してみました しかし、私のルールが表示されません。では、なぜ正しいページにリダイレクトされるのですか?

例えばcontinue/2の場合、次のように出力されます。

(.+?)(/[0-9]+)?/?$ pagename: continue page: /2

5
a_fan

その書き換えルールは、フラッシュされているかどうかにかかわらず、まったく機能しません。

WordPressには2種類の書き換え規則があります。書き換えURLがあるものはindex.phpで始まり、そうでないものはそうです。

すべてのWordPress internal 書き換えルールはindex.phpで始まっていなければなりません。 WordPressの機能がルールセットを処理するまでに already がindex.phpファイルにリダイレクトされるため、他の場所にリダイレクトすることはできません。そのため、index.php以外のルールは直接.htaccessに入り、index.php以外の場所にリダイレクトできるようにする必要があります。

  • Index.phpで始まるものはWordPress自身の内部で処理されます。その場合は$ matches [1]構文が正しいものとなります。

  • Index.phpで始まらないものは、代わりに直接RewriteRulesとして.htaccessファイルに書き込まれます。その場合、$ matches [1]構文は意味がありません。

ルールを使用した後に.htaccessファイルを調べると、次のようになります。

RewriteRule continue/([0-9]+)/?$ wp-content/plugins/my-plugin/continue.php?where=$matches[1]

これは明らかにうまくいきません。

代わりに、コードを次のようにしてみてください。

add_rewrite_rule( 'continue/([0-9]+)/?$', 'wp-content/plugins/my-plugin/continue.php?where=$1');

代わりに1ドルの交換に注意してください?これは通常のRewriteRuleに変換されたときに正しく動作します。

13
Otto