Error al comparar fechas en meta_query de WordPress

26 may 2011, 12:21:10
Vistas: 14.7K
Votos: 8

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!

0
Todas las respuestas a la pregunta 5
1

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' => '>'
        )
    )
);
8 sept 2011 11:44:51
Comentarios

Y-m-d es el formato correcto - Probé varios y este me dio los resultados correctos.

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

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

2 ago 2013 02:17:16
2

Creo que el formato de fecha en MySQL debería ser AAAA-MM-DD. También pienso que orderby debería ser meta_value_num, de lo contrario los valores se tratan como cadenas.

27 may 2011 03:08:55
Comentarios

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?

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

¡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

Pierre Pierre
28 may 2011 14:57:33
1

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.

27 may 2011 04:23:20
Comentarios

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

Milo Milo
27 may 2011 04:26:14
0

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";
11 jul 2017 17:45:26