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)
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.
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....