it-swarm.com.de

Empfohlene Methode zum Löschen einer ausstehenden Abfrage (in pre_get_posts)?

Es sieht so aus, als würde die Kernabfrage eines E-Commerce-Plugins in einer bestimmten Vorlage für mich keinen Nutzen haben. Daher möchte ich sie vollständig zugunsten meiner eigenen WP_Query-Schleifen in der Vorlage verwerfen. Es ist nicht die Hauptabfrage, sondern ein sekundärer Aufruf von query_posts (), den ich nachgelagert verwerfen möchte.

wp remove query enthält einige gute No-Op-Vorschläge für reines SQL, aber was wäre eine empfohlene Methode, um einen dieser Vorschläge in diese spezifische $ query in pre_get_posts einzufügen ?

2
lkraav

Es gibt keine Möglichkeit, die Hauptabfrage zu stoppen. Es gibt viele Filter, um es zu ändern, nur nichts, um es vollständig auszuschalten. Das Beste, was Sie tun können, ist, sich in posts_request einzuklinken, der unmittelbar vor dem Treffer der Daten ausgelöst wird, und eine leere Zeichenfolge oder etwas Unsinniges zurückzugeben. Dies wird immer noch die Datenbank treffen.

Beispiel (ungetestet):

<?php
add_filter('posts_request', 'wpse83187_posts_request', 10, 2);
function wpse83187_posts_request($sql, $query)
{
    if (!$query->is_main_query() /* other conditionals here! */) {
        return;
    }

    return '';
}

Warum nicht einfach die Abfrage mit WP_Query komplett zurücksetzen, anstatt einen eigenen pre_get_posts in der Vorlage zu erstellen?

Verwenden Sie dann die "main" -Schleife für mindestens eine Ihrer WP_Query-Schleifen. Bis viel später werden keine Datenbankzugriffe ausgeführt, sodass der einzige "verschwendete" Aufwand darin besteht, Abfragevariablen mit WP zu füllen. WP_Query hat eine Methode namens init, die im Grunde alles zurücksetzt. Rufen Sie es auf und legen Sie die gewünschten Abfragevariablen fest. Dann müssen Sie parse_query erneut aufrufen, um die verschiedenen Bedingungen einzurichten.

<?php
add_action('pre_get_posts', 'wpse83187_reset_q');
function wpse83187_reset_q($query)
{
    if (!$query->is_main_query() /* other conditionals here! */) {
         return;
    }

    $query->init();

    // reset query vars here. eg:
    $query->set('post_type', 'product');

    // re-run validation and conditional set up.
    $query->parse_query();
}
3
chrisguitarguy