web-dev-qa-db-fra.com

Tri: requête personnalisée avec orderby meta_value_num THEN par titre

j'essaie d'exécuter une requête de type post personnalisé pour correspondre aux critères suivants:
trie les films d'abord par année en ordre décroissant,
ensuite (par ordre alphabétique).

sortie désirée:
titre du film A, 2006
titre du film Z, 2006
...
titre du film A, 1996
titre du film Z, 1996

j'utilise le code suivant:

$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',
));

j'ai essayé plusieurs choses mais je ne peux qu'obtenir ce résultat "inverse":

titre du film A, 1996
titre du film Z, 1996
...
titre du film A, 2006
titre du film Z, 2006

si je change DESC, ASC ne change que le titre. mais je dois l'appliquer à l'année et non au titre.

est-ce la bonne façon d'utiliser deux valeurs orderby? ou dois-je utiliser un meta_query ou un SQL personnalisé?

merci d'avance!

Voici la requête SQL résultante de $GLOBALS['wp_query']->request

SELECT wp_posts. *
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)
O 1 = 1
AND (wp_term_relationships.term_taxonomy_id IN (24))
AND wp_posts.post_type = 'films'
AND (wp_posts.post_status = 'publier')
AND (wp_postmeta.meta_key = 'année')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
Wp_posts.post_title DESC

8
kyii

C'est très brut, mais vous devriez trier vos articles par année (meta_value), puis par titre. Cela dépend de la configuration de la requête, elle ne fonctionnera donc qu'avec la requête ci-dessous ou avec des requêtes similaires.

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

Votre problème n'est pas autant avec orderby qu'avec order. Alors que orderby accepte plusieurs valeurs et que votre utilisation semble correcte, order only accepte ASC ou DESC.

Après la désinfection, order est ajouté à la sortie du traitement de orderby. Si je comprends bien la logique, cela signifie que, parmi plusieurs paramètres orderby, order s'appliquera au dernier paramètre répertorié.

Essayez d'inverser orderby en 'title meta_value_num' afin que le titre soit trié par défaut et que order s'applique à l'année au lieu de titre.

1
Rarst