Folosirea Orderby și meta_value_num pentru a ordona mai întâi numerele apoi șirurile de caractere

13 mar. 2012, 13:42:14
Vizualizări: 56.5K
Voturi: 18

Am o listă de produse, fiecare cu un preț într-un câmp personalizat stocat ca text, cum ar fi "2.50" sau "5.00" și le afișez pe pagină cu o interogare personalizată care sortează după preț:

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

Acest lucru funcționează bine pentru prețuri, dar unele prețuri sunt "POA" și aș dori să le afișez ultimele, însă codul de mai sus le ordonează în așa fel încât "POA" este afișat primul.

Există vreo modalitate de a modifica acest lucru, sau un hack rapid pe care l-aș putea folosi pentru a sorta array-ul ulterior și a pune orice preț "POA" la sfârșit?

5
Comentarii

încearcă să schimbi 'orderby' => 'meta_value_num', în 'orderby' => 'meta_value_num meta_value',

Bainternet Bainternet
13 mar. 2012 13:51:41

Mulțumesc, dar asta nu funcționează :(

Shaun Shaun
13 mar. 2012 15:23:24

Aha! Dar invers funcționează, meta_value meta_value_num! Mulțumesc! Vrei să scrii un răspuns ca să îți pot vota soluția?

Shaun Shaun
13 mar. 2012 15:24:14

postat ca răspuns pentru cei care nu citesc comentariile.

Bainternet Bainternet
13 mar. 2012 15:26:57

POA înseamnă "preț la cerere" https://en.wikipedia.org/wiki/Price_on_application

sudip sudip
7 mar. 2018 10:46:15
Toate răspunsurile la întrebare 2
2
28

Argumentul OrderBy poate accepta mai mult de un parametru, așa că soluția a fost să schimbăm:

'orderby' => 'meta_value_num',

în:

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

Aceasta doar sortează alfabetic, deoarece al doilea parametru nu are niciun efect, sortând după același câmp fără rezultat. Pentru a face acest lucru astfel încât numerele să fie sortate numeric și literele alfabetic, ar trebui să utilizați un filtru pentru a personaliza orderby folosind un fel de condiție SQL, de exemplu 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 Mulțumesc! Soluția ta este completă pentru această problemă. Și aici este restul codului în care se află interogarea ta. O voi posta ca răspuns pentru noii vizitatori.

gmatta gmatta
19 aug. 2016 15:43:32
0

Am găsit această soluție combinând codul de la @bonger și https://stackoverflow.com/questions/18084199/wordpress-query-order-by-case-when

Și funcționează bine.

Funcție

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;
}

Înainte de interogare

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

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