Sortierung: Benutzerdefinierte Abfrage mit orderby meta_value_num THEN nach Titel


8

Ich versuche, eine benutzerdefinierte Post-Typ-Abfrage auszuführen, die den folgenden Kriterien entspricht:
Sortieren Sie Filme zuerst nach Jahr in absteigender Reihenfolge,
danach ("innerhalb" der Jahresreihenfolge) nach Titel alphabetisch.

gewünschte Ausgabe:
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 verschiedene 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, ASC ändere, ändert sich nur die Titelsortierung. 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 benutzerdefiniertes 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)
wobei 1 = 1
       UND (wp_term_relationships.term_taxonomy_id IN (24))
       UND wp_posts.post_type = 'Filme'
       UND (wp_posts.post_status = 'veröffentlichen')
       UND (wp_postmeta.meta_key = 'Jahr')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

Antworten:


1

Dies ist sehr grob, sollte aber Ihre Beiträge nach Jahr (meta_value) und dann nach Titel sortieren. Dies hängt davon ab, wie die Abfrage eingerichtet ist, sodass sie nur mit der folgenden Abfrage oder mit ähnlichen Abfragen 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);

Es klappt! vielen Dank. Ich habe ASC in DESC geändert, obwohl in der Funktion alter_order A nach Z sortiert wurde.
Kyii

ASCsollte AZ kurzschließen; DESCsollte ZA sortieren.
s_ha_dum

1

Ihr Problem ist nicht so viel mit orderbywie mit order. Während orderbymehrere Werte und Ihre Nutzung scheint ok akzeptiert, order nur akzeptiert ASC oder DESC .

Nach dem Desinfizieren orderwird an die Ausgabe der orderbyVerarbeitung angehängt . Wenn ich die Logik richtig verstehe, bedeutet dies, dass von mehreren orderbyParametern orderauf den zuletzt aufgelisteten angewendet wird.

Versuchen Sie, orderbyden 'title meta_value_num'Titel rückgängig zu machen, damit er standardmäßig sortiert wird und orderfür das Jahr anstelle des Titels gilt.


danke rarst. aber leider, wenn ich die Werte umkehre, bekomme ich eine Sortierreihenfolge, nur AZ, die meta_value_num ignoriert (Vermutung aufgrund der Tatsache, dass es dieselbe Reihenfolge ist, unabhängig davon, ob ORDER DESC oder ASC ist)
kyii

@kyii Ich bin nicht sicher, was du mit "gleiche Reihenfolge unabhängig" meinst?
Rarst

Es tut uns leid. Wenn ich wie von Ihnen vorgeschlagen umkehre, erhalte ich eine AZ-Reihenfolge der Beiträge, die gleich bleibt, obwohl ich den order =>Parameter im Abfrageformular ASC in DESC und zurück ändere . Ich denke also, dass die meta_value_num nicht angewendet wird. Ihr interessanter Punkt über die Logik des Zusammenspiels von ORDER und ORDERBY ist also vielleicht irgendwie anders? oder mache ich es falsch
Kyii

@kyii nicht sicher ... Ich würde versuchen, die resultierende Abfrage mit verschiedenen Kombinationen zu sichern. Ich denke jedoch, dass Sie am Ende SQL ändern müssten, diese Logik ist für komplexere Sortierungen zu restriktiv.
Rarst
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.