Errore nel confronto delle date in meta_query

26 mag 2011, 12:21:10
Visualizzazioni: 14.7K
Voti: 8

Questo è il codice che uso per ottenere i post di eventi la cui data nei metadati è più recente di oggi:

    <?php
        query_posts( array(
        'post_type' => 'concerts',
        'meta_key' => 'numericdate',
        'posts_per_page' => -1,
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_query' => array(
            array(
                'key' => 'numericdate',
                'value' => date('dmY'),
                'compare' => '>=',
                'type' => 'date'
                 )
           )
    ) );
    if (have_posts()) : ?>

Questo non restituiva alcun risultato. Il campo "numericdate" contiene una stringa in formato "ddmmyyyy", quindi mi aspettavo che il confronto con un valore di data odierna in formato "dmY" funzionasse. Mi sbagliavo. Oppure c'è qualche errore nel codice sopra. Grazie per il tuo aiuto!

0
Tutte le risposte alla domanda 5
1

Ho esattamente lo stesso problema qui, tranne che uso il post type standard (post) e una categoria nella mia query. Tutto funziona tranne l'ordinamento.

$d = date("Y-m-d");
$args = array(
    'post_type'         => 'post',
    'category_name'     => 'events',
    'post_status'       => 'publish,draft,pending,future,private', // solo per me
    'meta_key'          => 'event_start',
    'orderby'           => 'meta_value_num',
    'order'             => 'ASC',
    'posts_per_page'    => -1,
    'meta_query'        => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);

Ma i miei post vengono comunque ordinati per confronto tra stringhe. Cosa ho sbagliato?

Dopo alcuni tentativi ed errori ho scoperto che invece di 'meta_value_num' avrei dovuto usare 'meta_value':

$d = date("Y-m-d");
$args = array(
    'post_type'             => 'post',
    'category_name'     => 'events',
    'post_status'           => 'publish,draft,pending,future,private',
    'meta_key'              => 'event_start',
    'orderby'               => 'meta_value',
    'order'                     => 'ASC',
    'posts_per_page'        => -1,
    'meta_query'            => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);
8 set 2011 11:44:51
Commenti

Y-m-d è il formato corretto - ho provato alcuni e questo mi ha dato i risultati corretti.

Simon Pollard Simon Pollard
11 gen 2016 13:47:27
0

Per quanto possa valere, utilizza la funzione WordPress current_time() per questo tipo di query.

current_time('mysql') restituisce l'ora del server secondo le impostazioni dell'amministratore che è accettabile da MySQL

2 ago 2013 02:17:16
2

Credo che il formato della data in MySQL dovrebbe essere AAAA-MM-GG. Inoltre, penso che orderby dovrebbe essere meta_value_num, altrimenti i valori vengono trattati come stringhe.

27 mag 2011 03:08:55
Commenti

Infatti, l'operazione CAST() restituirà NULL se i tuoi dati non sono nel formato corretto. Accetta anche YYYYMMDD senza i separatori, ma non DDMMYYYY. Non so riguardo all'orderby - utilizzerà i valori convertiti della meta query?

Jan Fabry Jan Fabry
27 mag 2011 16:44:40

Grazie Milo, ora funziona perfettamente! meta_value_num ha fatto esattamente il suo lavoro, mi chiedo come nessuno abbia notato un dettaglio simile in questo thread analogo: http://bit.ly/l88vup

Pierre Pierre
28 mag 2011 14:57:33
1

A prescindere dalle preferenze sul formato delle date in MySQL, ci sono molte buone ragioni per utilizzare formati big-endian come Y-m-d.

Potresti pensare che confrontare le date sia ovvio, ma...

05262011 > 01012012

e così via. Ti creerai molti problemi cercando di usare il formato dmY.

Inoltre, non credo che 'date' sia uno dei parametri accettati per "type" in meta_query. Lascia fuori quel parametro e usa il confronto tra stringhe per ottenere i migliori risultati.

27 mag 2011 04:23:20
Commenti

la data è valida, dall'entry WP_Query nel codex: I valori possibili sono 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Il valore predefinito è 'CHAR'.

Milo Milo
27 mag 2011 04:26:14
0

Se qualcuno ha lo stesso problema, è meglio dare un'occhiata al filtro posts_clauses.
Ti permette di manipolare direttamente la query SQL.
Lì puoi convertire il valore della colonna della data e modificare la clausola where e la clausola orderby.

$pieces['where'] .= " AND STR_TO_DATE(wp_postmeta.meta_value,'%d%m%Y' ) >= 
  CURRENT_DATE() ";

$pieces['orderby'] = "STR_TO_DATE( wp_postmeta.meta_value,'%d%m%Y' ) DESC";
11 lug 2017 17:45:26