Bedingter Dropdown-Filter für zwei Ebenen für benutzerdefinierten Post-Typ

Ich habe einen benutzerdefinierten Posttyp und eine Taxonomie eingerichtet. Der Post-Typ heißt Lokale Dienste und die hierarchische Taxonomie heißt Regionen. Die Regionen haben untergeordnete Kategorien namens Areas. Ich habe eine benutzerdefinierte Seite eingerichtet, um meine Ergebnisse anzuzeigen. Bis jetzt habe ich es geschafft, die neuesten 10 Beiträge anzuzeigen. Aber was ich tun muss, ist ein Ergebnis auf dieser Seite anzuzeigen. Um dies zu tun, muss ich ein Dropdown-Menü von Regionen haben und dann, entsprechend welcher Region ausgewählt wird, würde dies dann ein zweites Dropdown-Menü der Kindbereiche anzeigen. Der Benutzer würde dann einen Bereich auswählen.

Ich möchte das Ergebnis auf meiner benutzerdefinierten Schablonenseite anzeigen. Wenn ein Besucher also zunächst auf die Seite zugreift, gibt es eine kurze Beschreibung mit dem Dropdown-Menü für Regionen.

Das hört sich relativ einfach an und ich habe hier ähnliche Fragen angeschaut, kann aber keine Lösung finden.

Kann mir bitte jemand helfen?


Dies ist, was ich bisher in meiner benutzerdefinierten Seitenvorlage, die ein einzelnes Ergebnis (die neueste) anzeigt. Aber ich möchte, dass meine Seite eine Dropdown-Liste von Regionen und eine andere mit ihren zugehörigen Bereichen anzeigt, so dass ein Benutzer dann ein einzelnes Ergebnis erhält, das seinen ausgewählten Bereich anzeigt. Die Seite sollte keine benutzerdefinierten Post-Informationen anzeigen, bis ein Benutzer diese beiden Optionen ausgewählt hat.

$args = array( 'post_type' => 'local_services', 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '
'; the_content(); echo '
'; endwhile;

UPDATE: 12. DEZEMBER

Mein benutzerdefinierter Post- und Taxonomiecode:

  array( 'name' => __( 'Local Services' ), 'singular_name' => __( 'Local Service' ), 'edit_item' => __( 'Edit Local Service' ), 'update_item' => __( 'Update Local Service' ), ), 'public' => true, 'menu_position' => 5, 'rewrite' => array('slug' => 'local-services') ) ); } add_action( 'init', 'create_post_type' ); function region_taxonomy() { register_taxonomy( 'region', 'local_services', array( 'hierarchical' => true, 'label' => 'Region', 'query_var' => true, 'rewrite' => array('slug' => 'region') ) ); } add_action( 'init', 'region_taxonomy' ); ?> 

UPDATE: 18. DEZEMBER

Ich schaute auf die wp_dropdown_categories und fand etwas Code, um es anzupassen. Ich entschied mich für eine einfachere Option mit nur einem Drop-Down anstelle von zwei. Ich habe einen neuen benutzerdefinierten Beitragstyp “Dienste” und einen neuen Taxonomiebereich erstellt.

Ich habe den neuen Code in meine Seitenleiste eingefügt:

  <?php $categories = get_categories('taxonomy=area'); $select = "n"; $select.= "Select your local arean"; foreach($categories as $category){ if($category->count > 0){ $select.= "slug."'>".$category->name.""; } } $select.= ""; echo $select; ?> <!-- var dropdown = document.getElementById("cat"); function onCatChange() { if ( dropdown.options[dropdown.selectedIndex].value != -1 ) { location.href = "/services/"+dropdown.options[dropdown.selectedIndex].value+"/"; } } dropdown.onchange = onCatChange; --> 

Ich habe auch eine benutzerdefinierte Vorlage “single-services.php” erstellt, um den Ergebnisinhalt anzuzeigen. Da ich nur ein einziges Ergebnis pro Abfrage möchte, funktioniert das großartig.

Solutions Collecting From Web of "Bedingter Dropdown-Filter für zwei Ebenen für benutzerdefinierten Post-Typ"

Wie ich im Kommentar gesagt habe, kann dies mit zwei Dropdowns getriggers werden. Zusätzlich habe ich Sie bereits auf eine meiner Antworten hinweisend für eine einfache, einstufige, nicht-bedingte Kategorieauswahl angedeutet. Kategorie-Dropdowns können einfach mit WordPress erstellt werden, indem Sie wp_dropdown_categories .

Damit es als tatsächliche Auswahl funktioniert, die an eine Abfrage übergeben wird, muss das Dropdown-Formular Teil eines Formulars sein. Auf diese Weise kann die nach der Formularmethode konstruierte Variable für die auszuführende Abfrage verwendet werden. Ich habe POST als Methode hier gewählt, GET wäre die andere Möglichkeit, casting Sie einen Blick auf meine verknüpfte Antwort für ein bisschen mehr Informationen dazu. Die Methode, wie das Formular erstellt wird, ist eine Anpassung dieses Beispiels aus der wp_dropdown_categories() Seite wp_dropdown_categories() . Hier müssen Sie das Echo deaktivieren und den ausgewählten Ausgang anpassen. Indem wir es auf diese Weise machen, können wir eine Schaltfläche weniger Formular einreichen, aber wenn kein Javascript verfügbar ist, haben wir ein Fallback, um die Schaltfläche noscript – die Schaltfläche ist in noscript Tags eingeschlossen.

Für diesen Aufbau sind mehrere Schritte notwendig. Die folgende Lösung arbeitet mit einer hierarchischen Taxonomie, um zwischen Regionen und Bereichen zu unterscheiden. Im Fall einer benutzerdefinierten Taxonomie müssen Sie den taxonomy . In einem ersten Schritt wollten wir sicherstellen, dass das Dropdown-Menü “Regionen” nur die oberste Ebene in der Hierarchie anzeigt, und zwar mit dem Parameter hierarchical und depth . Zusätzlich gibt es Bedingungszustände für die Fälle »keine Option ausgewählt« und »Option ausgewählt« – Parameter show_option_none und selected , abhängig von $_POST['region'] .

Die zweite Bereichsauswahl wird nur angezeigt, wenn zuvor eine Region ausgewählt wurde. Es wäre sowieso nicht sinnvoll, da sein Inhalt durch das erste, region dropdown bestimmt wird. Dazu wird der Parameter child_of benutzt, um ihn natürlich wieder in die ausgewählte Region zu bringen, die in $_POST['region'] gespeichert ist. Eine andere Sache, die wir tun müssen, ist sicherzustellen, dass wir die Informationen über die Region behalten, denn die versteckte Eingabe ist Teil der zweiten Form. Letzteres stellt sicher, dass wir die Region durchlaufen, solange wir nur die Gebiete verändern.

Der letzte Teil des Setups sorgt dafür, dass der Inhalt bedingt zurückgegeben wird. Zum einen möchten wir sicherstellen, dass ein Beitrag nur angezeigt wird, wenn eine Region und ein Bereich ausgewählt ist. Wenn dies der Fall ist, wird der korrekte Post durch Verwendung des cat Parameters von WP_Query . Wie unten gezeigt, ist es möglich, die Bedingungen zu verwenden, um zusätzliche Informationen für den Benutzer anzuzeigen.

Code:

Teil 1:

  
< ?php $args = array( // hierarchical is needed to define depth 'hierarchical' => 1, // regions are the top level in a hierarchical taxonomy 'depth' => 1, 'orderby' => 'name', // we're not echoing, because we want to construct a no button solution 'echo' => 0, 'taxonomy' => 'regions', // this leads to variable name $_POST['region'] 'name' => 'region' ); if( ! isset($_POST['region']) ): // if no region was selected prior we show this by default $args['show_option_none'] = 'Select Region'; else: // otherwise make sure the region form shows what was selected before $args['selected'] = $_POST['region']; endif; // we're putting the dropdown output into a variable $region = wp_dropdown_categories( $args ); // this enables the buttonless js possibility $region = preg_replace("#

Teil 2:

  < ?php // the area dropdown is only shown if a region was selected if( isset($_POST['region']) && $_POST['region'] ): ?> 
< ?php // we add a hidden input to hand over the region selected ?>
< ?php $args = array( // the areas to show are children of the prior selected region 'child_of' => $_POST['region'], 'hide_if_empty' => true, 'orderby' => 'name', 'echo' => 0, 'taxonomy' => 'regions', 'name' => 'area' ); if( ! isset($_POST['area']) ): $args['show_option_none'] = 'Select Area'; endif; $area = wp_dropdown_categories( $args ); $area = preg_replace("#
< ?php endif; ?>

Teil 3:

  < ?php // we're only performing a query if both a region and an area have been selected if( isset($_POST['region']) && isset($_POST['area']) && $_POST['region'] && $_POST['area'] ): $args = array( 'post_type' => 'local_services', // this assures the post is selected by the area selected 'cat' => $_POST['area'], 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '
'; the_content(); echo '
'; endwhile; // show conditional information according to the step we're at elseif( isset($_POST['region']) && ! isset($_POST['area']) && $_POST['region'] ): echo 'Please select an area'; else: echo 'Please select a region'; endif; ?>

Ich teile das nur in Teile auf, um es ein bisschen besser lesbar zu machen, diese drei Teile sind tatsächlich nahtlos zusammen. Dies kann direkt in Ihrer Vorlage verwendet werden, oder eine function könnte daraus erstellt werden, wenn Sie Ihre Vorlagen sauber halten möchten. Das ist alles. Wie Sie gesehen haben, habe ich auch den Code kommentiert, also sollte das Verfahren mit der obigen Erklärung ziemlich klar sein. Werfen Sie einen Blick auf die entsprechenden Dokumentationen oder suchen Sie hier nach weiteren Informationen, um sie an Ihre Bedürfnisse anzupassen.


Hinweis: Ich habe dies getestet und laufe ähnlich, daher bin ich mir nicht sicher, was das OP das Problem war. Soweit es mich betrifft, funktioniert das.


Edit: als Antwort auf einen Kommentar

Debuggen Sie? Möglicherweise haben Sie hier widersprüchliche Abfrage-Vars, weil Ihr Taxonomie-Name tatsächlich »Region« und nicht »Regionen« ist. Anstatt zu verwenden

 'query_var' => true 

du könntest es versuchen

 'query_var' => 'regions' 

Oder geben Sie dem Formular einen anderen name als die region , vergessen Sie nicht, alle zugehörigen $_POST Variablen entsprechend zu ändern.

Der Code von ialocin funktioniert ziemlich gut, aber wenn Sie eine benutzerdefinierte Taxonomie verwenden wollen, dann sollte es so sein:

Teil 1:

  
< ?php $args = array( // hierarchical is needed to define depth 'hierarchical' => 1, // regions are the top level in a hierarchical taxonomy 'depth' => 1, 'orderby' => 'name', // we're not echoing, because we want to construct a no button solution 'echo' => 0, 'taxonomy' => 'regions', // this leads to variable name $_POST['region'] 'name' => 'region' ); if( ! isset($_POST['region']) ): // if no region was selected prior we show this by default $args['show_option_none'] = 'Select Region'; else: // otherwise make sure the region form shows what was selected before $args['selected'] = $_POST['region']; endif; // we're putting the dropdown output into a variable $region = wp_dropdown_categories( $args ); // this enables the buttonless js possibility $region = preg_replace("#

Teil 2:

  < ?php // the area dropdown is only shown if a region was selected if( isset($_POST['region']) && $_POST['region'] ): ?> 
< ?php // we add a hidden input to hand over the region selected ?>
< ?php $args = array( // the areas to show are children of the prior selected region 'child_of' => $_POST['region'], 'hide_if_empty' => true, 'orderby' => 'name', 'echo' => 0, 'taxonomy' => 'regions', 'name' => 'area' ); if( ! isset($_POST['area']) ): $args['show_option_none'] = 'Select Area'; endif; $area = wp_dropdown_categories( $args ); $area = preg_replace("#
< ?php endif; ?>

Teil 3 (Änderungen werden hier gemacht):

  < ?php // we're only performing a query if both a region and an area have been selected if( isset($_POST['region']) && isset($_POST['area']) && $_POST['region'] && $_POST['area'] ): $args = array( 'post_type' => 'local_services', // this assures the post is selected by the area selected // usage of custom taxononmy 'tax_query' => array ( array ( 'taxonomy' => 'bundesland', 'field' => 'term_id', 'terms' => array($_POST['area']), ), ), 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '
'; the_content(); echo '
'; endwhile; // show conditional information according to the step we're at elseif( isset($_POST['region']) && ! isset($_POST['area']) && $_POST['region'] ): echo 'Please select an area'; else: echo 'Please select a region'; endif; ?>