Errore nel confronto delle date in meta_query
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!

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' => '>'
)
)
);

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

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?

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

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.

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

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";
