Come cercare eventi tra due date specifiche in WordPress?
Sto sviluppando un sito WordPress con una funzionalità per gli eventi. La pagina degli eventi è stata creata utilizzando custom post types.
Vorrei permettere agli utenti di cercare/filtrare gli eventi per date. Per esempio, poter cercare tutti gli eventi che si svolgono tra il 2 dicembre 2011 e il 1° marzo 2012 e ottenere risultati degli eventi che hanno le loro date tra i mesi di dicembre e marzo (cioè dicembre, gennaio, febbraio e marzo).
Vorrei sapere qual è il modo migliore per realizzarlo. Qualche idea?
Potete vedere un esempio di ciò che voglio ottenere guardando la funzione "Search events by date" su questa pagina http://www.londontown.com/events
Se questo non fosse possibile, c'è un modo per permettere la ricerca di eventi che si svolgono tra determinati mesi, ad esempio tra dicembre e febbraio (escludendo i giorni)?
Grazie in anticipo.
Ci sono due cose che devi fare per realizzare questo:
1) Creare i metadati per i dati di ogni evento
2) Interrogare i post utilizzando meta_query
Per il punto #1, devi aggiungere un metabox che permetta all'utente di inserire una data per l'evento. Questi dati devono essere salvati come metadati usando add_post_meta
o update_post_meta
. Ti consiglio di leggere riguardo l'aggiunta di metadati se non hai familiarità con il procedimento:
http://codex.wordpress.org/Function_Reference/add_meta_box http://www.wproots.com/complex-meta-boxes-in-wordpress/
Per il punto #2, assumendo che tu abbia salvato i valori delle date in un formato ordinabile (es. YYYY-MM-DD), puoi usare il parametro meta_query all'interno di una nuova istanza di WP_Query per ottenere l'intervallo di date desiderato. Questo metodo presuppone che la tua meta_key sia "_my-datetime-from". Ad esempio, puoi ottenere i post di ottobre e novembre 2011 con il seguente codice:
// Imposta gli argomenti per gli eventi
$start = '2011-11-31';
$end = '2011-10-01';
$args = array(
'post_type' => 'my-event-type',
'posts_per_page' => -1,
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_key' => '_my-datetime-from',
'meta_query' => array(
array(
'key' => '_my-datetime-from',
'value' => array($start, $end),
'compare' => 'BETWEEN',
'type' => 'DATE'
)
)
);
// Esegui la query
$events_query = new WP_query();
$events_query->query($args);

Ok. Capisco, ma come posso aggiungerlo al modulo di ricerca in modo da non dover inserire manualmente le date nel codice. Sarà integrato nel modulo di ricerca in modo che gli utenti possano ottenere gli eventi selezionando le date. Grazie.

Ok, penso di essere vicino alla soluzione. Ora ho questo nel mio file search.php http://www.pastebin.com/zMRwRihz e questo è ciò che c'è nel mio modulo di ricerca: http://www.pastebin.com/nZePhPHV Sto usando jquery ui datepicker per selezionare le date nel frontend (input di ricerca data). Questo è ciò che ottengo nell'URL dopo aver inviato una ricerca: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Tuttavia, non vengono restituiti risultati. Hai qualche indizio su cosa impedisca la visualizzazione dei post? Grazie.

Come memorizzi la data dell'evento: utilizzando il campo predefinito post_date
del post o un campo meta personalizzato?
Se stai utilizzando il campo predefinito post_date
, puoi usare il filtro posts_where
per aggiungere condizioni di ricerca, come in questo esempio:
// Crea una nuova funzione di filtraggio che aggiungerà la nostra clausola WHERE alla query
function filter_where( $where = '' ) {
// post dal 1° al 15 marzo 2010
$where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );
Per ulteriori esempi, consulta il Codex.
Nel caso utilizzi un campo personalizzato, immagino che tu debba scrivere le tue query MySQL personalizzate. È un po' più complicato. Ecco un esempio:
global $wpdb;
$post_ids = $wpdb->get_col( "
SELECT ID FROM {$wpdb->posts}
JOIN {$wpdb->postmeta}
WHERE ID=post_id
AND meta_key='your_custom_meta_key'
AND meta_value >= '2010-03-01'
AND meta_value < '2010-03-16'
" );
foreach ( $post_ids as $post_id ) {
$post = get_post( $post_id );
// Fai qualcosa
}
wp_reset_postdata();

Non è necessario utilizzare una query personalizzata per questo. Puoi semplicemente usare "meta_query".

@rilwis Ok, penso di essere vicino alla soluzione. Ora ho questo nel mio file search.php http://www.pastebin.com/zMRwRihz e questo è ciò che c'è nel mio modulo di ricerca: http://www.pastebin.com/nZePhPHV Sto usando jQuery UI Datepicker per selezionare le date nel frontend (input di ricerca data). Questo è ciò che ottengo nell'URL dopo aver inviato una ricerca: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Tuttavia, non vengono restituiti risultati. Hai qualche indizio su cosa stia impedendo la visualizzazione dei post? Grazie.
