数レベルのパーマリンクルールを作成しようとしています。
基本ページ/page-slug/
があります - それに新しいエンドポイントを追加します:/page-slug/my-endpoint/
- ここから、$_GET
のように、/page-slug/my-endpoint/?some_id=123&some_string=string
変数を含む1つのidと1つの文字列をネストする必要があります。/page-slug/my-endpoint/123/string/
すべてのクエリ変数が正しく登録されたので、それらを自分のメソッドで使用するために取得できます(たとえば、var_dump( $wp_query->query_vars )
を実行すると、$_GET
で設定された場所に表示されます)。
うまく行かないのは、URLをかなりパーマリンクにするための書き換え規則です(このスニペットはinit
フック時に実行されます)。
foreach ( $this->query_vars as $key => $var ) {
add_rewrite_endpoint( $var, EP_PERMALINK | EP_PAGES, $var );
if ( 'my-endpoint' == $key ) {
add_rewrite_tag( '%some_id%', '([^&]+)' );
add_rewrite_tag( '%some_string%', '([^&]+)' );
$page_id = get_some_page_id();
$page_slug = get_post( $page_id )->post_name;
// e.g. /page-slug/my-endpoint/123/some-string/
add_rewrite_rule(
"{$page_slug}/{$var}/([^/]*)/([^/]*)/?$",
'index.php?page_id=' . $page_id . '&some_id=$matches[1]&some_string=$matches[2]',
'top'
);
}
}
私は正規表現をテストして、間違っているように見えません、それは私が必要とするものを捕らえます(123
とsome-string
)。
'page-slug/'
および'page-slug/my-query-var/
(2レベルの深さ)までは問題なく動作します。2つのリライトタグは、かなりパーマリンク構造で使用すると機能しません。
私は試してみた https://wordpress.org/plugins/monkeyman-rewrite-analyzer/ そしてルールはそこに表示されます - しかし私はよくわかりませんその解釈について
私はあなたが誤ってエンドポイントを使用していると思います。エンドポイントが作成されると、同じエンドポイント名の照会varを使用して新しい書き換え規則が作成されます。その値は、エンドポイント定義に続く文字列から取得されます。それで、あなたが "my-endpoint"を登録しそしてこのURLを構築するならば
/page-slug/my-endpoint/123/some-string
エンドポイントはmy-endpoint=123/some-string
として渡されます。
あなたのコードから私が理解している限りでは、あなたはmy-endpoint
クエリ変数を必要としないので、あなたはそれを登録する必要はありません。または、query var引数にfalse
値を指定して登録することもできます(この引数は現在 codex には文書化されていませんが、 ソースコード に存在します)。
add_rewrite_endpoint( $var, EP_PERMALINK | EP_PAGES, false );
あるいは、エンドポイントをページだけにしたい場合は、次のようにします。
add_rewrite_endpoint( $var, EP_PAGES, false );
また、'my-endpoint' == $key
buthをチェックしてから、$var
ではなく、エンドポイント名およびURLの一部として$key
を含めます。
$this->query_vars
とget_some_page_id()
が何であるかを知らなくても、私はあなたのコードを正確にテストすることはできませんが、これはうまくいくはずです:
foreach ( $this->query_vars as $key => $var ) {
if ( 'my-endpoint' == $key ) {
add_rewrite_tag( '%some_id%', '([^&]+)' );
add_rewrite_tag( '%some_string%', '([^&]+)' );
$page_id = get_some_page_id();
$page_slug = get_post( $page_id )->post_name;
// e.g. /page-slug/my-endpoint/123/some-string/
// $key is equal to my-endpoint here because of the previous check
add_rewrite_rule(
"^{$page_slug}/{$key}/([^/]*)/([^/]*)/?$",
'index.php?page_id=' . $page_id . '&some_id=$matches[1]&some_string=$matches[2]',
'top'
);
}
}
注:このコードをテストする前に書き換え規則をフラッシュすることを忘れないでください。