Ordinare per valore di un campo personalizzato

24 feb 2016, 14:17:21
Visualizzazioni: 27K
Voti: 10

Basato sull'esempio qui https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

Vorrei modificare la query

$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') );

per ottenere tutti i post dove state è 'Wisconsin' OPPURE timezone è 'central' ORDINATI PER population in ordine DECRESCENTE

3
Commenti

Per favore non chiedere la stessa cosa in due thread diversi :)

fischi fischi
24 feb 2016 15:14:10

Certo - scusa per quello

dkatwp dkatwp
25 feb 2016 19:33:37

Questa risposta risolve il tuo problema? Query personalizzata con orderby meta_value di un campo personalizzato

sampi sampi
13 giu 2020 11:08:32
Tutte le risposte alla domanda 2
0
15

Puoi creare gruppi di meta_queries utilizzando specifiche operazioni di confronto su di essi, e dal momento che vuoi ordinare basandoti su un singolo custom field, puoi mantenere la dichiarazione di ordinamento dedicata al singolo campo meta. Quindi:

$q = new WP_Query( 
    array(
        'meta_key' => 'population', //impostando il meta_key che verrà usato per l'ordinamento
        'orderby' => 'meta_value', //se il meta_key (population) è numerico usa meta_value_num invece
        'order' => 'DESC', //impostando la direzione dell'ordinamento
        'meta_query' => array(
            'relation' => 'AND', //impostando la relazione tra i gruppi di query
            array(
                'relation' => 'OR', //impostando la relazione tra questa query interna
                array(
                    'key' => 'state',
                    'value' => 'Wisconsin',
                ),
                array(
                    'key' => 'timezone',
                    'value' => 'central',
                )
            ),
            array(
                'key' => 'city',
                'compare' => 'EXISTS',
            )
        )
    )           
);
24 feb 2016 15:51:20
4

Questo si farebbe in questo modo:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            'state_clause' => array(
                'key' => 'state',
                'value' => array( 'Wisconsin' ), //valori ammessi
                'compare' => 'IN' // lo state deve essere nell'array sopra
            ),
            '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
Commenti

Grazie @fischi - ma ho due problemi con quella soluzione: 1) il valore di 'state_clause' nell'array meta_query viene sovrascritto - quindi rimane solo l'ultima dichiarazione ('timezone') se si effettua il dump della query. 2) la 'relation' => 'OR' rovina la logica della query - ora il risultato sono tutti i post poiché population esiste in tutti i casi (e noi vogliamo solo quelli dove state è 'Wisconsin' o timezone è 'central'

dkatwp dkatwp
24 feb 2016 15:32:16

vedi la risposta per l'aggiornamento.

fischi fischi
24 feb 2016 16:11:04

Grazie! Ripetere 'state_clause' nell'array per le chiavi state e timezone non avrebbe funzionato - quindi ho dovuto fare come suggerito da @Bruno Cantuaria sopra. Tuttavia, la soluzione di Bruno non ha funzionato per me senza dichiarare city_clause e richiamarlo in 'orderby'. Quindi grazie ancora

dkatwp dkatwp
24 feb 2016 17:06:31

Nessun problema. Felice di aiutare!

fischi fischi
24 feb 2016 17:23:19