web-dev-qa-db-fra.com

Variable de requête personnalisée - Obtenir WordPress à rediriger vers l'URL permalien Nice

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!

  • Ce que j'ai déjà:
    • Un article personnalisé tapez 'stores'
    • Une requête publique var utilisant le hook de filtre 'query_vars': 'state'.
    • Ajout de la règle de réécriture correspondante:
      • Pattern: stores/state/([^/]+)/?$
      • Match: index.php?post_type=stores&state=$matches[1]
    • Comme '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 storescorrespondant 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.

2
mndmkr

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.

2
mndmkr

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;
  });
});
0
gmazzap