it-swarm.com.de

Sortierung: benutzerdefinierte Abfrage mit orderby meta_value_num THEN by title

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

8
kyii

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

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.

1
Rarst