¿No puedes realizar una consulta combinada y ordenar los resultados? Solución para eventos de varios días

7 feb 2012, 05:22:06
Vistas: 158
Votos: 0

A continuación está el código que estoy usando para consultar eventos de varios días. El problema que tengo es que puedo ordenar por la fecha de inicio (evstart_date) O puedo hacer una consulta combinada contra la fecha de inicio y la fecha de fin (evend_date). Pero no puedo hacer ambas cosas: la consulta combinada Y el ordenamiento. El código de abajo obtiene la consulta correcta (sigue mostrando eventos de varios días que comenzaron en el pasado pero aún no han terminado), pero el ordenamiento está roto (vuelve al orden predeterminado por fecha de publicación).

He intentado varias variaciones, pero no he podido encontrar una solución.

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $today = date('Y-m-d', strtotime('-6 hours'));
    $upcomingevents = new WP_Query(array(
        'post_type' => 'events', 
        'posts_per_page' => 6,  
        'paged' => $paged,
        'meta_query'=>array(
        'relation'=>'OR',
            array(
                'key' => 'evstart_date',
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                ),
            array(
                'key' => 'evend_date',
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date',
        'orderby' => 'meta_value',
        'order' => 'ASC'
    )); 
?>
6
Comentarios

¿Por qué quieres ordenar?

tollmanz tollmanz
7 feb 2012 05:36:36

¿Cuál es el formato de tus fechas?

mor7ifer mor7ifer
7 feb 2012 10:25:16

Quiero que los elementos se ordenen por fecha de inicio. Las fechas están en formato yyyy-mm-dd.

Ray Gulick Ray Gulick
7 feb 2012 14:01:35

En realidad, el código anterior tampoco obtiene la consulta correctamente, ya que muestra todo en los eventos (agregué algunos eventos que ya habían pasado y no los excluye). Nuevamente, si elimino el código orderby (las últimas 3 variables), la consulta funciona (excluye los elementos apropiados). Si consulto solo por la fecha de inicio o la fecha de finalización, entonces puedo ordenar.

Ray Gulick Ray Gulick
7 feb 2012 15:20:37

El tipo debería ser date, no char. De lo contrario, publica el SQL generado por esta consulta, ¿quizás no puedas ordenar por una clave utilizada en una relación OR?

Milo Milo
7 feb 2012 17:33:50

Probé eso, y DATE no funciona mejor. CHAR funciona bien cuando no se intenta ordenar y hacer una consulta combinada. El formato generado es yyyy-mm-dd (ej. 2012-02-05) Solo por probar, intenté AND en lugar de OR y no obtuve resultados, lo que puede indicar que la consulta funciona, pero eso no es de mucha ayuda, ya que AND no es la consulta necesaria para obtener los resultados correctos. También creé un nuevo campo personalizado de startdate (mismos datos, pero diferente nombre de clave) y tampoco puedo ordenar por eso con la consulta combinada (a pesar de que esa clave no se usa en la consulta).

Ray Gulick Ray Gulick
7 feb 2012 21:32:18
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 1
2

Tuve este mismo problema hasta que me di cuenta de que en realidad no es necesario consultar por la fecha de inicio del evento, solo por la fecha de finalización.

Mientras la fecha de finalización del evento no haya pasado, no importa si la fecha de inicio está en el futuro o no. Todo lo que tienes que hacer es obtener todas las fechas que aún no han terminado y luego puedes ordenarlas por su fecha de inicio.

Esto debería funcionar para ti:

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $today = date('Y-m-d', strtotime('-6 hours'));
    $upcomingevents = new WP_Query(array(
        'post_type' => 'events', 
        'posts_per_page' => 6,  
        'paged' => $paged,
        'meta_query'=>array(
            array(
                'key' => 'evend_date', // Fecha de finalización
                'value' => $today,
                'compare' => '>=', // Mayor o igual a hoy
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date', // Ordenar por fecha de inicio
        'orderby' => 'meta_value',
        'order' => 'ASC' // Orden ascendente
    )); 
?>
14 feb 2012 03:43:32
Comentarios

Finalmente llegué a la misma conclusión, Christian; no había tenido tiempo de publicarla como respuesta. Gracias por tu respuesta.

Ray Gulick Ray Gulick
14 feb 2012 07:58:05

Excelente respuesta Christian. Bienvenido al sitio, sigue proporcionando buenas respuestas como esta; el sitio las necesita.

Dwayne Charrington Dwayne Charrington
15 feb 2012 02:17:38