Das Sortieren von Posts durch eine Metaabfrage mit zwei Schlüsseln schlägt fehl, während es als einzelne Abfragen getrennt ist

Ich habe eine Liste von Kursen, die ich sortieren möchte. Zu Sortierzwecken möchte ich zwei erweiterte benutzerdefinierte Felder verwenden. Zuerst ein Auswahlfeld class_day mit den Tagen:

 1 : Mon 2 : Tue 3 : Wed 4 : Thu 5 : Fri 6 : Sat 7 : Sun 

Der erste Wert wird absichtlich auf eine Zahl gesetzt, um eine einfache Sortierung zu ermöglichen, während der zweite Label-Wert derjenige ist, der für die Anzeige am Frontend wiedergegeben wird. Das zweite Feld ist ein einfaches Textfeld class_start mit einer Nummer wie zB 19:00 . Jetzt möchte ich meine Posts nach dem Feld class_day und für den Fall, dass es am gleichen Tag Ereignisse gibt, diese nach dem numerischen Wert des class_start . Problem ist, wenn ich die Beiträge nur nach class_day :

 $args = array( 'post_type' => 'courses', 'posts_per_page' => -1, 'meta_key' => 'class_day', 'orderby' => 'meta_value_num', 'order' => 'ASC' ); $the_query = new WP_Query( $args ); 

oder durch class_start :

 $args = array( 'post_type' => 'courses', 'posts_per_page' => -1, 'meta_key' => 'class_start', 'orderby' => 'meta_value_num', 'order' => 'ASC' ); $the_query = new WP_Query( $args ); 

Jedes Mal, wenn die Beiträge richtig sortiert sind. Einmal am Tag, einmal im Laufe der Zeit. Aber wenn ich versuche, die beiden mit meta_query , funktioniert es überhaupt nicht.

 $args = array( 'post_type' => 'courses', 'meta_query' => array( 'relation' => 'OR', array('key' => 'class_day'), array('key' => 'class_start') ), 'meta_key' => 'meta_value', 'orderby' => 'meta_value_num', 'order' => 'ASC' ); $the_query = new WP_Query( $args ); 

Mit 'relation' => 'OR' die Beiträge nur nach dem Tag sortiert, aber die Beiträge desselben Tages werden erst im zweiten Schritt richtig sortiert. Wenn ich 'relation' => 'AND' laufe ich in keiner Übereinstimmung für die Abfrage, denn ich stoße in den else Fall der Schleife:

 if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); 

Mein Ziel wäre es, eine sortierte Liste wie folgt zu erhalten:

 Mon 13:00 Tue 12:30 Tue 16:00 Sat 12:00 

Aber nicht:

 Mon 13:00 Tue 16:00 Tue 12:30 Sat 12:00 

Update: Die folgende benutzerdefinierte Abfrage, die die wp_query-function nicht verwendet, hat den Trick ausgeführt:

 $querystr = " SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta1, $wpdb->postmeta wpostmeta2 WHERE wposts.ID = wpostmeta1.post_id AND wposts.ID = wpostmeta2.post_id AND wpostmeta1.meta_key = 'class_day' AND wpostmeta2.meta_key = 'class_start' AND wposts.post_type = 'courses' AND wposts.post_status = 'publish' ORDER BY wpostmeta1.meta_value ASC, wpostmeta2.meta_value ASC "; 

Update 2: Kleines Update auf den Code des ersten Updates. Ich habe AND wposts.post_status = 'publish' hinzugefügt AND wposts.post_status = 'publish' . Um zu verhindern, dass Entwürfe und andere Zustände angezeigt werden. So werden nur veröffentlichte Beiträge angezeigt und sortiert.

Solutions Collecting From Web of "Das Sortieren von Posts durch eine Metaabfrage mit zwei Schlüsseln schlägt fehl, während es als einzelne Abfragen getrennt ist"

Sie können nur nach 1 Metawert sortieren. Einige Posts (einschließlich dieser SE-Antwort ) schlagen vor, einen Filter hinzuzufügen, um die Reihenfolge zu ändern.

Fügen Sie der Datei function.php Ihres Themes eine function.php , die die Sortierreihenfolge ersetzt:

 function change_sort_order( $orderby ) { return str_replace('wp_posts.post_date', 'mt2.meta_value, mt1.meta_value', $orderby); } 

Dann benutze es wo du willst. Stellen Sie sicher, dass Sie den Filter entfernen, nachdem er verwendet wurde, damit er nicht mehr wirksam bleibt, wenn Sie damit fertig sind.

 $args = array( 'post_type' => 'courses', 'meta_query' => array( 'relation' => 'OR', array('key' => 'class_day'), array('key' => 'class_start') ) ); $the_query = new WP_Query( $args ); add_filter('posts_orderby','change_sort_order'); $loop = new WP_Query( $args ); remove_filter('posts_orderby','change_sort_order');