web-dev-qa-db-fra.com

Quel est le problème avec ma règle de réécriture pour une URL de page avec des paramètres de requête et des codes abrégés?

Je suis nouveau dans la programmation WP et j'ai des problèmes avec ce qui pourrait être un problème simple dans d'autres environnements.

J'ai créé une page (cdl-manual) à l'aide de l'interface utilisateur normale WP admin. Ensuite, j'ai ajouté des fonctions au fichier theme functions.php afin de pouvoir utiliser des codes abrégés pour le contenu de la page. Les fonctions recherchent un paramètre de requête (jp_stn) sur l'URL et utilisent ces informations pour choisir le contenu dans une table de base de données. Dans ce cas, la valeur du paramètre est le nom d'un État américain. Le contenu servi est une page axée sur cet état.

Tout ce qui fonctionne maintenant sur mon site Web dev.

http://blog.jobspetroleum.net/cdl-training/ répertorie un lien vers le manuel du CDL pour chaque état. Ces liens sont de la forme suivante, comme décrit ci-dessus.

http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona

Maintenant, je souhaite convertir cette URL de paramètre de requête spécifique à un état en une URL conviviale. C'est le nouveau modèle.

http://blog.jobspetroleum.net/cdl-manual/arizona/

La solution évidente pour moi était d’ajouter une règle de réécriture. Après beaucoup de tâtonnements, j'ai trouvé un plugin qui me permettait d'ajouter une règle de réécriture personnalisée directement au fichier .htaccess. Le plugin s'appelle "WP htaccess Control" et ça marche plutôt bien. Cependant, mes règles de réécriture ne fonctionnent pas comme elles le devraient. Voici le fichier .htaccess obtenu après avoir ajouté ma règle de réécriture.

# BEGIN WordPress

# WPhtc: Begin Custom htaccess
RewriteRule ^cdl-manual/([-a-z]+)/$ /cdl-manual/?jp_stn=$1 [L]
# WPhtc: End Custom htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

La nouvelle règle se trouve dans la section Custom htaccess. Celui-ci génère une erreur 404 lorsque je le teste avec/cdl-manual/arizona /. Pour déboguer j'ai essayé de changer les drapeaux de [L] à [R, L].

Cela a provoqué une redirection vers http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona . Le contenu de la page a été correctement chargé, mais l’URL n’a pas été réécrite. Je conclus que la règle correspond correctement. Mais sans le drapeau R, je suppose que la réécriture ne fonctionne pas correctement. La règle est correcte selon http://htaccess.madewithlove.be/ et l'URL réécrite correspond exactement à ce que je veux.

Est-ce que quelqu'un sait ce qui ne va pas ici? Est-ce que mon approche est complètement éteinte? Quel est le meilleur moyen de résoudre ce problème? Merci.

Éditer 01/10/2014 - Si cela aide quelqu'un, la page "Manuel CDL" ne contient que le contenu "[bigleaf_jobspet_cdlmanualbystate]". Cette fonction et d'autres dépendances se trouvent dans le fichier functions.php de mon thème enfant. Cette fonction particulière recherche le paramètre de requête jp_stn dans GET, lit le nom de l'état, puis extrait le contenu détaillé des tables que j'ai ajoutées à la base de données. Il retourne ensuite le code HTML pour l'état nommé.

Éditer 10/2/2014 - Creuser dans le Codex WP J'ai trouvé une référence à la variable de requête pagename pour index.php. Alors j’ai essayé quelques variantes et proposé cette règle qui fonctionne presque.

RewriteRule ^cdl-manual/([-a-z]+)/$ ?pagename=cdl-manual&jp_stn=$1 [L]

Cette règle charge la page cdl-manual mais ignore la valeur du paramètre state. Bizarrement, si je tape le motif de réécriture prévu dans un navigateur, il charge exactement la page souhaitée pour l'état spécifié.

http://blog.jobspetroleum.net/?pagename=cdl-manual&jp_stn=arizona

1
Ray N. Franklin

La raison pour laquelle vous obtenez un 404 est que la règle de réécriture ne modifie pas l'URL de la requête comme indiqué dans la variable sin $_SERVER[REQUEST_URI] de PHP, et wordpress analyse cette variable lors du choix du contenu de la requête et du fait qu'il n'existe aucune page/cdl-manual/arizona/il affiche un 404.

Ce qu'il vous faut, c'est une règle de réécriture wordpress pour analyser l'URL comme vous le souhaitez, mais je vous suggère simplement de créer une cinquantaine de sous-pages de chaque état. Cela peut être un peu gênant mais probablement aussi rapide que d’écrire et de déboguer du code de faire ce que vous voulez et beaucoup plus de prof à l’avenir quand il s’agira de personnaliser davantage chaque État.

0
Mark Kaplun

Plutôt que d’ajouter une règle à .htaccess, vous pouvez utiliser une réécriture WordPress pour cela:

function cdl_rewrite_rule(){
    add_rewrite_rule(
        'cdl-manual/([-a-z]+)/?$',
        'index.php?pagename=cdl-manual&jp_stn=$matches[1]',
        'top'
    );
}
add_action( 'init', 'cdl_rewrite_rule' );

En supposant que vous ayez déjà ajouté jp_stn à la liste des vars de requête valides:

function cdl_query_vars( $query_vars {
    $query_vars[] = 'jp_stn';
    return $query_vars;
}
add_filter( 'query_vars', 'cdl_query_vars' );

Pour que la règle entre en vigueur, vous pouvez le faire en visitant la page des paramètres de permaliens.

2
Milo