web-dev-qa-db-fra.com

Réécrire la règle pour personnaliser deux variables $ _GET dans un nouveau point de terminaison à partir d'une page

J'essaie de créer une règle de permalien qui a quelques niveaux de profondeur.

J'ai une page de base /page-slug/ - j'y ajoute un nouveau point de terminaison: /page-slug/my-endpoint/ - à partir de là, je dois imbriquer un identifiant et une chaîne contenant des variables $_GET, telles que /page-slug/my-endpoint/?some_id=123&some_string=string, qui devrait devenir: /page-slug/my-endpoint/123/string/

Tous les vars de requête ont été enregistrés avec succès et je peux les récupérer pour les utiliser dans mes méthodes (par exemple, si je fais var_dump( $wp_query->query_vars ), ils s'afficheront là où ils ont été définis via $_GET).

Ce que je ne peux pas me mettre au travail, c'est la règle de réécriture pour transformer une URL en un joli permalien (cet extrait de code est exécuté à la vitesse de hook 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'
            );

        }
    }

J'ai testé la regex et ne semble pas se tromper, il attrape ce dont j'ai besoin (123 et some-string).

Jusqu'à 'page-slug/' et aussi 'page-slug/my-query-var/ (2 niveaux de profondeur) cela fonctionne très bien, ce sont les deux balises de réécriture qui ne fonctionnent pas lorsqu'elles sont utilisées dans une jolie structure à permalien.

J'ai essayé avec https://wordpress.org/plugins/monkeyman-rewrite-analyzer/ et les règles sont affichées - mais je ne suis pas sûr à propos de leur interprétation

1
unfulvio

Je pense que vous utilisez les points d'extrémité de manière incorrecte. Lorsqu'un point final est créé, une nouvelle règle de réécriture est créée à l'aide d'une requête var portant le même nom que le noeud final. sa valeur provient de la chaîne qui suit la définition du noeud final. Donc, si vous enregistrez "my-endpoint" et construisez cette URL:

/page-slug/my-endpoint/123/some-string

Le noeud final est passé en tant que my-endpoint=123/some-string.

D'après ce que j'ai compris de votre code, vous n'avez pas besoin de la variable my-endpoint query, vous n'avez donc pas besoin de l'enregistrer. ou vous pouvez l'enregistrer avec la valeur false pour l'argument query var (cet argument n'est actuellement pas documenté dans le codex mais existe dans ) code source ):

add_rewrite_endpoint( $var, EP_PERMALINK | EP_PAGES, false );

Ou, si vous voulez que le noeud final se trouve uniquement dans les pages:

add_rewrite_endpoint( $var, EP_PAGES, false );

En outre, vous cochez 'my-endpoint' == $key buth puis incluez $var en tant que nom du point de terminaison et en tant que partie de l'URL, pas $key.

Sans savoir ce que sont $this->query_vars et get_some_page_id(), je ne peux pas tester votre code avec précision, mais cela devrait fonctionner:

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'
        );

    }
}

Note : N'oubliez pas de vider les règles de réécriture avant de tester ce code.

2
cybmeta