Non riesco a combinare query AND ordinamento? Soluzione per query multiple e ordinamento in WordPress

7 feb 2012, 05:22:06
Visualizzazioni: 158
Voti: 0

Di seguito il codice che sto usando per interrogare eventi multi-giorno. Il problema che sto riscontrando è che posso ordinare per data di inizio (evstart_date) OPPURE posso fare una query combinata su data di inizio e fine (evend_date). Ma non riesco a fare sia la query combinata CHE l'ordinamento. Il codice qui sotto ottiene la query corretta (continua a mostrare eventi multi-giorno iniziati in passato ma non ancora terminati), ma l'ordinamento è rotto (ritorna all'ordinamento predefinito per data di pubblicazione).

Ho provato diverse varianti, ma non sono riuscito a trovare una soluzione.

<?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',    // Chiave meta per la data di inizio
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                ),
            array(
                'key' => 'evend_date',      // Chiave meta per la data di fine
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date',      // Chiave per l'ordinamento
        'orderby' => 'meta_value',
        'order' => 'ASC'
    )); 
?>
6
Commenti

In base a cosa vuoi ordinare?

tollmanz tollmanz
7 feb 2012 05:36:36

Qual è il formato delle tue date?

mor7ifer mor7ifer
7 feb 2012 10:25:16

Voglio che gli elementi siano ordinati per data di inizio. Le date sono in formato yyyy-mm-dd.

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

In realtà, il codice sopra non ottiene correttamente la query, poiché mostra tutto negli eventi (ho aggiunto alcuni eventi passati e non li esclude). Ancora una volta, se rimuovo il codice orderby (ultime 3 variabili) la query funziona (esclude gli elementi appropriati). Se interrogo solo per data di inizio o data di fine, allora posso ordinare.

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

il type dovrebbe essere date, non char. Altrimenti, posta l'SQL generato da questa query, forse non puoi ordinare su una chiave usata in una relazione OR?

Milo Milo
7 feb 2012 17:33:50

Provato, e DATE non funziona meglio. CHAR funziona bene quando non si tenta sia di ordinare che di fare una query combinata. Il formato generato è yyyy-mm-dd (es. 2012-02-05) Solo per provare, ho tentato AND invece di OR e non ho ottenuto risultati, quindi questo potrebbe indicare che la query funziona, ma non è molto utile, dato che AND non è la query necessaria per ottenere i risultati corretti. Ho anche creato un nuovo campo personalizzato startdate (stessi dati, ma nome chiave diverso) e non riesco a ordinare neanche su quello, con la query combinata (anche se quella chiave non è usata nella query).

Ray Gulick Ray Gulick
7 feb 2012 21:32:18
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 1
2

Ho avuto lo stesso problema finché non ho capito che in realtà non è necessario interrogare la data di inizio dell'evento, ma solo la data di fine.

Fintanto che la data di fine dell'evento non è passata, non importa se la data di inizio è nel futuro o meno. Tutto ciò che devi fare è recuperare tutte le date che non sono ancora terminate e poi puoi ordinarle per data di inizio.

Questo dovrebbe funzionare per te:

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $today = date('Y-m-d', strtotime('-6 ore'));
    $upcomingevents = new WP_Query(array(
        'post_type' => 'events', 
        'posts_per_page' => 6,  
        'paged' => $paged,
        'meta_query'=>array(
            array(
                'key' => 'evend_date', // data di fine evento
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date', // data di inizio evento
        'orderby' => 'meta_value',
        'order' => 'ASC'
    )); 
?>
14 feb 2012 03:43:32
Commenti

Alla fine sono giunto alla stessa conclusione, Christian; non avevo ancora avuto modo di pubblicarla come risposta. Grazie per la tua risposta.

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

Ottima risposta Christian. Benvenuto nel sito, continua a fornire buone risposte come questa; il sito ne ha bisogno.

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