Je cherchais une réponse depuis deux heures mais je n’ai rien trouvé qui puisse me diriger dans la bonne direction. Quelques conseils seraient très appréciés!
'stores'
'query_vars'
: 'state'
.stores/state/([^/]+)/?$
index.php?post_type=stores&state=$matches[1]
'state'
est un champ méta personnalisé, j'ai ajouté une fonction accrochée dans pre_get_posts
action en effectuant toute la magie de la requête (création de meta_query
etc.) pour afficher uniquement le stores
correspondant dans la page d'archivage.Cela fonctionne très bien:
Donc, si je saisis www.myurl.com/stores/state/austria
, ma page d'archive ne montre que les magasins autrichiens.
Pour filtrer les magasins non seulement par url, la page d'archivage inclut un formulaire pour les filtrer. C’est là que j’ai rencontré mon problème: le formulaire ne transmet évidemment que les données POST ou GET, par exemple. comme ce qui suit:
www.myurl.com/stores/?state=austria
Je peux gérer cela en ajoutant une vérification dans ma fonction de filtre pre_get_posts
:
if( isset( $_REQUEST['state'] ) || $query->get('state') != "" ) {
Cependant, c'est un peu sale car je voudrais que wordpress redirige automatiquement vers l'URL réécrite:
www.myurl.com/stores/?state=austria
devrait être redirigé vers
www.myurl.com/stores/state/austria
de la même manière, cela est fait si je saisis un ID de page ou de post et que le lien est redirigé vers le permalien.
Y a-t-il un autre crochet d'action que je n'ai pas encore découvert? Comment pourrais-je faire que WordPress redirige automatiquement vers le joli permalien?
Merci pour chaque indice.
J'ai trouvé une solution moi-même. Pas de javascript nécessaire, seulement une autre fonction de template. Création d'URL faite manuellement.
L'idée est d'utiliser le hook 'template_redirect', de vérifier si la page demandée est la page d'archivage de magasin correspondante, puis de rechercher les vars $ _REQUEST et de créer une nouvelle URL. Enfin rediriger vers cette URL.
function my_template_redirect() {
if ( is_post_type_archive( 'stores' ) ) {
if ( isset( $_REQUEST['state'] ) ) {
$myurl = get_post_type_archive_link( 'stores' );
if (substr($myurl, -1) != "/") $myurl .= "/";
$myurl .= "state/";
$myurl .= trim( sanitize_title_for_query( $_REQUEST['state'] ) ) . "/";
exit( wp_redirect( $myurl ) ) ;
}
}
}
add_action( 'template_redirect', 'my_template_redirect' );
Fonctionne assez bien. Les corrections/meilleures idées sont les bienvenues bien sûr.
Peut-être que ce n'est pas la meilleure solution, ni la solution que vous recherchez, mais cela me vient à l'esprit maintenant, quelqu'un peut peut-être vous en donner une autre.
Je pense que dans le formulaire de page vous avez quelque chose comme ceci:
<select name="state">
<option value="austria">Austria</option>
...
</select>
En utilisant javascript, il est facile d’envoyer l’utilisateur à la jolie URL.
(Je mets javascript ici, vous vous assurez de le mettre dans un fichier js séparé et de le mettre en file d'attente avec wp_enqueue_script
)
Non testé:
jQuery().ready(function($) {
$('select[name="state"]').change(function(e){
e.preventDefault();
var state = $(this).children('option:selected').val();
window.location.href = window.location.href + '/' + state;
});
});