Bestellung nach DESC, ASC in benutzerdefiniertem WP_Query

8

Ich muss in einer Abfrage mehrstufig bestellen. Das Problem besteht darin, einen Wert DESC und den anderen ASC wie in SQL zu bestellen. Das folgende SQL scheint mir zu geben, was ich will, wenn ich es im Terminal ausführe:

SELECT DISTINCT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON wp_posts.ID = wp_postmeta.post_id 
WHERE wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'pb_issue_featured'
AND wp_posts.post_status = 'publish' 
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;

Das pb_issue_featuredist ein boolescher Wert. Das Endergebnis, das ich benötige, ist die Abfrage, um Beiträge mit einem Metawert von 1 für dieses Feld oben und alle anderen unten anzuzeigen. Dann ist die Bestellung der zweiten Ebene die festgelegte menu_order(ich verwende das Post-Typ-Bestell-Plugin).

Das Problem ist, dass mein boolescher Wert hoch bis niedrig (1 bis 0) geordnet werden muss, aber die menu_order ist das Gegenteil. Was zuerst mit dem Plugin bestellt wird, hat eine Menüreihenfolge von 1. Die Verwendung des in WP_Query integrierten 'orderby' funktioniert also nicht. Hat jemand Vorschläge? Ich habe in den Filter 'posts_orderby' geschaut, konnte ihn aber nicht ausführen. Ich war mir nicht sicher, wo es angewendet werden sollte oder wie ich es beheben könnte. Es hat einfach nicht so bestellt, wie ich es hatte.

Danke für die Hilfe! Ich werde die aktuelle WP_Query veröffentlichen, wenn sie relevant ist, aber ich wollte dies so kurz wie möglich halten.

Die Abfrage argumentiert:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'post_status' => 'publish',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );
$q = new WP_Query($args);
Ian
quelle
Nun, Sie sollten die WP_Query posten, um zu sehen, ob sie richtig gebildet ist.
Marin Bînzari
Da ist es in seiner ganzen Pracht. Ich bestelle derzeit nur nach diesem booleschen Metawert b / c. Dies war der einzige Weg, um dieses Level oder diese Sortierung zum Laufen zu bringen. Die Website verwendet auch "Überschriften" -Postings, die Vorrang vor "vorgestellten" Posts haben. So schließe ich sie in dieser Abfrage
ian

Antworten:

19

Versuche dies:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'paged' => 1,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );

add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_query' );

function filter_query( $query ) {
    $query .= ', wp_posts.menu_order ASC';
    return $query;
}
Marin Bînzari
quelle
Wie ein Chef Spartakus. Vielen Dank für die präzise und genaue Antwort. Dies funktionierte wie ein Zauber
ian
1
Sie können auch ein Array in der Reihenfolge nach Klausel (WP 4.0 und neuer) verwenden
Blueriver