ich versuche, eine benutzerdefinierte Post-Typ-Abfrage auszuführen, um die folgenden Kriterien zu erfüllen:
Filme zuerst nach Jahr in absteigender Reihenfolge sortieren,
danach ("innerhalb" der Jahresreihenfolge) nach Titel alphabetisch.
gewünschte Leistung:
Filmtitel A, 2006
Filmtitel Z, 2006
...
Filmtitel A, 1996
Filmtitel Z, 1996
ich benutze den folgenden Code:
$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',
));
ich habe mehrere Dinge ausprobiert, aber ich kann nur dieses "inverse" Ergebnis erhalten:
filmtitel A, 1996
Filmtitel Z, 1996
...
Filmtitel A, 2006
Filmtitel Z, 2006
wenn ich DESC ändere, ändert ASC nur die Sortierung der Titel. aber ich muss es auf das Jahr und nicht auf den Titel anwenden.
ist es der richtige Weg, zwei orderby-Werte zu verwenden? oder muss ich eine meta_query oder eine benutzerdefinierte SQL verwenden?
danke im Voraus!
Hier ist die resultierende SQL-Abfrage von $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)
WO 1 = 1
AND (wp_term_relationships.term_taxonomy_id IN (24))
AND wp_posts.post_type = 'movies'
AND (wp_posts.post_status = 'publish')
AND (wp_postmeta.meta_key = 'year')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
Wp_posts.post_title DESC
Dies ist sehr grob, sollte aber Ihre Beiträge nach Jahr (meta_value) und dann nach Titel sortieren. Es hängt davon ab, wie die Abfrage eingerichtet ist, sodass sie nur mit der folgenden oder ähnlichen Abfrage funktioniert.
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);
Ihr Problem ist nicht so sehr mit orderby
als mit order
. Während orderby
mehrere Werte akzeptiert und Ihre Verwendung in Ordnung zu sein scheint, akzeptiert order
only ASC
oder DESC
.
Nach der Bereinigung wird order
an die Ausgabe der orderby
-Verarbeitung angehängt. Wenn ich die Logik richtig verstehe, die bedeutet, dass aus mehreren orderby
-Parametern order
auf den zuletzt aufgelisteten Parameter angewendet wird.
Versuchen Sie, orderby
in 'title meta_value_num'
umzukehren, damit der Titel standardmäßig sortiert wird und order
auf das Jahr anstatt auf den Titel angewendet wird.