Consultar tipo de publicación personalizada con 2 campos personalizados (rango de fechas)

11 sept 2011, 21:06:21
Vistas: 3.88K
Votos: 4

He buscado en el WP Codex y StackExchange y obtuve algunas pistas, pero no puedo hacer funcionar esta consulta. Tengo 2 campos personalizados asociados a cada exhibición en formato Y-m-d: exstart-date siendo la fecha de inicio de la exhibición y exend-date siendo la fecha de finalización.

Puedo mostrar fácilmente exhibiciones futuras y pasadas, pero no puedo configurar correctamente el meta_query para mostrar exhibiciones actuales (con fecha de inicio menor o igual a hoy Y fecha de fin mayor o igual a hoy). El código siguiente no muestra nada en la página. ¿Ayuda?

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$today = date('Y-m-d', strtotime('-6 hours'));
query_posts(array(
    'post_type' => 'exhibitions', 
    'posts_per_page' => 6, 
    'paged' => $paged,
    'orderby' => 'title',
    'order' => 'DESC',
    'meta_query'=>array(
        'relation'=>'AND',
        array(
            'key' => 'exstart-date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'CHAR'
            ),
        array(
            'key' => 'exend-date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'CHAR'
            )
        )
    ));
if (have_posts()) :
while (have_posts()) : the_post();
11
Comentarios

una cosa que salta inmediatamente a la vista es 'type' => 'CHAR', debería ser 'type' => 'DATE', ¿no?

Milo Milo
11 sept 2011 23:20:49

Intenté usar DATE y aún así no funcionó. Cuando hago la consulta solo para la fecha de inicio o solo para la fecha de fin, CHAR funciona bien.

Ray Gulick Ray Gulick
12 sept 2011 01:50:12

la única otra cosa es que caller_get_posts es un parámetro verdadero/falso, pero ha sido reemplazado por ignore_sticky_posts, aunque eso no debería afectar realmente la consulta, solo obtienes un aviso de obsoleto. Lo probé aquí y parece estar funcionando, tal vez verifica que nada más esté interfiriendo con la consulta, como un plugin, print_r($wp_query) e inspecciona los contenidos.

Milo Milo
12 sept 2011 02:45:12

Gracias, pero la consulta de impresión no reveló nada. Algo está mal con el meta_query relacional. Si consulto exstart_date o exend_date por separado, no hay problema; obtengo el resultado correcto. Pero la consulta combinada no devuelve nada.

Ray Gulick Ray Gulick
12 sept 2011 15:01:23

si algo está mal con la consulta, lo verías en el SQL generado cuando inspeccionas $wp_query. funciona tal cual para mí cuando simplemente copio/pego tu código y agrego los campos meta apropiados (también estoy cambiando el post_type a uno que ya tengo configurado). ¿tus fechas en los campos meta tienen el formato aaaa-mm-dd? No imagino que las otras consultas que estás haciendo funcionarían si no lo tuvieran.

Milo Milo
12 sept 2011 15:18:54

Sí: aaaa-mm-dd Tal vez implementé mal la consulta de impresión. De nuevo, las consultas funcionan por separado, pero no en conjunto.

Ray Gulick Ray Gulick
12 sept 2011 19:42:02

¿No debería ser el valor de comparación '=', ya que estás intentando verificar que ambos contengan la fecha de hoy?

Michelle Michelle
12 sept 2011 19:53:59

No contienen la fecha de hoy. Estamos buscando valores iguales o mayores que la fecha de inicio e iguales o menores que la fecha de finalización. También probé esta consulta eliminando el '=', para que busque valores entre las fechas de inicio y finalización, pero eso tampoco devolvió un resultado. A menos que esté completamente malinterpretando la lógica, lo cual es posible.

Ray Gulick Ray Gulick
12 sept 2011 20:00:15

La parte que nos interesa es $wp_query->request, eso te dará la consulta SQL real que se está enviando a la base de datos. Si tienes phpMyAdmin, como verificación, puedes pegar esa consulta directamente bajo la pestaña SQL para ver qué devuelve. Así es como se ve la mía. Aparte de post_type, la tuya debería verse igual, a menos que algo más, como un plugin, esté filtrando la consulta.

Milo Milo
12 sept 2011 21:18:14

No tengo acceso a phpMyAdmin en este sitio en particular.

Ray Gulick Ray Gulick
13 sept 2011 01:59:10

Noté que usaste la misma fecha como fecha de inicio y de finalización. ¿Lo probaste cuando las dos fechas eran diferentes?

Ray Gulick Ray Gulick
16 sept 2011 15:58:22
Mostrar los 6 comentarios restantes
Todas las respuestas a la pregunta 1
0

Aquí está el código con el que terminé y que funciona. Debería haber mencionado que la consulta estaba dentro del bucle, porque cuando se lo mostré a Damian Taggart de Mindshare Studios, él notó y mencionó que debería estar usando WP_Query en lugar de query_posts. Gracias a Milo y a otros por intentar ayudarme sin tener toda la información necesaria.

<?php
     $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
     $today = date('Y-m-d', strtotime('-6 horas'));
     $myquery = new WP_Query(array(
     'post_type' => 'exhibitions', 
     'posts_per_page' => 6,  
     'paged' => $paged,
     'orderby' => 'title',
     'order' => 'ASC',
     'meta_query'=>array(
            'relation'=>'AND',
            array(
                'key' => 'exstart-date',
                'value' => $today,
                'compare' => '<=',
                'type' => 'CHAR'
            ),
            array(
                'key' => 'exend-date',
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
            )
        )
    ));
    if ($myquery->have_posts()) :
    while ($myquery->have_posts()) : $myquery->the_post();
?>
19 sept 2011 22:33:22