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
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);
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.