Usar Orderby y meta_value_num para ordenar primero números y luego cadenas de texto

13 mar 2012, 13:42:14
Vistas: 56.5K
Votos: 18

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?

5
Comentarios

intenta cambiar 'orderby' => 'meta_value_num', por 'orderby' => 'meta_value_num meta_value',

Bainternet Bainternet
13 mar 2012 13:51:41

Gracias, pero eso no funciona :(

Shaun Shaun
13 mar 2012 15:23:24

¡Ajá! Pero al revés sí funciona, meta_value meta_value_num ! ¡Gracias! ¿Quieres escribir una respuesta para que pueda votarla?

Shaun Shaun
13 mar 2012 15:24:14

publicado como respuesta para las personas que no leen los comentarios.

Bainternet Bainternet
13 mar 2012 15:26:57

POA significa "precio bajo consulta" https://en.wikipedia.org/wiki/Price_on_application

sudip sudip
7 mar 2018 10:46:15
Todas las respuestas a la pregunta 2
2
28

El argumento OrderBy puede aceptar más de un parámetro, por lo que la solución fue cambiar:

'orderby' => 'meta_value_num',

a:

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

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

bonger bonger
5 nov 2014 11:04:38

@bonger ¡Gracias! Tu solución es la solución completa para este problema. Y aquí está el resto del código donde se coloca tu consulta. Voy a publicarlo como respuesta para los nuevos visitantes.

gmatta gmatta
19 ago 2016 15:43:32
0

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' );
19 ago 2016 15:47:08