Utilizando Orderby e meta_value_num para ordenar os números primeiro e depois os strings

12

Eu tenho uma lista de produtos, cada um com um preço em um campo personalizado armazenado como texto como "2.50" ou "5.00" e estou exibindo-os na página com uma consulta personalizada que ordena pelo preço:

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

Isso funciona bem para os preços, mas alguns preços são "POA" e eu gostaria de mostrá-los por último, no entanto as ordens acima de tal forma que "POA" é mostrado em primeiro lugar.

Existe alguma maneira de alterar isso, ou um hack rápido que eu poderia usar para classificar o array depois e colocar os preços de "POA" por último?

    
por Shaun 13.03.2012 / 12:42

2 respostas

20

O argumento OrderBy pode levar mais de um parâmetro para que a solução mude:

'orderby' => 'meta_value_num',

para:

'orderby' => 'meta_value meta_value_num',
    
por Bainternet 13.03.2012 / 14:26
1

Encontrei essa solução combinando o código por @bonger e enlace

E isso funciona bem.

Função

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 da consulta

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
    
por Gangesh 19.08.2016 / 14:47

Tags