Error al comparar fechas en meta_query de WordPress
Este es el fragmento de código que uso para obtener posts de eventos cuya fecha en los metadatos es más reciente que hoy:
<?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()) : ?>
Esto no devolvió ningún resultado. El campo "numericdate" contiene una cadena en formato "ddmmyyyy", así que esperaba que la comparación con el valor de fecha actual en formato "dmY" funcionaría. Me equivoqué. O hay algún error en el código anterior. ¡Gracias por tu ayuda!
Tengo exactamente el mismo problema aquí, excepto que uso el tipo de publicación estándar (post) y una categoría en mi consulta. Todo funciona excepto el orden de clasificación.
$d = date("Y-m-d");
$args = array(
'post_type' => 'post',
'category_name' => 'events',
'post_status' => 'publish,draft,pending,future,private', // solo para mí
'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' => '>'
)
)
);
Pero mis publicaciones se ordenan por comparación de cadenas de todos modos. ¿Qué hice mal?
Bueno, después de un poco de prueba y error, descubrí que en lugar de 'meta_value_num' debería haber usado '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' => '>'
)
)
);

Para lo que valga, utiliza la función de WordPress current_time() para este tipo de consultas.
current_time('mysql')
devuelve la hora del servidor según la configuración del administrador que es aceptable por MySQL

De hecho, la operación CAST()
devolverá NULL
si tus datos no están en el formato correcto. También acepta YYYYMMDD
sin los separadores, pero no acepta DDMMYYYY
. No estoy seguro sobre el orderby
- ¿usaría los valores convertidos de la meta query?

¡Gracias Milo, ahora funciona perfectamente! meta_value_num hizo el trabajo correctamente, me pregunto por qué nadie notó ese detalle en este hilo similar: http://bit.ly/l88vup

Dejando a un lado las preferencias de formato de fecha de MySQL, hay muchas buenas razones para usar formatos bigendian como Y-m-d.
Pensarías que comparar fechas sería obvio, pero...
05262011 > 01012012
y así sucesivamente. Te causarás muchos problemas si intentas usar el formato dmY.
Además, no creo que 'date' sea uno de los parámetros aceptados para "type" en meta_query. Omite ese parámetro y usa comparación de cadenas para obtener los mejores resultados.

la fecha es válida, según la entrada WP_Query en el codex: Los valores posibles son 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. El valor por defecto es 'CHAR'.

Si alguien tiene el mismo problema, es mejor que revise el filtro posts_clauses.
Este filtro te permite manipular directamente el SQL de la consulta.
Allí puedes convertir el valor de la columna de fecha y modificar la cláusula WHERE y la cláusula 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";
