2012-10-01 29 views
6

Mostrar mensajes con el tipo de 'productos' ordenados por campo personalizado 'Precio':¿Cómo ordenar múltiples valores de campo personalizados de wordpress?

$query = new WP_Query( 
         array ('post_type' => 'product', 
           'orderby' => 'meta_value', 
           'meta_key' => 'price') 
        ); 

Qué código debo usar si también quieren pedir por 'tamaño'?

Otro ejemplo en el que necesito una especie de múltiples campos personalizados:

Mostrar mensajes con el tipo 'Evento' ordenado por 'START_HOUR' y luego por 'Start_Minute'.

Respuesta

7

Gracias a Bainternet he encontrado la solución:

function orderbyreplace($orderby) { 
    return str_replace('menu_order', 'mt1.meta_value, mt2.meta_value', $orderby); 
} 

y ...

$args = array(
    'post_type'=>'Events', 
    'orderby' => 'menu_order', 
    'order' => 'ASC', 
    'meta_query' => array(
     array(
      'key' => 'Start_Hour', 
      'value' => '', 
      'compare' => 'LIKE' 
     ), 
     array(
      'key' => 'Start_Minute', 
      'value' => '', 
      'compare' => 'LIKE' 
     ) 
    ) 
); 

add_filter('posts_orderby','orderbyreplace'); 
$loop = new WP_Query($args); 
remove_filter('posts_orderby','orderbyreplace'); 
+0

parece que esto no funciona porque primero se consultan las filas numéricas encontradas. 'SELECCIONAR SQL_CALC_FOUND_ROWS zmw_posts.ID FROM' –

1

He aquí un ejemplo del uso de más de un meta_key y orderby que creo que debería funcionar:

$params = array(
'post_type' => 'product', 
'meta_query' => array(
    array(
      'key' => 'price', 
      'value' => '', 
      'compare' => 'LIKE' 
    ), 
    array(
      'key' => 'size', 
      'value' => '', 
      'compare' => 'LIKE' 
    ) 
), 
'orderby' => 'price size', 
'order' => 'ASC' 
); 
$query = new WP_Query; 
$resulting_obj = $query->query($params); 

Tendrá que jugar con los elementos meta_query un poco más, especialmente el parámetro 'valor'. Eche un vistazo a http://codex.wordpress.org/Class_Reference/WP_Query en la sección 'Parámetros de campo personalizados'.

+0

Este me funcionó en WP 4.5.3 – KingRichard

2

creo que esto cambió ligeramente en Wordpress 3.7.

que tenía que cambiar

return str_replace('menu_order', 'mt2.meta_value, mt1.meta_value', $orderby); 

en

return str_replace('wp_posts.menu_order', 'mt2.meta_value, mt1.meta_value', $orderby); 

Gracias por la solución inicial! [Editado]

-1

No necesita ningún filtro o ganchos para ordenar múltiples campos personalizados, si el campo personalizado es meta_key y el otro es columna normal de la tabla, entonces use estos parámetros/argumentos en su consulta.

'meta_key' => 'KEY_NAME', 
'orderby' => 'meta_value_num SECOND_COLUMN_NAME', 
'order' => 'ASC' or 'order' => 'DESC' 

Aquí el orden de meta_value_num y SECOND_COLUMN_NAME cuestión, es posible que vea diferente-2 resultado basado en el orden.

+0

Esto se ordenará por 'KEY_NAME' solamente. La única forma en que funcionará este 'orderby' es si' SECOND_COLUMN_NAME' no es un campo personalizado, que no puede responder a estas preguntas. – Dylan

Cuestiones relacionadas