Tri: requête personnalisée avec ordre par meta_value_num ALORS par titre

8

j'essaie d'exécuter une requête de type de message personnalisé pour correspondre aux critères suivants:
trier les films d'abord par année dans l'ordre décroissant,
après cela ("à l'intérieur" de l'année) par titre par ordre alphabétique.

sortie souhaitée:
titre de film A, 2006
titre de film Z, 2006
...
titre de film A, 1996
titre de 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 obtenir que 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 cela ne change que le tri des titres. mais je dois l'appliquer à l'année et non au titre.

est-ce la bonne façon d'utiliser deux valeurs de commande? ou dois-je utiliser une méta-requête ou un SQL personnalisé?

merci d'avance!

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

SELECT wp_posts. *
FROM 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)
WHERE 1 = 1
       AND (
       wp_term_tp_tp_tp = 'films'
       ET (wp_posts.post_status = 'publier')
       ET (wp_postmeta.meta_key = 'année')
GROUPE PAR wp_posts.id
COMMANDER PAR wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

kyii
la source

Réponses:

1

Ceci est très grossier mais devrait trier vos messages par année (meta_value) puis par titre. Cela dépend de la façon dont la requête est configurée, donc elle ne fonctionnera 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);
s_ha_dum
la source
Ça marche! Merci beaucoup. j'ai changé ASC en DESC bien que dans la fonction alter_order pour trier A à Z.
kyii
ASCdevrait court AZ; DESCdevrait trier ZA.
s_ha_dum
1

Votre problème n'est pas autant avec orderbyqu'avec order. Tout en orderbyaccepte plusieurs valeurs et votre utilisation semble ok, n'accepte ou .order ASC DESC

Après la désinfection orderest ajoutée à la sortie du orderbytraitement. Si je comprends bien la logique, cela signifie que sur plusieurs orderbyparamètres, orders'appliquera au dernier répertorié.

Essayez de revenir orderbyà 'title meta_value_num'afin que le titre soit trié par défaut et orders'applique à l'année au lieu du titre.

Rarst
la source
merci rare. mais malheureusement, si j'inverse les valeurs, j'obtiens un ordre de tri juste AZ ignorant meta_value_num (deviner du fait qu'il s'agit du même ordre, que ORDER soit DESC ou ASC)
kyii
@kyii Je ne sais pas ce que vous entendez par "même ordre malgré tout"?
Rarst
Désolé. si j'inverse comme vous l'avez suggéré, j'obtiens un ordre AZ des messages, qui reste le même bien que je change le order =>paramètre dans le formulaire de requête ASC en DESC et retour. donc je suppose que le meta_value_num n'est pas appliqué. donc votre point intéressant sur la logique de l'interaction entre ORDER et ORDERBY est peut-être en quelque sorte différent? ou je me trompe?
kyii
@kyii pas sûr ... J'essaierais de vider la requête résultante avec différentes combinaisons. Cependant, je pense que vous auriez besoin de modifier SQL à la fin, cette logique est trop restrictive pour les tris plus complexes.
Rarst