wake-up-neo.com

2 orderby in wp_query mit 2 benutzerdefinierten Feldern

Ich versuche, Hotels (Taxonomie, die ich erstellt habe) durch zwei 'orderby' mit wp_query anzuzeigen, aber ich bin nicht erfolgreich.

Das Ergebnis sieht so 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 "Reihenfolge nach" bezieht sich auf die Anzahl der Personen (die größte in der ersten) und die zweite "Reihenfolge nach" auf die Bewertung in Sternen (wenn also mehrere Hotels die gleiche Anzahl von Personen haben, das Hotel mit den größten Sternen) Bewertung wäre an erster Stelle).

Unter meinem Code. Ich habe versucht, ein Array innerhalb eines Arrays mit meta_query 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 :)

1
user2410522

Wenn Sie sich den Codex nach WP_Query ansehen, werden Sie feststellen, dass orderby KEIN GÜLTIGER PARAMETER FÜR EINEN meta_query IST, NOCH order IST UND TATSÄCHLICH AUCH NICHT meta_key .

Aber selbst wenn das geklärt wäre, ich glaube nicht, dass Sie das tun können, was Sie mit WP_Query versuchen. Ein meta_query ist ein WHERE-Klauselelement, das es zu einer Art Suche macht, und ich glaube nicht, dass Sie das wollen. Wenn für alle Ihre Posts diese Schlüssel festgelegt sind, kann EXISTS Ihnen einen Teil des Weges dorthin ermöglichen. Ohne einen dieser Schlüssel ist jedoch nichts ausgeschlossen. Etwas wie das:

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

Aber die Bestellung ist immer noch ein Problem und ich sehe keinen anderen Weg als einen Filter für posts_orderby.

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

Und alles zusammen ...

$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 wird nur funktionieren, wenn alle Ihre Beiträge diese meta_keys haben. Sie können den posts_joins verwenden, um sich selbst der Metatabelle anzuschließen, oder Sie können 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 unmittelbar nach der Ausführung der Abfrage entfernen. Wenn Sie das vermeiden möchten, werfen Sie einen Blick auf diese Antwort für eine andere Option oder machen Sie die Filter selbstentfernend ...

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