Dropdown cu selecție de categorii

7 oct. 2014, 20:39:57
Vizualizări: 27.8K
Voturi: 3

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;

6
Comentarii

Folosești exemplul Javascript 1 sau 2 din wp_dropdown_categories din codex? Poți oferi și Javascript-ul?

RachieVee RachieVee
8 oct. 2014 23:25:22

JS este acum furnizat mai sus.

MF1 MF1
12 oct. 2014 03:41:17

$cat_id2 nu este definit. Și variabila ta "dropdown" este null la încărcarea paginii. Funcția nu rulează atunci când o opțiune este schimbată în meniul derulant, ci doar la încarcarea paginii. Poate ai nevoie de ajutor pentru partea de JS deoarece asta nu este specialitatea mea. Se pare că singura ta problemă PHP este $cat_id2 nedefinit. Sper că te ajută.

RachieVee RachieVee
23 oct. 2014 19:10:43

Ar ajuta să vedeți linkul site-ului meu?

MF1 MF1
23 oct. 2014 19:19:23

Desigur. Cu cât oferi mai multe detalii, cu atât mai bine. Sper că cineva te va putea ajuta dacă eu nu voi reuși. Mult succes! :-)

RachieVee RachieVee
23 oct. 2014 19:28:11

Am adăugat mai sus....

MF1 MF1
23 oct. 2014 19:35:06
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 3
0

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


?>
23 oct. 2014 21:45:37
0

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

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

23 oct. 2014 20:46:19