• Super User

    [WordPress]ricerca per filtri incrociati

    Vorrei creare una pagina dedicata in cui tramite dei menu a tendina per quanti sono i custom fields (campi personalizzati) che inserisco per ogni post mi permetta di farmi visualizzare stile pagina archive.php i risultati incrociati.

    Esempio:
    ho 2 campi personalizzati per ogni post
    verdura
    colore

    Sul primo post ho
    verdura: pomodoro
    colore: rosso

    Sul secondo post ho
    verdura: insalata
    colore: verde

    Sul terzo post ho
    verdura: ravanello
    colore: rosso

    Se dai menu a tendina per il colore scelgo rosso vorrei che mi compaia il primo e il terzo post
    mentre se dal menu a tendina verdura scelgo pomodoro e nel menu tendina del colore rosso vorrei far comparire solo il primo post

    Chiaramente questo è solo un esempio semplicissimo con 3 post e 2 metadata giusto per farvi capire meglio l' esigenza partorita dalla mia mente contorta 🙂

    Avrei in mente concettualmente come organizzare la cosa ma volevo sapere se qualcuno aveva dei consigli pratici da darmi per poter imbarcarmi in questa customizzazione 🙂

    Grazie per ogni eventuale risposta.


  • Super User

    qua serve Fra_T o qualche volenteroso del codice estremo. la mia idea è che devi scriverti direttamente la query e la pagina con l'html per richiamarla...


  • Super User

    Io per creare i menu a tendina ho creato questo codice:

    $paese = mysql_query("SELECT * FROM wp_postmeta WHERE meta_key = 'Paese' ORDER BY meta_key ASC");
    echo "<table><tr><td><h3>Localizzazione</h3><select>";
    while ($records = mysql_fetch_array($result)) {
            echo "<option value=\"\">". $records['meta_value'] . "</option>";
    }
    echo "</select></td>";
    
    $secolo = mysql_query("SELECT * FROM wp_postmeta WHERE meta_key = 'Secolo' ORDER BY meta_key ASC");
    echo "<td><h3>Secolo</h3><select>";
    while ($records = mysql_fetch_array($secolo)) {
            echo "<option value=\"\">". $records['meta_value'] . "</option>";
    }
    echo "</select></td>";
    
    $tipologia = mysql_query("SELECT * FROM wp_postmeta WHERE meta_key = 'Tipologia' ORDER BY meta_key ASC");
    echo "<td><h3>Tipologia</h3><select>";
    while ($records = mysql_fetch_array($tipologia)) {
            echo "<option value=\"\">". $records['meta_value'] . "</option>";
    }
    echo "</select></td></tr></table>";
    

    NOTE:
    Paese, secolo, tipologia fanno parte del campo meta_key della tabella wp_postmeta: con le query sopra riportate mi creo i menu a tendina con il loro valore del campo meta_value

    Ora mi mancherebbe capire come impostare la query di ricerca per estrapolare i dati che mi servono.

    Praticamente:
    scelgo dai 3 menu a tendina il valore di paese, secolo, tipologia e vorrei che mi comparisse stile teplate archive.php la lista dei risultati con quei valori.

    Grazie Tambu.
    PS: spero che Fra_T intervenga allora 🙂
    Magari alla fine si fa un bel plugin 🙂


  • User Attivo

    Ciao, un idea potrebbe essere usare le categorie, che più o meno servono a questo 😄

    Comunque le query per estrapolare/incrociare le ricerche dovrebbe essere qualcosa del genere:

    • controlli se si sta cercando su 1 , 2 o 3 combinazioni di meta_key (Paese, secolo, tipologia).

    Supponiamo che la ricerca sia fatta incrociando paese e secolo, questa la query:

    SELECT post_id FROM $wpdb->postmeta WHERE (meta_key = 'paese' AND meta_value = 'Parma') OR (meta_key = 'secolo' AND meta_value='XXI') GROUP BY post_id HAVING COUNT(post_id) = 2;

    Nota HAVING COUNT(post_id) = 2, il due è tale perché stai usando due parametri nella ricerca (paese e secolo), sarebbe 3 se ci fosse anche 'tipologia'.

    La query restituisce gli ID dei post, con quelli o fai una query o fai direttamente un JOIN con la tabella dei post.


  • Super User

    Grazie Fra_T per la risposta.

    L' idea delle categorie non era male, ma se per le tipologie che alla fine ho optato per suddividere e gestire i paesi me ne trovo già una lista di 40 per esempio, aggiungendo secoli e/o tipologie nel mmento in cui andrò a postare mi perderei per cercare e spuntare paese, tipologia e secolo dalla lista categorie.

    Per questo mi era venuto a mente di coinvolgere i campi personalizzati e tagwarrior come plugin per i tag che mi gestiscono la "categoria" tipologia.

    PS: ho trovato oggi un sito basato su WordPress che utilizza proprio la soluzione che sto cercando utilizzando mi sembra uno scriprino in javascript ed i permalink a quanto pare. Avete qualche idea in merito a questo funzionamento? Il sito in questione è http://www.regaloregali.it/ col form nella colonna a destra "Trova regali e idee regalo"


  • User Attivo

    Ecco magari quel sito usa un plugin, ma sinceramente non lo conosco.

    A volerlo fare ed a tenerlo separato dalle categorie - secondo me - o usi solo i postmeta, o ti crei una tabella apposita. Se usi solo i meta la query è + o - quella che ti ho postato più join con wp_posts (ed eventuale verifica che non sia pagina, draft, future, allegato). Però... 😄

    O ti va bene di passare i parametri dei filtri con un metodo tradizionale, stile ?paese=parma&secolo=xxi&tipo=nonso, o devi usare la classe wp_rewrite (mi sembra si chiami) per riscrivere l'URL e registrare la regola.

    E poi la visualizzazione integrata? Dovresti usare la classe $wp_query http://codex.wordpress.org/Function_Reference/WP_Query

    Insomma c'è da perdere un po' di tempo a leggersi la documentazione ed a fare delle prove.

    Forse, per WP_query, basta qualcosa tipo:

    if($_GET['paese'] /* or anno or tipo */){
       // Inizializza/resetta la classe
       $wp_query->init();
       $wp_query->parse_query(/*Qui la query per selezionare i post*/);
    }
    

    Il codice lo dovresti mettere in un plugin. Funzionerà così? O bisogna metterlo in una funzione da "agganciare" con le API? C'è da fare delle prove 😄


  • Super User

    Imho avrei voluto la soluzione passo passo e query su query ma anche cosi devo dire che mi hai dato speranza 🙂

    Avrei sperato di trovare una soluzione, cmq provo, provo, provo e poi vi faccio sapere 😉

    Grazie Fra_T


  • User Attivo

    Grazie a te se ci riesci e se pubblichi come hai fatto. 😄

    E' una parte interessante ed avanzata di Wordpress 😛