Nu reușesc să combin interogarea și sortarea în WordPress?

7 feb. 2012, 05:22:06
Vizualizări: 158
Voturi: 0

Mai jos este codul pe care îl folosesc pentru a interoga evenimentele care se întind pe mai multe zile. Problema pe care o am este că pot sorta fie după data de început (evstart_date) SAU pot face o interogare combinată împotriva datei de început și de sfârșit (evend_date). Dar nu pot face atât interogarea combinată, cât și sortarea. Codul de mai jos obține interogarea corectă (continuă să afișeze evenimentele pe mai multe zile care au început în trecut dar nu s-au încheiat încă), dar sortarea este defectă (revine la sortarea implicită după data postării).

Am încercat mai multe variații, dar nu am reușit să găsesc o soluție.

<?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
Comentarii

După ce criteriu doriți să sortați?

tollmanz tollmanz
7 feb. 2012 05:36:36

În ce format sunt datele dumneavoastră?

mor7ifer mor7ifer
7 feb. 2012 10:25:16

Doresc ca elementele să fie ordonate după data de început. Datele sunt în format aaaa-ll-zz.

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

De fapt, codul de mai sus nu obține interogarea corectă nici el, deoarece afișează totul în evenimente (am adăugat câteva evenimente care erau trecute și nu le exclude). Din nou, dacă elimin codul orderby (ultimele 3 variabile), interogarea funcționează (exclude elementele potrivite). Dacă interoghez doar pentru data de început sau data de sfârșit, atunci pot sorta.

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

tipul ar trebui să fie date, nu char. în caz contrar, postează SQL-ul generat de această interogare, poate nu poți sorta după o cheie folosită într-o relație OR?

Milo Milo
7 feb. 2012 17:33:50

Am încercat asta, și DATE nu funcționează mai bine. CHAR funcționează bine când nu încerci să sortezi și să faci o interogare combinată. Formatul generat este aaaa-ll-zz (de ex. 2012-02-05) Doar pentru test, am încercat AND în loc de OR și nu am obținut rezultate, așa că asta poate indica faptul că interogarea funcționează, dar nu este foarte util, deoarece AND nu este interogarea necesară pentru a returna rezultatele corecte. De asemenea, am creat un nou câmp personalizat startdate (aceleași date, dar cu alt nume de cheie) și nici pe acela nu pot sorta, cu interogarea combinată (chiar dacă acea cheie nu este folosită în interogare).

Ray Gulick Ray Gulick
7 feb. 2012 21:32:18
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 1
2

Am avut aceeași problemă până când am realizat că nu trebuie să interoghezi după data de început a evenimentului, ci doar după data de sfârșit.

Atâta timp cât data de sfârșit a evenimentului nu a trecut, nu contează dacă data de început este în viitor sau nu. Tot ce trebuie să faci este să obții toate datele care nu s-au încheiat încă, apoi le poți ordona după data lor de început.

Aceasta ar trebui să funcționeze pentru tine:

<?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', // Cheia meta pentru data de sfârșit
                'value' => $today,
                'compare' => '>=', // Compară dacă data de sfârșit este mai mare sau egală cu astăzi
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date', // Cheia meta pentru data de început
        'orderby' => 'meta_value', // Ordonează după valoarea meta
        'order' => 'ASC' // Ordine crescătoare
    )); 
?>
14 feb. 2012 03:43:32
Comentarii

Am ajuns în cele din urmă la aceeași concluzie, Christian; nu am apucat să o postez ca răspuns. Mulțumesc pentru răspunsul tău.

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

Excelent răspuns, Christian. Bine ai venit pe site, continuă să oferi astfel de răspunsuri bune; site-ul are nevoie de ele.

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