Clasificación: consulta personalizada con orderby meta_value_num THEN por título

8

Intento ejecutar una consulta de tipo de publicación personalizada para que coincida con los siguientes criterios:
ordenar las películas primero por año en orden descendente,
después de eso ("dentro" del orden del año) por título alfabéticamente.

salida deseada:
título de película A,
título de película 2006 Z, 2006
...
título de película A, 1996
título de película Z, 1996

yo uso el siguiente código:

$wp_query = new WP_Query();
$wp_query->query( array(
'post_type' => 'movies', 
                      'distribution' => 'companyA', 
                      'meta_key' => 'year',
                      'orderby' => 'meta_value_num title',  
                      'order' => 'DESC', 
                      'posts_per_page' => -1, 
                      'post_status' => 'publish',
));

Intenté varias cosas pero solo puedo obtener este resultado "inverso":

título de la película A, 1996
título de la película Z, 1996
...
título de la película A, 2006
título de la película Z, 2006

si cambio DESC, ASC solo cambia la clasificación del título. pero necesito aplicarlo al año y no al título.

¿Es la forma correcta de usar dos valores ordenados? ¿o tengo que usar un meta_query o SQL personalizado?

Gracias de antemano!

Aquí está la consulta SQL resultante de $GLOBALS['wp_query']->request

Wp_posts SELECT. *
DE wp_posts
       INNER JOIN wp_term_relationships
               ON (wp_posts.id = wp_term_relationships.object_id)
       INNER JOIN wp_postmeta
               ON (wp_posts.id = wp_postmeta.post_id)
donde 1 = 1
       Y (wp_term_relationships.term_taxonomy_id IN (24))
       Y wp_posts.post_type = 'películas'
       Y (wp_posts.post_status = 'publicar')
       Y (wp_postmeta.meta_key = 'año')
GRUPO POR wp_posts.id ORDENAR
POR wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

kyii
fuente

Respuestas:

1

Esto es muy crudo, pero debe ordenar sus publicaciones por año (meta_value) y luego por título. Depende de cómo se configure la consulta, por lo que solo funcionará con la consulta a continuación o con otras similares.

function alter_order_wpse_103181($order,$qry) {
  remove_filter('posts_orderby','alter_order',1,2);
  $order = explode(',',$order);
  $order = implode( ' ASC,',$order);
  return $order;
}
add_filter('posts_orderby','alter_order_wpse_103181',1,2);

$q = new WP_Query();
$q->query( array(
  'post_type' => 'movies', 
  'distribution' => 'companyA', 
  'meta_key' => 'year',
  'orderby' => 'meta_value_num title',  
  'order' => 'ASC', 
  'posts_per_page' => -1, 
  'post_status' => 'publish',
));
var_dump($q->request);
s_ha_dum
fuente
¡funciona! muchas gracias. Cambié ASC a DESC aunque en la función alter_order para ordenar de A a Z.
kyii
ASCdebe acortar AZ; DESCdebería ordenar ZA.
s_ha_dum
1

Su problema no es tanto con orderbycomo con order. Si bien orderbyacepta múltiples valores y su uso parece estar bien, order solo acepta ASC o DESC .

Después de la desinfección orderse agrega a la salida del orderbyprocesamiento. Si entiendo la lógica correcta, eso significa que fuera de múltiples orderbyparámetros, orderse aplicará al último listado.

Intente revertir orderbypara 'title meta_value_num'que el título se ordene por defecto y se orderaplique al año en lugar del título.

Rarst
fuente
gracias rarst. pero desafortunadamente si revierto los valores obtengo un orden de clasificación simplemente AZ ignorando meta_value_num (adivinando el hecho de que es el mismo orden independientemente de si ORDER es DESC o ASC)
kyii
@kyii No estoy seguro de lo que quieres decir con "el mismo orden independientemente".
Rarst
lo siento. si retrocedo como usted sugirió, obtengo un orden AZ de las publicaciones, que permanece igual aunque cambio el order =>parámetro en el formulario de consulta ASC a DESC y viceversa. así que supongo que el meta_value_num no se aplica. ¿Entonces su punto interesante sobre la lógica de la interacción de ORDER y ORDERBY es quizás de alguna manera diferente? o lo estoy haciendo mal?
kyii
@kyii no estoy seguro ... Trataría de volcar la consulta resultante con diferentes combinaciones. Sin embargo, creo que necesitaría modificar SQL al final, esta lógica es demasiado restrictiva para tipos más complejos.
Rarst