Im Moment ist es nicht möglich.
Wenn ausgeführt 'pre_get_posts'
, ist es zu spät WP_Query
, um eine Abfrage durchzuführen.
Wenn Sie selbst versuchen, eine nicht vorhandene Taxonomie abzufragen, wird WordPress selbst AND (0 = 1)
zur WHERE
Klausel der SQL-Abfrage hinzugefügt, um sicherzustellen, dass sehr schnell keine Ergebnisse zurückgegeben werden ...
Es gibt ein Trac-Ticket mit einem Patch, der wahrscheinlich im Kern von WP 4.6 landen wird und einen neuen Filter einführt : 'posts_pre_query'
. Wenn Sie ein Array für diesen Filter zurückgeben, wird die WP_Query
Verarbeitung gestoppt und das bereitgestellte Array als Posts-Array verwendet.
Dies könnte Ihnen irgendwie helfen, das umzusetzen, was Sie versuchen zu tun.
Warten fot das, was Sie tun können , ist irgendwie hackish , der Trick selbst Kern nutzt auch ganz hackish ist.
Vor kurzem verwende ich einen Trick, wenn ich WordPress stoppen möchte, um Dinge zu tun, die ich nicht sauber stoppen kann: Ich löse eine Ausnahme und fange sie ab, um den Anwendungsfluss fortzusetzen.
Ich zeige Ihnen ein Beispiel. Beachten Sie, dass der gesamte Code hier vollständig ungetestet ist.
Schreiben wir zunächst eine benutzerdefinierte Ausnahme:
class My_StopWpQueryException extends Exception {
private $query;
public static forQuery(WP_Query $query) {
$instance = new static();
$instance->query = $query;
return $instance;
}
public function wpQuery() {
return $this->query;
}
}
Die Ausnahme dient als eine Art DTO zum Transportieren eines Abfrageobjekts, sodass Sie es in einem catch
Block abrufen und verwenden können.
Besser mit Code erklärt:
function maybe_cached_query(WP_Query $query) {
$cached_query = wp_cache_get($query->query_vars_hash, 'globals');
if ($cached_query instanceof WP_Query)
throw My_StopWpQueryException::forQuery($cached_query);
}
function cached_query_set(WP_Query $query) {
$GLOBALS['wp_query'] = $query;
$GLOBALS['wp_the_query'] = $query;
// maybe some more fine-tuning here...
}
add_action('pre_get_posts', function(WP_Query $query) {
if ($query->is_main_query() && ! is_admin()) {
try {
maybe_cached_query($query);
} catch(My_StopWpQueryException $e) {
cached_query_set($e->wpQuery());
}
}
});
Dies sollte mehr oder weniger funktionieren, es gibt jedoch viele Hooks, die Sie beispielsweise nicht "the_posts"
auslösen werden, und vieles mehr. Wenn Sie Code haben, der einen dieser Hooks zum Auslösen verwendet, wird dieser unterbrochen.
Sie können die cached_query_set
Funktion verwenden, um einige der Hooks auszulösen, die Ihr Theme / Plugin möglicherweise benötigt.