Ich habe die integrierte WP-Suche mithilfe des pre_get_posts
Filters geändert, sodass der Benutzer die Beiträge (einschließlich einer Reihe benutzerdefinierter Beitragstypen) nach verschiedenen Feldern sortieren kann.
Das Problem, das ich habe, ist, dass wenn ich WP anweise, nach einem Meta-Wert zu sortieren, alle Posts ausgeschlossen werden, für die dieser Meta-Wert nicht festgelegt ist. Dies führt dazu, dass sich die Anzahl der Ergebnisse ändert, wenn Sie die Sortierung von "Preis" auf "Datum" ändern, da für "Beiträge" nicht "Preis" festgelegt ist, sondern "Artikel".
Dies ist nicht das, was ich will, also würde ich gerne wissen, ob es eine Möglichkeit gibt, ALLE Posts einzuschließen - auch diejenigen, denen der Meta-Wert fehlt, nach dem ich sortiere - und denjenigen ohne den letzten Wert zu setzen.
Ich weiß, wie man nach mehr als einem Feld sortiert, aber das hilft nicht.
Vielen Dank
Scheint, ich bin nicht der einzige mit dieser Frage: Wie kann ich Posts mit und ohne bestimmten meta_key in args for wp_query aufnehmen? aber da gibt es keine lösung.
Aktualisieren
Ich habe die Antwort ausprobiert, bin mir aber nicht sicher, ob ich sie richtig verstanden habe:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
Der Meta-Wert ist eine Zahl (er wird verwendet, um einen Preis zu speichern, wie der Name vermuten lässt.)
Update 2
Ich habe die Bestellung auskommentiert und alles, was ich jetzt habe, ist Folgendes:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Mit diesem Code scheint die Abfrage alle Posts zurückzugeben, bei denen der item_price
Schlüssel fehlt, und keinen der Posts, bei denen er vorhanden ist. IE das Problem ist jetzt umgekehrt.
Wenn ich auch den Bestellcode hinzufüge, erhalte ich 0 Ergebnisse.
Edit: ... drei Jahre später ... : PI hatte dieses Problem erneut. Ich habe alle Antworten ausprobiert und keine funktioniert. Ich bin mir nicht sicher, warum manche Leute glauben, dass sie funktionieren, aber sie arbeiten zumindest nicht für mich.
Die Lösung, die ich gefunden habe, ist die Verwendung des save_post
Filters - stellen Sie sicher, dass alle Beiträge das benutzerdefinierte Feld haben, nach dem ich sortieren möchte. Es ist ein bisschen nervig, dass ich es tun muss, aber solange Sie es früh tun, werden Sie wahrscheinlich keine Probleme haben.
In diesem Fall habe ich einen "View Counter" für Posts erstellt und wollte, dass Benutzer in der Lage sind, die am häufigsten gelesenen Posts zu sortieren. Auch hier sind Beiträge, die noch nie gesehen wurden (ich denke, das ist ziemlich unwahrscheinlich - aber immer noch), verschwunden, wenn nach Ansichtsanzahl sortiert wurde. Ich habe diesen Code hinzugefügt, um sicherzustellen, dass alle Beiträge eine Anzahl von Ansichten haben:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
und tax_query
sind immer ein, array( array() )
da sie mehrere Arrays kombinieren. Zweitens - wie in meiner Antwort erwähnt - müssen Sie meta_value_num
für Zahlen verwenden. Es kann genauso gut erforderlich sein, um den Eintrag tatsächlich zu definieren meta_value_num
(siehe WP_Query
-Codex-Seiteneintrag). Zuletzt macht es keinen Sinn, order
in ASC
und DESC
Richtung zu gehen. Das ist doch nicht möglich. Der Raumbegrenzer funktioniert nur für orderby
und Sie können ihm nicht sagen, dass er den ersten ASC
und den zweiten sortieren soll DESC
. Dafür ist posts_clauses
Filter da.
meta_value_num
Eingaben reelle Zahlen sind. Zu oft gesehen, dass jemand angibt, dass es sich um eine Zahl handelt, diese aber tatsächlich als Zeichenfolge in der Datenbank speichert.
ASC DESC
ist, dass es nach meinem Kenntnisstand nach meta_value
In ASC
und date
In sortiert DESC
.