wp-query – Clasificación: consulta personalizada con orderby meta_value_num LUEGO por título

Pregunta:

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 la película A, 2006
título de la película Z, 2006

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

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 utilizar dos valores orderby? ¿O tengo que usar una meta_query o SQL personalizado?

gracias de antemano!

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

SELECCIONE wp_posts. *
DESDE wp_posts
INNER JOIN wp_term_relationships
ACTIVADO (wp_posts.id = wp_term_relationships.object_id)
INNER JOIN wp_postmeta
ACTIVADO (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')
GROUP BY wp_posts.id
PEDIR POR wp_postmeta.meta_value + 0,
wp_posts.post_title DESC

Respuesta:

Esto es muy burdo, pero debería ordenar sus publicaciones por año (meta_valor) y luego por título. Depende de cómo esté configurada la consulta, por lo que solo funcionará con la consulta siguiente 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);

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım