web-dev-qa-db-ja.com

同じURLに複数の書き換えエンドポイントを設定する方法

任意のURLに複数のquery_var/valueペアを追加したいです。たとえば、ページのベースURLは次のとおりです。

example.com/Nice-page/

私はすでに1つのエンドポイントを達成することができます(たとえば、ページ上のサブギャラリー)。

example.com/Nice-page/my-gallery/animals/cats

my-galleryはquery_var、animals/catsはその値です。これを使う:

add_rewrite_endpoint('my-gallery', EP_PAGES);
add_rewrite_endpoint('my-lightbox', EP_PAGES);

私はこれが機能するためにも必要です:

example.com/Nice-page/my-gallery/animals/cats/my-lightbox/1234

my-lightboxを追加のエンドポイントまたはquery_varとして登録したいのですが、my-galleryがなくても独立して使用できるため、次のようになります。

example.com/another-page/my-lightbox/2345

現在私は値として全体のanimals/cats/my-lightbox/1234を得ます。 my-lightboxが既に存在する場合、WPに新しいquery_varがmy-galleryで始まることを認識させることができません。書き換えタグが入力URL全体に作用しているようです。エンドポイントは入力URLの最後に作用しますが、正規表現の$ end-anchorは常にそこにあります。複数のquery_varsを複雑なURLに整形するために書き換えAPIを使用することさえ可能ですか?

2

私はこれが機能するためにも必要です:

example.com/Nice-page/my-gallery/animals/cats/my-lightbox/1234

my-lightboxを追加のエンドポイントまたはquery_varとして登録したいのですが、my-galleryがなくても独立して使用できるため、次のようになります。

example.com/another-page/my-lightbox/2345

これはadd_rewrite_rule()を使ったそれの例です:

add_action( 'init', function() {
    // This will let you use get_query_var( 'my-gallery' ).
    add_rewrite_endpoint( 'my-gallery', EP_PAGES );

    // This will let you use get_query_var( 'my-lightbox' ).
    add_rewrite_endpoint( 'my-lightbox', EP_PAGES );

    add_rewrite_rule(
        '(.?.+?)/(?:my-gallery/(.+?)/my-lightbox/(\d+)|my-gallery/(.+?)|/?my-lightbox/(\d+))/?$',
        'index.php?pagename=$matches[1]&my-gallery=$matches[2]&my-lightbox=$matches[3]',
        'top'
    );

    // This is just for testing purposes. You should instead go to the Permalink
    // Settings page and click on the Save Changes button to flush the rules. =)
    //flush_rewrite_rules();
} );

[編集] add_rewrite_endpoint()を使わない代替版:

add_filter( 'query_vars', function( $qv ) {
    // This will let you use get_query_var( 'my-gallery' ).
    $qv[] = 'my-gallery';

    // This will let you use get_query_var( 'my-lightbox' ).
    $qv[] = 'my-lightbox';

    return $qv;
} );

add_action( 'init', function() {
    add_rewrite_rule(
        '(.?.+?)/(?:my-gallery/(.+?)/my-lightbox/(\d+)|my-gallery/(.+?)|/?my-lightbox/(\d+))/?$',
        'index.php?pagename=$matches[1]&my-gallery=$matches[2]&my-lightbox=$matches[3]',
        'top'
    );
} );

そして私はこれらのURLでそれをテストしました:

  • example.com/Nice-page/my-gallery/animals/cats/my-lightbox/1234
  • example.com/Nice-page/my-gallery/animals/cats
  • example.com/Nice-page/my-lightbox/1234

..where get_query_var( 'my-gallery' )animals/cats(最初と2番目のURL)を返し、get_query_var( 'my-lightbox' )1234(1番目と3番目のURL)を返します。

3
Sally CJ