Filtrar meta_query de WP_Query por valores numéricos no funciona

7 may 2013, 21:08:06
Vistas: 16K
Votos: 4

Ese era un título muy técnico.

Tengo un tipo de post personalizado "event" que tiene un campo selector de Fecha/Hora "event_date" gracias al plugin Advanced Custom Fields. Este selector guarda un timestamp UNIX en la base de datos. Estoy intentando usar WP_Query para obtener todos los eventos que son hoy o en el futuro. Este es el código que tengo actualmente:

$args = array(
    'post_type'         => 'event',
    'posts_per_page'    => -1,
    'meta_key'          => 'event_date',
    'orderby'           => 'meta_value_num',
    'order'             => 'ASC',
    'meta_query'        => array(
                'key'       => 'event_date',
                'compare'   => '>=',
                'value'     => intval(strtotime(date('Y-m-d'))),
                'type'      => 'numeric'
    ),
);

$query = new WP_Query( $args );

Me está devolviendo todos los eventos, tanto pasados como futuros.

Entiendo que los timestamps se almacenan como strings en la base de datos, por lo que normalmente 'compare' => '>=' no funcionaría, pero según lo que he leído en Google y en el Codex, 'type' => 'numeric' debería convertir el string a entero y permitir la comparación con mi valor de esta mañana a medianoche. Lamentablemente, esto no parece estar funcionando y no entiendo por qué.

0
Todas las respuestas a la pregunta 2
2
10

Prueba con un array de arrays en tu meta query.

$args = array(
    'post_type'         => 'event',
    'posts_per_page'    => -1,
    'meta_key'          => 'event_date',
    'orderby'           => 'meta_value_num',
    'order'             => 'ASC',
    'meta_query'        => array(
         array(
                'key'       => 'event_date',
                'compare'   => '>=',
                'value'     => intval(strtotime(date('Y-m-d'))),
                'type'      => 'numeric'
         )
    ),
);

$query = new WP_Query( $args );
7 may 2013 21:10:57
Comentarios

Muchas gracias, esto también funciona para mí con Unix Time. (Me ahorraste mucho tiempo)

Ajay Patel Ajay Patel
22 nov 2014 13:47:56

+1 por 'meta_value_num' vs 'meta_value' para comparar timestamps que están almacenados como strings.

Drakes Drakes
6 jul 2017 20:53:49
0

¡Vaya, me salvaste el día con esta respuesta! Estaba intentando filtrar publicaciones por un campo numérico personalizado llamado type_price y lo estaba intentando hacer de esta forma:

'meta_query' => array(
    array(
        'key' => 'type_price',
        'value' => array( 0, 500000 ),
        'compare' => 'BETWEEN',
        'type' => 'NUMERIC',
 )),

Pero debería hacerse de esta manera para ordenarlo ASC:

array(
   'posts_per_page' => -1, 
   'meta_key' => 'type_price', 
   'orderby'  => 'meta_value_num', 
   'order' => 'ASC', 
       'meta_query' => array(
           array(
                'key' => 'type_price',
                'value' => array( 0, 500000 ),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC',
            )
        )),

Muchas gracias :)

7 abr 2016 10:44:46