Pour le moment, ce n'est pas possible.
Lors de l' 'pre_get_posts'
exécution, il est trop tard pour s'arrêter WP_Query
pour effectuer une requête.
WordPress lui-même, lorsque vous essayez d'interroger une taxonomie qui n'existe pas, s'ajoute AND (0 = 1)
à la WHERE
clause de la requête SQL, pour vous assurer qu'elle ne renvoie aucun résultat très rapidement ...
Il y a un billet de trac avec un patch qui sera probablement dans les terres avec noyau WP 4.6, qui introduit un nouveau filtre: 'posts_pre_query'
. Le renvoi d'un tableau sur ce filtre WP_Query
arrêtera le traitement et utilisera le tableau fourni comme tableau de publications.
Cela pourrait en quelque sorte vous aider à mettre en œuvre ce que vous essayez de faire.
En attendant, tout ce que vous pourriez faire est en quelque sorte piraté , le truc que le noyau lui-même utilise est également assez piraté.
Récemment, je commence à utiliser une astuce lorsque je veux arrêter WordPress pour faire des choses que je ne peux pas arrêter de manière propre: je lève une exception et la rattrape pour continuer le flux d'application.
Je vais vous montrer un exemple. Notez que tout le code ici n'est pas testé.
Tout d'abord, écrivons une exception personnalisée:
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;
}
}
L'exception est conçue pour agir comme une sorte de DTO pour transporter un objet de requête, de sorte que dans un catch
bloc, vous pouvez l'obtenir et l'utiliser.
Mieux expliqué avec le code:
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());
}
}
});
Cela devrait plus ou moins fonctionner, cependant, il y a beaucoup de hooks que vous n'allez pas tirer, par exemple "the_posts"
et bien plus encore ... si vous avez du code qui utilise l'un de ces hooks pour se déclencher, il se cassera.
Vous pouvez utiliser la cached_query_set
fonction pour déclencher certains des crochets dont votre thème / plugins peut avoir besoin.