web-dev-qa-db-fra.com

add_rewrite_rule ne fonctionne pas pour la page var

J'ai une page appelée mypage et une requête personnalisée appelée mycustomvar, j'essaye de réécrire l'URL suivante:

http://example.com/index.php?name=mypage&mycustomvar=someword

à

http://example.com/mypage/someword

en utilisant

add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?name=mypage&mycustomvar=$matches[1]', 'top' );

Mais tout ce que je reçois c'est:

http://example.com/mypage/?mycustomvar=someword

montrant dans l'URL. J'ai aussi essayé d'ajouter les deux

add_rewrite_tag( '%mycustomvar%', '([^/]+)' );

ainsi que de vous assurer que mycustomvar est ajouté à mes vars de requête personnalisés via le filtre query_vars

(et j'ai essayé divers combos avec et sans nom de page, et en utilisant page ou pagename à la place de name, le tout sans chance)

3
Stephen

OK, obtenons d’abord des éclaircissements définitifs sur les vars de requête appropriés.

Reportez-vous à Paramètres de publication et de page sur la page de codex WP_Query.

name (string) - utilise post slug.

pagename (string) - utilise un slug de page.

Nous pouvons le confirmer avec WP_Query:

$args = array(
    'name' => 'mypage'
);
$mypage = new WP_Query( $args );

echo '<pre>';
print_r( $mypage );
echo '</pre>';

qui produira:

SELECT wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_name = 'mypage'
AND wp_posts.post_type = 'post'
ORDER BY wp_posts.post_date DESC

Il recherche mypage slug dans le type de poste post. Si nous changeons ceci en pagename, cela ressemble au type d'article page.

La raison pour laquelle kind of fonctionne sur la requête principale avec name est due à la fonction redirect_guess_404_permalink qui démarre lorsque la requête initiale est un 404. Il lance une autre requête pour rechercher la correspondance la plus proche et redirigez là, si quelque chose est trouvé. Cela entraîne également la suppression de tous les paramètres supplémentaires de l'URL.

Une chose importante à noter avec les types de publication hiérarchiques: si votre page est l'enfant d'une autre page, vous devez définir la variable pagename avec le chemin parent/child, car différents parents peuvent avoir des enfants avec le même slug.

En ce qui concerne votre question, changer la requête var en pagename fonctionne avec votre code d'origine dans la v4.7.2 et le thème Twenty Sixteen:

function wpd_mypage_rewrite() {
    add_rewrite_tag(
        '%mycustomvar%',
        '([^/]+)'
    );
    add_rewrite_rule(
        '^mypage/([^/]+)/?',
        'index.php?pagename=mypage&mycustomvar=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wpd_mypage_rewrite' );

Notez que j'ai utilisé add_rewrite_tag ici. Vous pourriez à la place utiliser le filtre query_vars . La raison pour laquelle add_rewrite_tag fonctionne est qu’elle ajoute en interne la requête var via le même filtre.

N'oubliez pas de effacer les règles de réécriture après l'ajout/la modification de règles. Vous pouvez également le faire en visitant la page Paramètres> Permaliens.

Vous pouvez alors echo get_query_var( 'mycustomvar' ); dans le modèle et la valeur est sortie.

2
Milo

UGH je (peut-être) viens de le comprendre. Je n'avais pas besoin de ma variable pour avoir un nom, juste un emplacement.

Donc changer ma règle de réécriture pour ceci a fonctionné:

add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?pagename=mypage&$matches[1]', 'top' );

MAINTENANT ma page chargera correctement l'URL:

http://example.com/mypage/someword

Bien que cela ait dit, je n’ai pas d’autre moyen que de placer l’URL pour lire ma variable someword et en faire quelque chose, mais je suppose que c’est suffisant, à moins que quelqu'un ne puisse m'indiquer une meilleure façon de me permettre d'interroger cette variable par son prénom....

0
Stephen