meta_query en un rango de fechas usando un array de valores

1 feb 2014, 10:37:48
Vistas: 14.5K
Votos: 2

¿Cómo puedo hacer una consulta para que devuelva el post si el array del campo personalizado contiene una fecha que está dentro del rango especificado? La consulta de abajo es básicamente lo que necesito pero no funciona...

// el array income_dates luce así
// a:3:{i:0;s:10:"2014-02-01";i:1;s:10:"2014-03-01";i:2;s:10:"2014-03-29";}

$today = date("Y-m-d");
$date1 = date("Y-m-d", strtotime($today . "-1 Month"));
$date2 = date("Y-m-d", strtotime($today . "+1 Month"));

$args = array(
    'post_type' => 'income',
    'meta_query' => array( 
        array(
            'key' => 'income_dates',
            'value' => $date1,
            'type'  => 'date',
            'compare' => '>'
        ),
        array(
            'key' => 'income_dates',
            'value' => $date2,
            'type'  => 'date',
            'compare' => '<'
        ),
    )
); 
2
Comentarios

Si necesitas comparar datos, debes guardar las fechas en múltiples metadatos. Por favor, consulta el Codex para el uso de add_post_meta.

1fixdotio 1fixdotio
1 feb 2014 10:49:17

Vale, ya estoy haciendo eso. El campo personalizado income_dates contiene las fechas de ingresos recurrentes y pensé que sería mejor en un array, de lo contrario la base de datos podría llenarse bastante rápido.

user537137 user537137
1 feb 2014 11:03:25
Todas las respuestas a la pregunta 2
0

Necesitaba obtener publicaciones del tipo evento con el campo personalizado "fecha" posterior al día de hoy, este fragmento de código me funcionó perfectamente, espero que ayude a alguien en una situación similar.

            $today = date("Y-m-d");
            $today1 = date("Ymd", strtotime("$today"));
            $custom_meta = array(
                array(
                    'key' => 'data_de_inicio',
                    'value'=>$today1,
                    'compare'=>'>',
                    'type'=>'date',
                ),
            );
            $query = new WP_Query(array(
                'post_type'=>'event',
                'showposts'=>'3',
                'orderby'=>'meta_value',
                'meta_key'=>'data_de_inicio',
                'order'=>'asc',
                'meta_query'=>$custom_meta,
                )
            );
5 jun 2015 16:53:50
4

Sugiero no almacenar los metavalores como array porque (creo) no es lo que necesitas. Pienso que realmente necesitas almacenar cada metavalor individualmente con su propio par clave/valor y no una sola clave con valores serializados. Cuando se hace de esta manera, puedes usar la comparación BETWEEN:

$today = date("Y-m-d");
//La comparación 'BETWEEN' con 'type' date solo funciona con fechas en formato YYYYMMDD.
//Ver http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters 
$date1 = date("YYYYMMDD", strtotime($today . "-1 Month"));
$date2 = date("YYYYMMDD", strtotime($today . "+1 Month"));

$args = array(
    'post_type' => 'income',
    'meta_query' => array( 
     array(
         'key' => 'income_dates',
         'value' =>  array($date1,$date2),
         'type'  => 'date',
         'compare' => 'BETWEEN'
         ),
     )
); 
1 feb 2014 13:13:14
Comentarios

Gracias por la respuesta y sí, eso funcionaría pero prefiero mantener las fechas en una sola entrada, así que simplemente he recuperado todas las publicaciones y estoy usando una declaración if para obtener los resultados que busco

user537137 user537137
2 feb 2014 09:12:36

@user537137 ¿puedes dar un ejemplo de tu código?

Andrew Welch Andrew Welch
8 feb 2017 12:03:57

@AndrewWelch esto fue hace 3 años. Gracias por el interés pero ni siquiera recuerdo para qué era esto

user537137 user537137
9 feb 2017 12:28:17

Lo resolví ahora, pero la documentación para meta queries que involucran fechas está un poco fragmentada, por decir lo menos.

Andrew Welch Andrew Welch
9 feb 2017 13:49:59