web-dev-qa-db-ja.com

ページから新しいエンドポイントにいるときに2つの$ _GET変数を優先するようにルールを書き換える

数レベルのパーマリンクルールを作成しようとしています。

基本ページ/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'
            );

        }
    }

私は正規表現をテストして、間違っているように見えません、それは私が必要とするものを捕らえます(123some-string)。

'page-slug/'および'page-slug/my-query-var/(2レベルの深さ)までは問題なく動作します。2つのリライトタグは、かなりパーマリンク構造で使用すると機能しません。

私は試してみた https://wordpress.org/plugins/monkeyman-rewrite-analyzer/ そしてルールはそこに表示されます - しかし私はよくわかりませんその解釈について

1
unfulvio

私はあなたが誤ってエンドポイントを使用していると思います。エンドポイントが作成されると、同じエンドポイント名の照会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_varsget_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'
        );

    }
}

:このコードをテストする前に書き換え規則をフラッシュすることを忘れないでください。

2
cybmeta