Dropdown cu selecție de categorii
Am creat un website cu directoare care are dropdown-uri în meniu permițând utilizatorului să navigheze prin categorii și subcategorii. [Website]
Folosesc wp_dropdown_categories()
pentru a afișa meniurile și JavaScript-ul distribuit aici pentru a permite utilizatorului să selecteze categoria și să fie direcționat către acea pagină. Când este selectat 'Toate Categoriile', nu se întâmplă nimic. Cum pot adăuga această funcționalitate?
$args = array(
'show_option_all' => 'Toate Categoriile',
'show_option_none' => 'NAVIGHEAZĂ',
'orderby' => 'NAME', // Ordonează după nume
'order' => 'ASC',
'show_count' => 0,
'hide_empty' => 1, // Ascunde categoriile goale
'child_of' => 0,
'exclude' => 1,
'echo' => 1,
'selected' => $cat_id2->term_id,
'hierarchical' => 1, // Afișează ierarhic
'name' => 'cat',
'id' => '',
'class' => 'postform',
'depth' => 1,
'tab_index' => 0,
'taxonomy' => 'category',
'hide_if_empty' => false,
);
wp_dropdown_categories( $args );
JS
<script type="text/javascript">
var dropdown = document.getElementById("cat");
function onCatChange() {
if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
location.href = "<?php echo get_option('home'); ?>/?cat="+dropdown.options[dropdown.selectedIndex].value;
}
}
dropdown.onchange = onCatChange;
Iată o variație a codului pe care îl folosești. Eu folosesc get_categories()
aici pentru a obține același rezultat. A trebuit să ajustez ușor codul meu pentru a-l face acceptabil pentru nevoile tale.
Totuși, există alte modificări pe care trebuie să le faci pentru ca acest lucru să funcționeze. Când selectezi opțiunea Toate Categoriile
, vei fi redirecționat către o pagină care va afișa ceea ce dorești să fie afișat. Această pagină va trebui să o creezi manual.
După cum probabil știi, în WordPress nu există pagini de arhivă pentru index. (Vezi acest articol pe care l-am scris pe același subiect). Asta înseamnă că domeniu.com/categorie/
returnează eroarea 404.
Deci, pentru ca totul să funcționeze, va trebui să faci o copie a page.php și să o redenumești în ceva de genul page-categorie.php (consultă codex-ul pentru a afla cum să creezi șabloane personalizate), să o deschizi și să creezi o interogare personalizată pentru a afișa ceea ce dorești atunci când această pagină este accesată.
Acum trebuie să creezi pagina în backend. Aș sugera să folosești slug-ul categorie
, astfel încât atunci când vizitezi domeniu.com/categorie/
, această pagină să fie afișată. (Ține minte, nu poți crea pagini copil pentru această pagină, deoarece va strica ierarhia). Am modificat și codul pentru a merge către domeniu.com/categorie/
când este selectată opțiunea Toate Categoriile
.
În afară de asta, codul ar trebui să funcționeze fără probleme. Trebuie doar să verifici structurile URL-urilor și, de asemenea, să setezi parametrii din get_categories()
pentru a se potrivi nevoilor tale. Iată codul pentru meniul derulant:
<select name="event-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'>
<option value=""><?php echo esc_attr(__('Selectează Categoria')); ?></option>
<?php
$option = '<option value="' . get_option('home') . '/categorie/">Toate Categoriile</option>'; // schimbă "categorie" cu slug-ul paginii tale personalizate
$categories = get_categories();
foreach ($categories as $category) {
$option .= '<option value="'.get_option('home').'/categorie/'.$category->slug.'">';
$option .= $category->cat_name;
$option .= ' ('.$category->category_count.')';
$option .= '</option>';
}
echo $option;
?>
</select>
EDITARE
Am avut o idee care ar putea fi utilă. Recent am răspuns la o întrebare despre afișarea tuturor categoriilor într-o listă cu toate titlurile articolelor din fiecare categorie. Aceeași idee poate fi folosită în șablonul tău page-categorie.php.
Când un utilizator selectează opțiunea Toate Categoriile
, va fi redirecționat către această pagină care va lista toate categoriile și titlurile articolelor.
Iată codul complet: (pentru o explicație detaliată a codului, vezi articolul meu aici)
În functions.php:
add_action( 'transition_post_status', 'publish_new_post', 10, 3 );
function publish_new_post() {
delete_transient( 'category_list' );
}
În șablonul unde ai nevoie să afișezi lista:
<?php
if ( false === ( $q = get_transient( 'category_list' ) ) {
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
$q[$b][] = $a; // Creează un array cu numele categoriilor și titlurile articolelor
}
/* Restabilește datele originale ale postării */
wp_reset_postdata();
set_transient( 'category_list', $q, 12 * HOUR_IN_SECONDS );
}
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
?>

Probabil ai putea modifica scriptul de mai sus astfel:
var dropdown = document.getElementById("cat");
function onCatChange() {
if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
location.href = "<?php echo get_option('home'); ?>/?cat="+dropdown.options[dropdown.selectedIndex].value;
}
else if ( dropdown.options[dropdown.selectedIndex].value == 0 ) {
location.href = "<?php echo get_option('home'); ?>";
}
}
dropdown.onchange = onCatChange;
Dacă dorești să incluzi și valoarea -1 (BROWSE CATEGORIES), poți modifica a doua condiție astfel: dropdown.options[dropdown.selectedIndex].value <= 0

Am vrut să adaug acest lucru ca un comentariu, dar punctele mele de reputație nu sunt încă suficient de mari :)
Am petrecut aproximativ 20 de minute testând/analizând ceea ce ai. Primul meu test a replicat problema pe care o descrii, dar când am setat câteva puncte de întrerupere (evenimentul de schimbare și o anumită linie de cod) și expresii de urmărire folosind instrumentele de depanare integrate în Chrome, problema pare să nu mai apară. Presupun că fie ai rezolvat problema, fie a avut loc o schimbare de stare pentru sesiunea mea bazată pe folosirea instrumentului Chrome Inspect, astfel încât acum funcționează.
Pare să ai o eroare în codul JS: în fiecare loc unde ai codul:
dropdown(x).onchange = onCatChange(x);
(de exemplu liniile 567, 4840, 4851), acest cod aruncă o eroare când valoarea este 0 (intrarea 'All' selectată) și posibil și -1 (intrarea 'Browse' selectată), deși bănuiesc că acest lucru se întâmplă pur și simplu pentru că selectarea BROWSE determină setarea implicită a intrării principale All (care la rândul său declanșează eroarea).
Poate că în unele cazuri, această eroare aruncată determină oprirea execuției în funcție de setările browser-ului pentru gestionarea erorilor Java? Și prin activarea instrumentelor de depanare poate am comutat o modificare în modul de execuție, astfel încât codul să continue în ciuda acestei erori? Doar o idee.
De asemenea, când selectez "Activities" în Dropdown1, "Bowling" în Dropdown2, apoi schimb selecția Dropdown2 în "All Activities", URL-ul rămâne:
http://www.mydetroitjewishdirectory.com/category/activities/bowling/
dar conținutul paginii se schimbă pentru a afișa doar textul simplu "category".
Oricum, sper că acest lucru te ajută!
Paul
