web-dev-qa-db-fra.com

Comment avoir plusieurs points de terminaison de réécriture dans la même URL?

J'aimerais ajouter plusieurs paires query_var/value à n'importe quelle URL. Par exemple, l'URL de base d'une page est:

example.com/Nice-page/

Je peux déjà atteindre un point de terminaison comme (par exemple, une sous-galerie sur une page):

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

my-gallery est la requête_var et animals/cats sa valeur. En utilisant ceci:

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

J'ai aussi besoin de ça pour travailler:

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

Où j'aimerais enregistrer my-lightbox en tant que noeud final supplémentaire ou query_var, car il pourrait être utilisé indépendamment de sans my-gallery, tel que:

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

Actuellement, je reçois le animals/cats/my-lightbox/1234 entier comme valeur. Je ne peux pas informer WP du fait qu'une nouvelle requête_var commence à my-lightbox lorsque my-gallery est déjà présent. Il semble que les balises de réécriture agissent sur l'intégralité de l'URL en entrée et les points de terminaison sur la fin de l'URL en entrée, mais l'ancre regex $ end est toujours là. Est-il même possible d’utiliser l’API de réécriture pour personnaliser plusieurs query_vars en une URL complexe?

2
Firsh - LetsWP.io

J'ai aussi besoin de ça pour travailler:

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

Où j'aimerais enregistrer my-lightbox en tant que noeud final supplémentaire ou query_var, car il pourrait être utilisé indépendamment de sans my-gallery, tel que:

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

Voici un exemple d'utilisation à l'aide de 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();
} );

[EDIT] Version alternative sans utiliser 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'
    );
} );

Et je l'ai testé sur ces 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' ) renvoie animals/cats (pour les première et deuxième URL) et get_query_var( 'my-lightbox' ) renvoie 1234 (pour les première et troisième URL).

3
Sally CJ