Menu a discesa con selezione delle categorie
Ho creato un sito web directory con menu a discesa che permettono all'utente di navigare tra le categorie e sottocategorie. [Website]
Sto utilizzando wp_dropdown_categories()
per visualizzare i menu e il javascript condiviso qui per consentire all'utente di selezionare la categoria e essere indirizzato a quella pagina. Quando viene selezionato 'Tutte le Categorie', non succede nulla. Come si può aggiungere questa funzionalità?
$args = array(
'show_option_all' => 'Tutte le Categorie',
'show_option_none' => 'SFOGLIA',
'orderby' => 'NAME',
'order' => 'ASC',
'show_count' => 0,
'hide_empty' => 1,
'child_of' => 0,
'exclude' => 1,
'echo' => 1,
'selected' => $cat_id2->term_id,
'hierarchical' => 1,
'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;
Ecco una variante del codice che utilizzi. Sto usando get_categories()
qui per raggiungere lo stesso obiettivo. Ho dovuto modificare leggermente il mio codice per renderlo adatto alle tue esigenze.
Tuttavia, ci sono altre modifiche che devi apportare per far funzionare tutto. Quando selezioni l'opzione Tutte le Categorie
, verrai reindirizzato a una pagina che mostrerà ciò che desideri visualizzare. Questa pagina dovrai crearla manualmente.
Come forse saprai, in WordPress non esistono pagine di archivio indice (Dai un'occhiata a questo post che ho scritto sullo stesso argomento). Ciò significa che dominio.com/categoria/
restituirà un errore 404.
Quindi, per far funzionare tutto, devi creare una copia di page.php, rinominarla in qualcosa come page-category.php (consulta il codex su come creare template di pagina personalizzati), aprirla e creare una query personalizzata per visualizzare ciò che desideri mostrare quando questa pagina viene visitata.
Ora devi creare la tua pagina nel backend. Suggerirei di utilizzare lo slug categoria
in modo che quando visiti dominio.com/categoria/
, questa pagina venga visualizzata (Ricorda solo che non puoi creare pagine figlie per questa pagina, altrimenti romperai la gerarchia). Ho anche modificato il codice per reindirizzare a dominio.com/categoria/
quando viene selezionata l'opzione Tutte le Categorie
.
A parte questo, il codice dovrebbe funzionare bene. Devi solo verificare le strutture degli URL e impostare i parametri in get_categories()
in base alle tue esigenze. Ecco il codice per il menu a discesa.
<select name="event-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'>
<option value=""><?php echo esc_attr(__('Seleziona Categoria')); ?></option>
<?php
$option = '<option value="' . get_option('home') . '/category/">Tutte le Categorie</option>'; // cambia category con il tuo slug di pagina personalizzato
$categories = get_categories();
foreach ($categories as $category) {
$option .= '<option value="'.get_option('home').'/category/'.$category->slug.'">';
$option .= $category->cat_name;
$option .= ' ('.$category->category_count.')';
$option .= '</option>';
}
echo $option;
?>
</select>
MODIFICA
In realtà ho avuto un'idea che potrebbe tornare utile. Recentemente ho scritto una risposta su come visualizzare tutte le categorie in un elenco con tutti i titoli dei post sotto la categoria specifica. Questa stessa idea può essere utilizzata nel tuo template page-category.php.
Quando un utente seleziona l'opzione Tutte le Categorie
, verrà reindirizzato a questa pagina che elencherà tutte le categorie e i titoli dei post.
Ecco il codice completo: (per una spiegazione del codice, consulta il mio post qui)
Nel tuo functions.php
add_action( 'transition_post_status', 'publish_new_post', 10, 3 );
function publish_new_post() {
delete_transient( 'category_list' );
}
Nel tuo template dove devi visualizzare l'elenco
<?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; // Crea un array con i nomi delle categorie e i titoli dei post
}
/* Ripristina i dati originali del Post */
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>';
}
?>

Probabilmente potresti semplicemente modificare lo script sopra in questo modo:
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;
Se vuoi includere anche -1 (SFOGLIA CATEGORIE) potresti modificare la seconda condizione in: dropdown.options[dropdown.selectedIndex].value <= 0

Stavo per aggiungerlo come commento, ma i miei punti di reputazione non sono ancora sufficienti :)
Ho passato circa 20 minuti a testare/analizzare quello che hai. Il mio primo test ha replicato il problema che descrivi, ma quando ho impostato alcuni breakpoint (l'evento change e una specifica riga di codice) e espressioni di watch utilizzando gli strumenti di debug integrati in Chrome, il problema sembra essersi risolto. Presumo che tu abbia già risolto il problema, oppure che ci sia stato qualche cambiamento di stato nella mia sessione dovuto all'uso dello strumento Chrome Inspect che ora lo fa funzionare.
Sembra che tu abbia un errore nel tuo JS: in ogni punto in cui hai il codice:
dropdown(x).onchange = onCatChange(x);
(ad esempio righe 567, 4840, 4851), questo codice genera un errore quando il valore è 0 (la voce 'All' selezionata) e possibilmente anche -1 (la voce 'Browse' selezionata), anche se sospetto che ciò accada semplicemente perché selezionando BROWSE viene impostata nuovamente la voce principale All per default (che a sua volta scatena l'errore).
Forse in alcuni casi, questo errore generato interrompe l'esecuzione a seconda delle impostazioni del browser per la gestione degli errori Java? E attivando gli strumenti di debug potrei aver cambiato la modalità di esecuzione in modo che il codice continui nonostante questo errore? Solo un'idea.
Inoltre, quando seleziono "Activities" nel Dropdown1, "Bowling" nel Dropdown2, e poi cambio la selezione del Dropdown2 in "All Activities", l'URL rimane:
http://www.mydetroitjewishdirectory.com/category/activities/bowling/
ma il contenuto della pagina cambia per visualizzare solo il semplice testo "category".
Spero che questo ti sia d'aiuto!
Paul
