web-dev-qa-db-fra.com

Le paramètre Querystring se perd dans la règle de réécriture

J'ai ajouté avec succès un type de message personnalisé et la structure de permalien fonctionne très bien. Ainsi, par exemple, j'ai un type de message personnalisé books, et le lien permanent vers un livre est /books/the-dictionary.

Mon modèle de page single-book.php accepte un paramètre letter pour personnaliser le contenu affiché sur la page. J'aimerais pouvoir créer un lien vers ceci comme /book/the-dictionary/q.

J'ai ajouté ce qui suit au fichier functions.php de mon thème:

function my_init() {
    add_books_rewrite();

function add_books_rewrite() {
    add_rewrite_rule("books/([^/]+)/([^/])/?$", 'index.php?pagename=$matches[1]&letter=$matches[2]', "top");
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
function add_books_query_vars($query_vars) {
    $query_vars[] = "letter";
    return $query_vars;
}
add_filter("init", "my_init");
add_filter("query_vars", "add_books_query_vars");

Il a fallu quelques essais pour utiliser le code de nettoyage ci-dessus, accéder manuellement à la page de paramètres de permalien, enregistrer et corriger les erreurs stupides dans l'expression régulière, mais j'ai finalement pu vérifier que la réécriture avait été ajoutée correctement à l'aide de Jan Fabry fabuleux plugin analyseur de réécriture .

confirmed in rewrite analyzer

Donc, à partir d'ici, je pense que la navigation est fluide, non? Ouais ... pas exactement.

Lorsque je charge mon site et que je passe à books/the-dictionary/q, il charge correctement le contenu the-dictionary, mais il perd le paramètre. Ce que je trouve intéressant, c’est que si je charge index.php?pagename=the-dictionary&letter=q, tout fonctionne très bien.

Pour récupérer le paramètre, j'ai le code suivant:

global $letter;
echo $letter. " - global";
echo "<br>";
$current_letter = (isset($wp_query->query_vars["letter"]) ? $wp_query->query_vars["letter"] : "all");
echo $current_letter . " - query_vars";
echo "<br><br>";

J'ai aussi regardé $_SERVER["QUERY_STRING"]. Ceux-ci sont renseignés lorsque j'utilise index.php?pagename...&letter..., mais pas lorsque j'utilise /books/pagename/letter.

Donc, il semble que quelques choses se passent ici. WordPress ne supprime pas complètement le paramètre car tout fonctionnera si je spécifie index.php avec les variables de chaîne de requête appropriées. Cela semble indiquer que la règle de réécriture ne fonctionne pas correctement. Cependant, le plugin Rewrite Analyzer semble dire que les choses sont bien préparées pour ce que je vais faire.

Je suis un peu confus quant à ce que je devrais regarder ici pour remédier à la déconnexion. Désolé si je manque quelque chose d'évident. ):

5
Rebecca Chernoff

Je pense que c'est probablement votre code frontal qui pose problème.

Essaye ça:

<?php
if( $letter = get_query_var( 'letter' ) ) 
{
        echo 'Current Letter: ' . $letter;
}
else
{
        echo 'Current Letter: All';
}
1
chrisguitarguy