Ordonare după valoarea unui câmp personalizat

24 feb. 2016, 14:17:21
Vizualizări: 27K
Voturi: 10

Bazat pe exemplul de aici https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

Aș dori să modific interogarea

$q = new WP_Query( array(
'meta_query' => array(
    'relation' => 'AND',
    'state_clause' => array(
        'key' => 'state',
        'value' => 'Wisconsin',
    ),
    'city_clause' => array(
        'key' => 'city',
        'compare' => 'EXISTS',
    ), 
),
'orderby' => 'city_clause') );

pentru a putea obține toate postările unde state este 'Wisconsin' SAU timezone este 'central' ORDONATE DUPĂ population DESCRESCĂTOR

3
Comentarii

Te rog să nu ceri același lucru în două fire diferite :)

fischi fischi
24 feb. 2016 15:14:10

Sigur - îmi cer scuze pentru asta

dkatwp dkatwp
25 feb. 2016 19:33:37

Acest răspuns ți-a rezolvat problema? Interogare personalizată cu orderby meta_value pentru un câmp personalizat

sampi sampi
13 iun. 2020 11:08:32
Toate răspunsurile la întrebare 2
0
15

Puteți crea grupuri de meta_queries folosind operații specifice de comparare asupra lor, iar deoarece doriți să ordonați în funcție de un singur câmp personalizat, puteți păstra declarația de ordonare dedicată acelui singur câmp meta. Astfel:

$q = new WP_Query( 
    array(
        'meta_key' => 'population', //setează meta_key care va fi folosit pentru ordonare
        'orderby' => 'meta_value', //dacă meta_key (population) este numeric, folosește meta_value_num în schimb
        'order' => 'DESC', //setează direcția de ordonare
        'meta_query' => array(
            'relation' => 'AND', //setează relația între grupurile de interogări
            array(
                'relation' => 'OR', //setează relația pentru această interogare internă
                array(
                    'key' => 'state',
                    'value' => 'Wisconsin',
                ),
                array(
                    'key' => 'timezone',
                    'value' => 'central',
                )
            ),
            array(
                'key' => 'city',
                'compare' => 'EXISTS',
            )
        )
    )           
);
24 feb. 2016 15:51:20
4

Acest lucru s-ar face astfel:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            'state_clause' => array(
                'key' => 'state',
                'value' => array( 'Wisconsin' ), //valori permise
                'compare' => 'IN' // statul trebuie să fie în array-ul de mai sus
            ),
            'state_clause' => array(
                'key' => 'timezone',
                'value' => 'central',
                'compare' => '='
            ),
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array(
        'city_clause' => 'DESC',
    ),
) );
24 feb. 2016 15:14:12
Comentarii

Mulțumesc @fischi - dar am două probleme cu această soluție: 1) valoarea 'state_clause' din tabloul meta_query este suprascrisă - deci doar ultima declarație rămâne ('timezone') dacă efectiv afișezi interogarea. 2) 'relation' => 'OR' distruge logica interogării - acum rezultatul sunt toate postările, deoarece population există în toate cazurile (și noi vrem doar cele unde state este 'Wisconsin' sau timezone este 'central'

dkatwp dkatwp
24 feb. 2016 15:32:16

vezi răspunsul pentru actualizare.

fischi fischi
24 feb. 2016 16:11:04

Mulțumesc! repetarea 'state_clause' în tablou pentru cheile state și timezone nu ar funcționa - așa că a trebuit să o fac cum a sugerat @Bruno Cantuaria mai sus. Cu toate acestea, soluția lui Bruno nu a funcționat pentru mine fără a declara city_clause și fără a o apela în 'orderby'. Deci mulțumesc din nou

dkatwp dkatwp
24 feb. 2016 17:06:31

Nicio problemă. Mă bucur să ajut!

fischi fischi
24 feb. 2016 17:23:19