Folosirea Orderby și meta_value_num pentru a ordona mai întâi numerele apoi șirurile de caractere
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?

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

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