it-swarm.com.de

Benutzerdefinierte Abfragevariable - Lässt WordPress zur Permalink-URL von Nice umleiten

Ich habe in den letzten Stunden nach einer Antwort gesucht, aber nichts gefunden, was mich in die richtige Richtung weist. Einige Ratschläge wären sehr dankbar!

  • Was ich schon habe:
    • Ein benutzerdefinierter Beitragstyp 'stores'
    • Eine öffentliche Abfrage var mit dem Filter Hook 'query_vars': 'state'.
    • Die entsprechende Regel zum Umschreiben wurde hinzugefügt:
      • Muster: stores/state/([^/]+)/?$
      • Übereinstimmung: index.php?post_type=stores&state=$matches[1]
    • Da 'state' ein benutzerdefiniertes Meta-Feld ist, habe ich eine Funktion hinzugefügt, die sich in den Aktions-Hook pre_get_posts einfügt und alle Abfragemagie ausführt (meta_query usw. erstellen), um nur die passende stores auf der Archivseite anzuzeigen.

Das funktioniert alles ganz gut:

Wenn ich also www.myurl.com/stores/state/austria eingebe, werden auf meiner Archivseite nur österreichische Geschäfte angezeigt.

Um die Filialen nicht nur nach URL zu filtern, enthält die Archivseite ein Formular zum Filtern. Hier stoße ich auf mein Problem: Das Formular übergibt offensichtlich nur POST oder GET-Daten, z. wie die folgenden:

www.myurl.com/stores/?state=austria

Ich kann damit umgehen, indem ich eine Überprüfung in meiner pre_get_posts-Filterfunktion hinzufüge:

if( isset( $_REQUEST['state'] ) || $query->get('state') != "" ) {

Dies ist jedoch etwas schmutzig, da ich möchte, dass WordPress automatisch zur umgeschriebenen URL umleitet:

www.myurl.com/stores/?state=austria

sollte umgeleitet werden

www.myurl.com/stores/state/austria

genauso geht es, wenn ich eine Seite oder eine Beitrags-ID eingebe und sie zum Permalink weiterleitet.

Gibt es einen anderen Aktionshaken, den ich noch nicht entdeckt habe? Wie kann ich WordPress dazu bringen, automatisch auf den hübschen Permalink umzuleiten?

Vielen Dank für jeden Hinweis.

2
mndmkr

Ich habe selbst eine Lösung gefunden. Kein Javascript erforderlich, nur eine weitere Template-Funktion. URL-Erstellung erfolgt manuell.

Die Idee ist, den Hook 'template_redirect' zu verwenden, zu prüfen, ob die angeforderte Seite die entsprechende Seite für das Geschäftsarchiv ist, dann dort nach $ _REQUEST-Variablen zu suchen und eine neue URL zu erstellen. Leiten Sie schließlich zu dieser URL weiter.

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' );

Funktioniert ziemlich gut. Korrekturen/Verbesserungsvorschläge sind natürlich willkommen.

2
mndmkr

Vielleicht ist dies nicht die beste Lösung, noch die Lösung, nach der Sie suchen, aber dies kommt mir jetzt in den Sinn, jemand kann Ihnen vielleicht eine andere geben.

Ich denke in der Seitenform hast du so etwas:

<select name="state">
   <option value="austria">Austria</option>
   ...
</select>

Mit Javascript ist es einfach, Benutzer an die hübsche URL zu senden.

(Ich habe Javascript hier eingefügt, Sie stellen sicher, dass es in einer separaten JS-Datei abgelegt und mit wp_enqueue_script in die Warteschlange gestellt wird.)

Ungetestet:

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