Ordinare per chiavi meta multiple e valori meta

16 nov 2016, 11:20:53
Visualizzazioni: 43.6K
Voti: 23

Come posso impostare l'ordinamento per chiavi meta multiple ordinando per valore meta? Qualcuno può fornirmi un esempio?

2
Commenti

Benvenuto su WPSE - per poterti aiutare, abbiamo bisogno del tuo aiuto. Puoi descrivere in modo più dettagliato cosa stai cercando di fare e magari postare alcuni esempi di codice?

TheDeadMedic TheDeadMedic
16 nov 2016 11:44:21

Non capisco perché sia stato chiuso o richiesto più informazioni, è molto chiaro, diretto e con i tag giusti...

jave.web jave.web
10 giu 2021 13:07:09
Tutte le risposte alla domanda 1
5
49

meta_query è un array di clausole meta. Ad esempio:

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

Puoi utilizzare un array associativo, con una chiave per ogni clausola meta:

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

Successivamente, puoi utilizzare queste chiavi nell'argomento order_by, con una sola:

$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', // I risultati saranno ordinati in base ai valori meta 'city'
) );

O più clausole:

$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' => array( 
        'city_clause' => 'ASC',
        'state_clause' => 'DESC',
    ),
) );

Esempio tratto da questo articolo nel blog Make WordPress Core.

16 nov 2016 11:45:28
Commenti

non dimenticare di aggiungere il tipo della meta chiave/valore. influenzerà i risultati. Di default WordPress tratterà il tuo meta come una stringa.

Alexander Ivashchenko Alexander Ivashchenko
12 dic 2018 13:54:03

Ma cosa succede se non voglio restituire solo i risultati dove lo stato è Wisconsin? Voglio che vengano restituiti tutti gli stati e voglio righe dove potrebbe esserci o meno una città, ordinando comunque quei due campi. Ad esempio, nessuna clausola WHERE - solo un ORDER BY.

Felix Eve Felix Eve
9 mag 2019 12:40:14

Felix, con quei requisiti una soluzione alternativa potrebbe essere includere una clausola finale "prendi tutto" nel tuo meta_query, e metterla per ultima nella tua istruzione orderby. Quindi le prime clausole nel tuo meta_query otterrebbero i risultati specifici che vuoi ordinare per primi. Poi la tua ultima clausola sarebbe tutto ciò che non è nelle tue clausole precedenti.

Matt Keys Matt Keys
2 ott 2020 22:30:13

EXISTS è un ottimo modo per ottenere una meta query complessa con nome ma allo stesso tempo non filtrare per il valore :) Tra l'altro: ho avuto un caso d'uso reale - la richiesta era di ordinare gli eventi per data DESC ma per ora ASC utilizzando un unico campo data&ora Ho usato la documentazione e questa risposta per costruire questo: https://ideone.com/RUoyZs :-)

jave.web jave.web
10 giu 2021 14:23:17

Wow questo è molto interessante

user2128576 user2128576
5 mar 2022 09:00:37