Parametri WP_query per intervallo di date

7 giu 2013, 21:26:17
Visualizzazioni: 25.2K
Voti: 6

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.

2
Commenti

presumibilmente è memorizzato nei post meta, usa get_post_custom per vedere tutti i metadati associati a un evento, e una meta query per interrogare in base alla chiave della data.

Milo Milo
7 giu 2013 21:35:38

@Milo lo è, ma non so come analizzarlo. Ecco il suo output: http://pastebin.com/3er1WBMv

That Brazilian Guy That Brazilian Guy
8 giu 2013 21:38:03
Tutte le risposte alla domanda 2
2
12

Copiato da StackOverflow:

WP_Query offre un parametro date_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.

23 apr 2019 22:34:38
Commenti

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

That Brazilian Guy That Brazilian Guy
23 apr 2019 23:43:49

Come dice nell'articolo del Codex che ho linkato date_query (array) - Parametri di data (disponibile dalla Versione 3.7). quindi è davvero antico a questo punto, sicuramente sicuro da usare :)

jerclarke jerclarke
23 apr 2019 23:59:08
15

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

7 giu 2013 21:42:00
Commenti

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.

That Brazilian Guy That Brazilian Guy
8 giu 2013 08:08:19

Hai provato il codice che ho postato?

s_ha_dum s_ha_dum
8 giu 2013 15:18:32

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

That Brazilian Guy That Brazilian Guy
8 giu 2013 21:39:23

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.

s_ha_dum s_ha_dum
8 giu 2013 21:44:14

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?

That Brazilian Guy That Brazilian Guy
8 giu 2013 22:25:33

@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 Milo
8 giu 2013 22:33:49

@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.

That Brazilian Guy That Brazilian Guy
8 giu 2013 22:36:05

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

Milo Milo
8 giu 2013 22:52:45

@ruda.almeida : vedi la modifica. Non posso farlo adesso

s_ha_dum s_ha_dum
8 giu 2013 22:59:10

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

That Brazilian Guy That Brazilian Guy
8 giu 2013 23:05:08

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

Milo Milo
8 giu 2013 23:07:36

@Milo aha, è vero, non ci avevo pensato! ;-)

That Brazilian Guy That Brazilian Guy
8 giu 2013 23:12:56

@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 =/

That Brazilian Guy That Brazilian Guy
8 giu 2013 23:14:26

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

That Brazilian Guy That Brazilian Guy
8 giu 2013 23:17:16

Quel primo underscore impedisce ai campi di apparire nel menu a discesa "Custom Meta".

s_ha_dum s_ha_dum
9 giu 2013 01:44:58
Mostra i restanti 10 commenti