Ich habe die integrierte WP-Suche mithilfe des pre_get_postsFilters 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_priceSchlü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_postFilters - 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_queryund tax_querysind immer ein, array( array() )da sie mehrere Arrays kombinieren. Zweitens - wie in meiner Antwort erwähnt - müssen Sie meta_value_numfü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, orderin ASC und DESC Richtung zu gehen. Das ist doch nicht möglich. Der Raumbegrenzer funktioniert nur für orderbyund Sie können ihm nicht sagen, dass er den ersten ASCund den zweiten sortieren soll DESC. Dafür ist posts_clausesFilter da.
meta_value_numEingaben 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 DESCist, dass es nach meinem Kenntnisstand nach meta_valueIn ASCund dateIn sortiert DESC.
