Parametri WP_query per intervallo di date
Sto utilizzando il plugin events manager per creare custom post per gli eventi. Non ho bisogno di un blog, quindi ho modificato il file index.php
del mio tema (usando un child theme) per far sì che la query recuperi il post type "event" nella homepage.
new WP_Query ( array( 'paged' => $paged, 'post_type' => 'event', 'posts_per_page' => 4 )
(Ho incluso solo il post type 'event').
Fin qui tutto bene. Ma vengono visualizzati eventi correnti, passati e futuri nella homepage. Voglio che vengano mostrati solo gli eventi correnti e futuri (cioè, voglio che gli eventi non ancora iniziati vengano mostrati nella homepage. Voglio solo evitare che vengano mostrati gli eventi passati). Ho dato un'occhiata alla pagina del codex per WP_Query e ho usato il seguente estratto di codice:
// Crea una nuova funzione di filtro che aggiungerà la nostra clausola where alla query
function filter_where( $where = '' ) {
// post dal 1 marzo al 15 marzo 2010
$where .= " AND post_date < CURDATE() ";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' )
Non produce il risultato desiderato perché la data dell'evento non è memorizzata in post_date
nel database.
Tuttavia suppongo ci sia un modo semplice per fare riferimento alle date degli eventi, perché la data visualizzata automaticamente nella homepage non è la data di pubblicazione dei post, ma piuttosto la data di inizio dell'evento, senza che sia stata fatta alcuna modifica.

Copiato da StackOverflow:
WP_Query
offre un parametrodate_query
, che ti permette di impostare un intervallo con before (prima) e after (dopo).https://developer.wordpress.org/reference/classes/wp_query/#date-parameters
$args = array(
'date_query' => array(
array(
'after' => '1 gennaio 2015',
'before' => '31 dicembre 2015',
'inclusive' => true,
),
),
);
$query = new WP_Query( $args );
Consulta la documentazione linkata per maggiori dettagli.
Nota che l'altra risposta, che utilizza una query postmeta, è davvero obsoleta, nessuno dovrebbe usarla ora che WP_Query
supporta queste query sulle date.

Puoi per favore aggiungere la versione di WP dove questo supporto è stato aggiunto?

Sembra che tu abbia bisogno di una meta_query
.
$query = new WP_Query (
array(
'paged' => $paged,
'post_type' => 'event',
'posts_per_page' => 4,
'meta_query' => array(
array(
'key' => 'date_key_name',
'value' => date('Y-m-d'),
'compare' => '>=',
)
)
)
);
Tieni presente che le tue date devono essere in un formato che una macchina possa analizzare correttamente.
Riferimenti
http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

il campo personalizzato è memorizzato nel formato YYYY-MM-DD. Ho provato a confrontare usando meta_key + meta_value, meta_query + key + value, operatori '=' e 'LIKE'. Nulla sembra funzionare. Anche inserendo la data dell'evento in modo letterale.

Beh, no, perché il tuo codice si aspetta che le date siano in formato unix time, suppongo (erroneamente?). Proverò ora.

YYYY-MM-DD
, con o senza separatori, si ordinerà numericamente. È l'unico formato di data umano che si ordina numericamente nello stesso modo in cui si ordina su un calendario. Io tendo a preferire UNIXTIME
, o colonne DATE
/DATETIME
, ma credo che questo formato dovrebbe funzionare.

Cosa inserisco come valori di $date1 e $date2? Devo verificare se la data di fine dell'evento è già passata, quindi devo confrontare la data di oggi con la data di fine dell'evento, ma come recupero la data di fine dell'evento per impostarla come una delle variabili?

@ruda.almeida vuoi una relazione OR
con le chiavi di inizio e fine - o la data di inizio è uguale o maggiore alla data di oggi, o la data di fine è uguale o maggiore alla data di oggi.

@Milo no, voglio che anche gli eventi che non sono ancora iniziati vengano mostrati nella pagina principale. Voglio solo evitare che vengano mostrati gli eventi passati.

@ruda.almeida sì, è quello che ho detto - o la data di inizio è nel futuro, OPPURE la data di fine è nel futuro.

@Milo se la data di fine è nel futuro, suppongo che posso ignorare la data di inizio.

@ruda.almeida aha, è vero, non ci avevo pensato! però se vuoi ordinare per data di inizio, quella chiave deve far parte della query.

@s_ha_dum Questa modifica è il codice che ho provato io stesso quando ho letto il codex su meta_query. Non ha funzionato in quel momento, ho copiato il tuo codice (cambiando "date_key_name" con "event_end_date", ovviamente, il nome del campo personalizzato). Non ha funzionato. Penso di stare facendo qualcosa di sbagliato =/

Il nome del campo nel DB è "_event_end_date
", avevo pensato di dover rimuovere il primo "_" ma funziona se lo mantengo.
