2 orderby in wp_query mit 2 benutzerdefinierten Feldern

Ich triyng, um Hotels (Taxonomie, die ich erstellt habe) durch zwei “orderby” mit wp_query anzuzeigen, aber ich bin kein Erfolg.

Ergebnisse sehen wie folgt aus:

Hotel 1 : 2 persons 5 stars Hotel 2 : 2 persons 4 stars Hotel 3 : 2 persons 3 stars Hotel 4 : 3 persons 5 stars Hotel 5 : 5 persons 5 stars Hotel 6: 10 persons 2 stars Hotel 7: 10 persons 1 star 

Die erste “Ordnung nach” ist die Anzahl der Personen (die größte in der ersten) und die zweite “Reihenfolge nach” ist auf der Bewertung in Sternen (also, wenn mehrere Hotels die gleiche Anzahl von Personen haben, das Hotel mit den größten Sternen Bewertung wäre zuerst).

Unter meinem Code. Ich habe versucht, ein Array innerhalb eines Arrays mit Meta-Abfrage hinzuzufügen, aber es funktioniert nicht.

 $args= array( 'post_type' => 'hotel', 'Services' => $Services, 'Town' => $Town, 'meta_key' => 'Number_persons', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'meta_query' => array( array( 'meta_key' => 'Rating', 'orderby' => 'meta_value', 'order' => 'DESC', ) ) ); $the_query = new WP_Query( $args ); 

Danke vielmals 🙂

Solutions Collecting From Web of "2 orderby in wp_query mit 2 benutzerdefinierten Feldern"

Wenn Sie sich den Codex für WP_Query Sie feststellen, dass orderby weder ein gültiger Parameter für eine meta_query noch eine order , und tatsächlich auch kein meta_key .

Aber selbst wenn das erledigt wäre, glaube ich nicht, dass du das tun kannst, was du mit WP_Query machen WP_Query . Eine meta_query ist ein WHERE Klausel-Element, was es zu einer Art Suche macht und ich glaube nicht, dass Sie das wollen. Wenn bei allen Posts diese Schlüssel gesetzt sind, kann EXISTS einen Teil des Weges dorthin bringen, aber es würde alles ohne einen dieser Schlüssel ausschließen. Etwas wie das:

 'meta_query' => array( array( 'key' => 'Rating', 'compare' => 'EXISTS' ), array( 'key' => 'Number_persons', 'compare' => 'EXISTS' ) ) 

Aber Ordnung ist immer noch ein Problem und ich sehe keinen anderen Weg als einen Filter auf posts_orderby .

 function double_meta_posts_orderby($orderby) { global $wpdb; return " {$wpdb->postmeta}.meta_value, mt1.meta_value"; } 

Und alles zusammenfügen …

 $args = array( 'post_type' => 'hotel', 'Services' => $Services, 'Town' => $Town, 'meta_query' => array( array( 'key' => 'Number_persons', 'compare' => 'EXISTS' ), array( 'key' => 'Rating', 'compare' => 'EXISTS' ), ) ); add_filter('posts_orderby','double_meta_posts_orderby'); $query = new WP_Query( $args ); remove_filter('posts_orderby','double_meta_posts_orderby'); 

Auch das funktioniert nur, wenn alle deine Beiträge diese Meta-Schlüssel haben. Sie könnten die posts_joins , um sich der Meta-Tabelle selbst anzuschließen, oder Sie könnten einfach die WHERE Klausel mit … entfernen.

 function kill_where($where) { return ''; } add_filter('posts_where','kill_where'); 

Beachten Sie, dass Sie die Filter hinzufügen und sofort nach der Ausführung der Abfrage entfernen. Wenn Sie die Notwendigkeit vermeiden möchten, casting Sie einen Blick auf diese Antwort für eine andere Option, oder machen Sie die Filter selbst entfernen …

 function double_meta_posts_orderby($orderby) { remove_filter('posts_orderby','double_meta_posts_orderby'); global $wpdb; return " {$wpdb->postmeta}.meta_value, mt1.meta_value"; }