Ich habe eine Homepage, auf der die home.php
Vorlage angezeigt wird und die 2 Seitenleisten mit Widgets enthält.
Die Hauptabfrage zieht immer noch die Standard-10-Beiträge ein, aber da ich diese nicht anzeige, möchte ich die Abfrage, die an die Datenbank gesendet wird, vollständig entfernen. Bei Bedarf reicht eine leere Post-Schleife aus, da ich die Hauptschleife in meiner home.php
Vorlage nicht verwende.
Wie würde ich das machen? Ich könnte pre_get_posts
die Abfrage minimieren und reduzieren, aber das lässt mich immer noch mit einer sehr schnellen Abfrage zurück. Wie kann ich sie vollständig entfernen?
Antworten:
Der
posts_request
FilterBeim Durchblättern
WP_Query
finden wir diesen Teil von Interesse:Wir könnten versuchen, die Hauptanforderung über den
posts_request
Filter zu eliminieren . Hier ist ein Beispiel:wo wir die
'fields' => 'ids'
für die vorzeitige Ausfahrt erzwingen .Der
posts_pre_query
Filter (WP 4.6+)Wir könnten auch den neuen
posts_pre_query
src- Filter verwenden, der in WordPress 4.6+ verfügbar istDieser Filter ermöglicht es, die üblichen Datenbankabfragen zu überspringen, um stattdessen eine benutzerdefinierte Posts-Injection zu implementieren.
Ich habe dies gerade getestet und festgestellt, dass dies im Gegensatz zum
posts_request
Ansatz keine klebrigen Pfosten verhindert .Weitere Informationen und das Beispiel von @boonebgorges finden Sie im Ticket Nr . 36687.
quelle
WP_Query
früh zu beenden , z. B. durch einen Streit wie'skip_query' => true
oder sogar durch einen Filter, aber dann wird mir klar, wie leicht das Websites im Internet durcheinander bringen kann viele Möglichkeiten ;-) @TomJNowellsplit_the_query
direkt unter den Zeilen, machen Sie genau das Gleiche, aber ich frage mich, dass es die Anzahl der Abfragen nicht reduziert!'fields' => 'ids'
und ich benutze sie oft ;-)Hier ist ein netter Trick, den ich von @birgire gelernt habe. Wir können die Hauptabfrage anhalten, indem wir
AND where 0=1
an dieWHERE
Klausel der SQL-Abfrage anhängen . Dies kann immer noch zu einer Datenbankabfrage führen, verhindert jedoch sicher, dass die Hauptabfrage Beiträge abfragtSie können auch einfach versuchen, die
WHERE
Klausel durch zu ersetzenwhere 0 = 1
anstatt
Leider habe ich keine Zeit, etwas zu testen, aber dies sollte ein guter Ausgangspunkt sein
quelle
$q->set( 'ignore_sticky_posts', true );
für alle Fälle zu ignorieren .Als Referenz vor: 45q, nach: 42q
Der Code ist dem von @birgire verwendeten Code sehr ähnlich
quelle