Usar Orderby y meta_value_num para ordenar primero números y luego cadenas de texto
Tengo una lista de productos, cada uno con un precio en un campo personalizado almacenado como texto, por ejemplo "2.50" o "5.00", y los estoy mostrando en la página con una consulta personalizada que ordena por precio:
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 ) );
Esto funciona bien para los precios, pero algunos precios son "POA" y me gustaría mostrarlos al final, sin embargo, la configuración anterior los ordena de tal manera que "POA" se muestra primero.
¿Hay alguna manera de modificar esto, o algún truco rápido que pueda usar para ordenar el array después y poner cualquier precio "POA" al final?

Esto solo ordena alfabéticamente, ya que el segundo parámetro no tiene efecto, ordenando sobre el mismo campo sin resultado. Para lograr que los números se ordenen numéricamente y los caracteres alfabéticamente, tendrías que usar un filtro para personalizar el orderby usando algún tipo de condicional SQL, por ejemplo: 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

Encontré esta solución combinando código de @bonger y https://stackoverflow.com/questions/18084199/wordpress-query-order-by-case-when
Y funciona bien.
Función
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;
}
Antes de la Consulta
add_filter( 'posts_orderby', 'filter_case' );
$wp_query = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_case' );
