Utilizzare Orderby e meta_value_num per ordinare prima i numeri e poi le stringhe

13 mar 2012, 13:42:14
Visualizzazioni: 56.5K
Voti: 18

Ho un elenco di prodotti, ciascuno con un prezzo memorizzato in un campo personalizzato come testo, ad esempio "2.50" o "5.00", e li sto visualizzando sulla pagina con una query personalizzata che ordina per prezzo:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

Questo funziona bene per i prezzi, ma alcuni prezzi sono "POA" e vorrei mostrarli per ultimi, tuttavia il codice sopra li ordina in modo tale che "POA" viene mostrato per primo.

C'è un modo per modificare questo comportamento, o un veloce espediente che potrei utilizzare per ordinare l'array successivamente e mettere i prezzi "POA" alla fine?

5
Commenti

prova a cambiare 'orderby' => 'meta_value_num', in 'orderby' => 'meta_value_num meta_value',

Bainternet Bainternet
13 mar 2012 13:51:41

Grazie ma non funziona :(

Shaun Shaun
13 mar 2012 15:23:24

Aha! Ma al contrario funziona, meta_value meta_value_num ! Grazie! Vuoi scrivere una risposta così posso votarla?

Shaun Shaun
13 mar 2012 15:24:14

pubblicato come risposta per le persone che non leggono i commenti.

Bainternet Bainternet
13 mar 2012 15:26:57

POA significa "prezzo su richiesta" https://it.wikipedia.org/wiki/Prezzo_su_richiesta

sudip sudip
7 mar 2018 10:46:15
Tutte le risposte alla domanda 2
2
28

L'argomento OrderBy può accettare più di un parametro, quindi la soluzione è stata cambiare:

'orderby' => 'meta_value_num',

in:

'orderby' => 'meta_value meta_value_num',
13 mar 2012 15:26:31
Commenti

Questo ordina solo alfabeticamente, poiché il secondo parametro non ha effetto, ordinando sullo stesso campo senza alcun risultato. Per fare in modo che i numeri vengano ordinati numericamente e le lettere alfabeticamente, dovresti usare un filtro per personalizzare l'orderby utilizzando qualche tipo di condizione SQL, ad esempio ORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC

bonger bonger
5 nov 2014 11:04:38

@bonger Grazie! La tua soluzione è completa per questo problema. Ecco il resto del codice dove viene inserita la tua query. La pubblicherò come risposta per i nuovi visitatori.

gmatta gmatta
19 ago 2016 15:43:32
0

Ho trovato questa soluzione combinando il codice di @bonger e https://stackoverflow.com/questions/18084199/wordpress-query-order-by-case-when

E funziona bene.

Funzione

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

Prima della Query

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
19 ago 2016 15:47:08