Ich habe 3 Kategorien mit jeweils 15 Beiträgen. Ich möchte EINE Abfrage an die Datenbank senden und nur 5 erste Beiträge für jede Kategorie erstellen. Wie kann ich das tun?
$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));
Falls dies nicht möglich ist, was ist effizienter, wenn alle Beiträge für die übergeordnete Kategorie abgerufen und durchlaufen werden oder 3 verschiedene Abfragen erstellt werden?
query-posts
Amit
quelle
quelle
Antworten:
Was Sie wollen, ist möglich, erfordert jedoch, dass Sie sich mit SQL befassen, was ich nach Möglichkeit vermeiden möchte (nicht, weil ich es nicht weiß, ich bin ein fortgeschrittener SQL-Entwickler, sondern weil Sie in WordPress die API verwenden möchten, wann immer dies möglich ist um zukünftige Kompatibilitätsprobleme im Zusammenhang mit zukünftigen möglichen Änderungen der Datenbankstruktur zu minimieren.)
SQL mit einem
UNION
Operator ist eine MöglichkeitSo verwenden Sie SQL , was Sie brauchen ist ein
UNION
Operator in Ihrer Abfrage, so etwas wie dies sind Ihre Kategorie Schnecken unter der Annahme"category-1"
,"category-1"
und"category-3"
:Sie können SQL UNION mit einem
posts_join
Filter verwendenMit den oben genannten Informationen können Sie entweder einfach direkt anrufen oder einen
posts_join
Filter-Hook wie folgt verwenden. Hinweis: Ich verwende einen PHP-Heredoc. Stellen Sie daher sicher, dass der HeredocSQL;
bündig ist. Beachten Sie auch, dass ich eine globale Variable verwendet habe, damit Sie die Kategorien außerhalb des Hooks definieren können, indem Sie die Kategorie-Slugs in einem Array auflisten. Sie können diesen Code in ein Plugin oder in diefunctions.php
Datei Ihres Themas einfügen :Aber es kann Nebenwirkungen geben
Natürlich führt die Verwendung der Abfrageänderungs-Hooks wie
posts_join
immer zu Nebenwirkungen, da sie global auf Abfragen wirken. Daher müssen Sie Ihre Änderungen normalerweise in eine einbindenif
, die sie nur bei Bedarf verwendet und auf welche Kriterien getestet werden kann.Stattdessen auf Optimierung setzen?
Ich gehe jedoch davon aus, dass es bei Ihrer Frage mehr um Optimierung geht als darum, eine Top-5-Zeit-3-Abfrage durchführen zu können, oder? Wenn dies der Fall ist, gibt es vielleicht andere Optionen, die die WordPress-API verwenden?
Besser die Transienten-API für das Caching verwenden?
Ich gehe davon aus, dass sich Ihre Beiträge nicht so oft ändern werden, richtig? Was ist, wenn Sie die drei (3) Abfragetreffer regelmäßig akzeptieren und die Ergebnisse dann mithilfe der Transienten-API zwischenspeichern ? Sie erhalten wartbaren Code und eine hervorragende Leistung. Ein gutes Stück besser als die
UNION
obige Abfrage, da WordPress die Liste der Beiträge als serialisiertes Array in einem Datensatz derwp_options
Tabelle speichert .Sie können das folgende Beispiel verwenden und im Stammverzeichnis Ihrer Website
test.php
ablegen, um dies zu testen:Zusammenfassung
Ja, Sie können zwar das tun, wonach Sie gefragt haben, indem Sie eine SQL-
UNION
Abfrage und denposts_join
Filter-Hook verwenden, den Sie wahrscheinlich besser mit Caching mit der Transients-API anbieten .Hoffe das hilft?
quelle
WP_Query()
unterstützt nicht so etwas wie First X For Each Cat . StattdessenWP_Query()
können Sieget_posts()
für jede Ihrer Kategorien sozusagen dreimal verwenden:$posts
enthält jetzt die ersten fünf Beiträge für jede Kategorie.quelle
Ich kenne keine Möglichkeit, die ersten fünf Beiträge für jede der Kategorien in einer einzigen Abfrage abzurufen. Wenn Sie jemals nur 45 Beiträge haben werden, ist es wahrscheinlich der effizienteste Ansatz, einmal auf die Datenbank zuzugreifen und Ihre fünf Beiträge für jede Kategorie zu erhalten. Es ist jedoch keine schlechte Sache, dreimal auf die Datenbank zuzugreifen und die Ergebnisse zu kombinieren.
quelle