Utilizzare Orderby e meta_value_num per ordinare prima i numeri e poi le stringhe
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?

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

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