Utilizzo di Orderby e meta_value_num per ordinare prima i numeri e poi le stringhe


16

Ho un elenco di prodotti, ciascuno con un prezzo in un campo personalizzato memorizzato come testo "2.50" o "5.00" e li sto visualizzando sulla pagina con una query personalizzata che ordina in base al 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 gli ordini di cui sopra in modo tale che "POA" sia mostrato per primo.

Esiste un modo per alterarlo o un trucco rapido che potrei usare per ordinare in seguito l'array e mettere i prezzi "POA" all'ultimo?


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

Grazie, ma non funziona :(
Shaun,

Aha! Ma il contrario funziona meta_value meta_value_num! Grazie! Vuoi scrivere una risposta in modo che io possa votarla?
Shaun,

1
pubblicato come risposta per le persone che non leggono commenti.
Bainternet,

POA significa "prezzo su richiesta" en.wikipedia.org/wiki/Price_on_application
sudip

Risposte:


23

L' OrderByargomento può richiedere più di un parametro, quindi la soluzione doveva cambiare:

'orderby' => 'meta_value_num',

per:

'orderby' => 'meta_value meta_value_num',

3
Questo ordina semplicemente in ordine alfabetico, poiché il secondo parametro è no-op, l'ordinamento sullo stesso campo senza alcun effetto. Per fare ciò in modo che i numeri si ordinino numericamente e gli alfa in ordine alfabetico dovresti usare un filtro per personalizzare l'ordine per usare una sorta di involucro SQL, ad es.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 Grazie! La tua soluzione è la soluzione completa per questo problema. Ed ecco il resto del codice in cui è posizionata la query. Lo pubblicherò come risposta per i nuovi visitatori.
Gangesh,

2

Ho trovato questa soluzione combinando il codice di @bonger e /programming/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' );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.