WordPress è sicuramente una delle migliori piattaforme per CMS , però per quanto riguarda la ricerca, si può migliorare in modo di usare anche i campi personalizzati dei post come criteri di ricerca.In questo articolo vi farò vedere come si fa, senza nessun plugin che venga a rallentarvi il sito.
Prima cosa da fare è mettere da qualche parte sulla sidebar, magari modificando il searchform.php (il file che contiene il form della ricerca di WP) gli input che servono a passare i criteri alla pagina dei risultati.
Per esempio, possiamo usare un select per far vedere tutti i valori di un determinato campo personalizzato.
<select name="tipologia" class="select" style=""> <option value="" selected="selected">Tipologia..</option> <?php $tipologie = $wpdb->get_col("SELECT DISTINCT meta_value FROM wp_postmeta WHERE meta_key = 'tipologia' ORDER BY meta_value ASC"); if ($tipologie != '') { foreach ( $tipologie as $tipologia ) { ?> <option value="<?php echo $tipologia; ?>"> <?php echo $tipologia; ?> </option> <?php } } ?> </select>
In questo script, facciamo vedere tutti i valori del campo “tipologia” in un input di tipo select, in ordine alfabetico. Tutto questo sarà inserito in un form, che conterrà anche un input di tipo nascosto(hidden) che gli verrà passato il valore 1 per il campo “ricerca_personalizzata”, in modo da individuare questa ricerca quando andiamo a cliccare su “Cerca”.
<form method="get" id="searchform" action="<?php bloginfo('home'); ?>" > <input id="s" type="hidden" name="ricerca_personalizzata" value="1" />
Fatto questo, andiamo su index.php e mettiamo un condizionale “if” subito dopo l’inserimento del get_header(), che verifica se la variabile ricerca_personalizzata è passata ed indicizzata a 1. Se è vero, allora inserisci il file custom-search.php nella home;se è falso fai vedere la homepage normale.
<?php get_header(); ?>
<div id="casing"> <?php if (stripos($_SERVER['REQUEST_URI'],'ricerca_personalizzata=1') !== false) {
?> <?php include (TEMPLATEPATH . '/custom-search.php'); ?> <?php } else { .... //fai qualcos'altro (fa vedere la home normale)
Un’altra cosa importante da fare è andare sul database e creare una tabella di tipo “Vista” tramite una semplice query per quanto riguarda il postmeta (campo personalizzato) “Tipologia”:
create view tipologia_table as select post_id, meta_value from wp_postmeta where meta_key='tipologia';
Questa tabella virtuale è solo una tabella semplice che va a guardare i valori dentro la tabella wp_postmeta solo dove il meta_key è uguale a “tipologia”, e copia i valori dell’ID del post e del meta_value relativo al meta_key dentro la tabella virtuale “tipologia_table” .Questa cosa ci servirà per fare la query finale nel file custom-search.php.
Infine andiamo a programmare il file custom-search.php.Qui dentro ci sarà un semplice loop che guarderà il risultati presi da una query di ricerca:
$querystr = " SELECT DISTINCT wp_posts.*, tipologia_table.meta_value AS Tipologia FROM wp_posts, wp_postmeta, tipologia WHERE wp_posts.ID = tipologia_table.post_id AND wp_posts.post_status='publish' ";
Questa è la query che elenca tutti i post senza nessun altro criterio passato.Poi andiamo a verificare se la tipologia è passata tramite un if:
if ($_GET["tipologia"]!="") { $tipologia=$_GET['tipologia']; $querystr = $querystr." AND tipologia_table.meta_value= '".$tipologia."'"; }
e passiamo il valore di “tipologia” nella query con un AND. Infine raggruppiamo tutto in base al wp_posts.ID.
$querystr = $querystr." GROUP BY wp_posts.ID";
Quello che resta è far vedere i post dentro il loop in base a questi criteri di ricerca.Allora andiamo a prendere tutti i risultati in un array $pageposts, e poi iniziamo il loop tramite un Foreach (potete vedere il codice di WordPress Codex qui):
<?php $pageposts = $wpdb->get_results($querystr, OBJECT);
if ($pageposts): ?> <?php global $post; ?> <?php foreach ($pageposts as $post): ?> <?php setup_postdata($post); ?> //...... codice HTML e php per far vedere i post <?php endforeach; ?> <?php else : ?> <h1 class="title">Not Found</h1> <p>Sorry, but you are looking for something that isn't here.</p> <?php endif; ?>
Quindi se vogliamo aggiungere ancora X campi come criteri di ricerca, basta aggiungere altri AND alla query principale $querystr.
Spero che sia tutto chiaro!
Buona giornata!
Comments (1 Comment)
Salve Peter, non c’è un plugin per fare ciò? dovrei creare alcuni campi select dove poter inserire solamente le categorie/pagine/meta che desidero l’utente possa utilizzare per le sue ricerca, cosi facendo potrò creare vari “search” in zone diverse del sito con diverse pagine/categorie/meta dentro