Menu a discesa con selezione delle categorie

7 ott 2014, 20:39:57
Visualizzazioni: 27.8K
Voti: 3

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;

6
Commenti

Stai utilizzando l'esempio Javascript 1 o 2 dal codex di wp_dropdown_categories? Potresti fornire anche il Javascript?

RachieVee RachieVee
8 ott 2014 23:25:22

Il JS è ora fornito sopra.

MF1 MF1
12 ott 2014 03:41:17

$cat_id2 non è definito. E la tua variabile "dropdown" è null al caricamento della pagina. La funzione non viene eseguita quando un'opzione viene cambiata nel menu a discesa, solo al caricamento della pagina. Potresti aver bisogno di trovare aiuto con il JS poiché non è la mia specializzazione. Sembra che il tuo unico problema PHP sia $cat_id2 non definito. Spero che questo ti aiuti.

RachieVee RachieVee
23 ott 2014 19:10:43

Sarebbe utile vedere il link del mio sito?

MF1 MF1
23 ott 2014 19:19:23

Certo. Più informazioni puoi fornire, meglio è. Spero che qualcuno possa aiutarti se io non riuscissi. Buona fortuna! :-)

RachieVee RachieVee
23 ott 2014 19:28:11

Aggiunto sopra...

MF1 MF1
23 ott 2014 19:35:06
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 3
0

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


?>
23 ott 2014 21:45:37
0

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

23 ott 2014 22:03:25
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

23 ott 2014 20:46:19