Wenn ich auf einer Site mit vielen Posts arbeite, muss ich 3 Posts aus einer bestimmten Kategorie anzeigen, aber alle müssen aus den letzten 10 auf der Site veröffentlichten Posts stammen. Ich kann entweder 3 völlig zufällige Beiträge greifen (was dazu neigt, sehr alte Beiträge zu ziehen) oder 10 Beiträge greifen (aber ich weiß nicht, wie ich dann die Reihenfolge zufällig festlegen und nur 3 anzeigen soll).
Bisher habe ich diese Frage:
$args = array(
'post_type' => 'post',
'category_name' => 'mycategory',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC',
'meta_key' => '_thumbnail_id',
'no_found_rows' => 'true'
);
$query = new WP_Query( $args );
zusammen mit diesem Versuch, 3 zufällige Beiträge von den 10 abgefragten zu erhalten:
$randomPosts = shuffle( $query );
$randomPosts = array_slice( $randomPosts, 0, 3 );
Die Behandlung der Ergebnisse als Array funktioniert jedoch nicht, da es sich tatsächlich um ein Objekt handelt.
Mein einziger anderer Gedanke ist, 'posts_per_page' = 3
mit 'orderby' => 'rand'
3 zufällige Beiträge zu greifen und einen hinzuzufügen 'date_query'
, um ihn auf die letzten 6 Monate zu beschränken. Das wäre nah, aber es wäre vorzuziehen, die Abfrage auf die 10 neuesten Beiträge zu beschränken (sie können alle vor 3 Tagen oder vor 5 Monaten veröffentlicht werden, sie werden zusammen in ungleichmäßigen Schüben veröffentlicht).
Was ist der beste Ansatz?
Fragen Sie die 10 neuesten Beiträge ab, konvertieren Sie das Objekt dann in ein Array, mischen und schneiden Sie es und konvertieren Sie es zurück in ein Objekt. Gibt es eine einfachere und effizientere Möglichkeit, das Ziel zu erreichen?
WP_Query
einem Tippfehler oder ein hilfreicher Trick, den ich nicht kenne.Sie können natürlich alle Beiträge übernehmen und das Ergebnis mit PHP randomisieren, wie in dieser Antwort gezeigt . Sie können die Randomisierung auch mit SQL durchführen.
Behandlung der Randomisierung in der Datenbank:
Es gibt keine eingebaute WordPress-Funktion (oder kein Argument), um dies zu erreichen. Sie können jedoch den
posts_request
Filter verwenden, um die ursprüngliche SQL-Abfrage zu ändern, indem SieWP_Query
die Randomisierung allein aus der Datenbank erreichen.Sie können den folgenden CODE in der
functions.php
Datei des aktiven Themas oder als neues benutzerdefiniertes Plugin verwenden:Dann können Sie die Abfrage wie folgt verwenden:
Vergleichende Analyse:
Diese Methode bringt nur die maximale Anzahl von Posts, die von
_randomize_posts_count
aus der Datenbank definiert wurden , anstatt alle Ergebnisse und Randomisierungen auf PHP-Seite zu bringen. Daher ist es besser für die Datenkommunikation mit der Datenbank optimiert. Dies ist besser, wenn Ihr Datenbankserver von Ihrem Webserver getrennt ist.Wenn der Abfragecache nicht aktiviert ist , ist diese Lösung viel schneller, wenn der Unterschied zwischen der Anzahl der angezeigten zufälligen Beiträge und der Gesamtzahl der ausgewählten Beiträge groß ist. Beispiel: Wenn Sie 3 zufällige Beiträge aus den letzten 200 Beiträgen anzeigen, ist diese Methode viel schneller.
Wenn der Abfragecache aktiviert ist , ist die Methode von Birgire schneller, da spätere SQL-Anforderungen vermieden werden. Bei größeren Stichproben kann es jedoch immer noch langsamer sein, da Sie viele Informationen im Abfragecache speichern müssen.
Am besten, wenn Sie die Stichprobengröße sorgfältig abwägen und die Lösung auswählen, die besser zu Ihrem Anwendungsfall passt.
quelle
Großartige Arbeit von Fayaz und Birgire - viel erfahrener als ich es mir vorgestellt hätte - aber ich denke, es gibt einen einfacheren Weg, es sei denn, ich verstehe die Frage nicht (durchaus möglich!): 1) benutze get_posts () oder am einfachsten , wp_get_recent_posts (), die beide standardmäßig Arrays zurückgeben, akzeptieren WP Query $ args und verwenden standardmäßig no_found_rows = true, 2) mischen das Array, 3) schneiden dann drei ab.
Auf diese Weise habe ich ein ähnliches Problem für mich selbst gelöst, an einem Punkt, an dem ich so gut wie nichts verstanden habe, verglichen mit meinem derzeitigen Verständnis, wie nahe ich nichts verstanden habe. Der Code von Birgire und Fayaz ist jedoch cool, also zögern Sie nicht, mit dem einen oder anderen zu gehen!
quelle