J'essaie d'utiliser WP Redis pour mettre en cache tout l' objet $ wp_query avec la clé est $ query_vars_hash .
Voici comment a $wp_query
été ajouté à $wp_object_cache
:
add_action('wp', function($wp)
{
if ( is_admin() ) return;
global $wp_query;
if ( !wp_cache_get($wp_query->query_vars_hash, 'globals') )
{
wp_cache_add($wp_query->query_vars_hash, $wp_query, 'globals');
}
});
Ensuite, je dois vérifier si une requête a déjà été mise en cache avant de WP_Query
pouvoir récupérer des messages:
add_action('pre_get_posts', function($query)
{
if ( is_admin() ) return;
$cached_query = wp_cache_get($query->query_vars_hash, 'globals');
if ($cached_query)
{
$GLOBALS['wp_query'] = &$cached_query;
return; // Return immediately to prevent retrieving posts again.
}
});
Problème :
return
ou exit
ne fonctionne pas dans ce cas. Ensuite, il WP_Query
atteindra toujours la base de données pour récupérer à nouveau les messages.
Question :
Quel que soit le plugin, est-il possible d'arrêter complètement la WP_Query
récupération des messages?
return
peut-être la seule commande que nous pouvons appeler dans ce cas.Réponses:
Pour le moment, ce n'est pas possible.
Lors de l'
'pre_get_posts'
exécution, il est trop tard pour s'arrêterWP_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)
à laWHERE
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 filtreWP_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:
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:
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.la source
do_action
devrait être entry
bloc.C'est une question PHP plus qu'une question WordPress.
Comme l'a commenté @Mark :
C'est vrai. Placer
return
dans la fonction signifie quitter la fonction et placer return dans un fichier PHP signifie quitter le fichier. Ne vous confondez pas avec la construction PHPexit()
: P (vous pourriez trouver une meilleure réponse sur SO à propos de PHPreturn
).Et pour répondre à votre question
Vous pouvez réduire la charge de requête en récupérant une seule colonne au lieu d'une table complète. Comme @birgire l'a fait ici Supprimer la requête de la page d'accueil
Peut-être une meilleure réponse à venir. Je viens de partager ce que je sais :)
la source
posts_request
filtre? Avec cette approche + colonne unique, nous quittonsWP_Query
plus tôt que l'utilisation duposts_pre_query
filtre .. Faites également attention aux messages collants avecposts_pre_query
mais nous pouvons le supprimer avec$q->set( 'ignore_sticky_posts', 1 );
par exemple l'exemple ici .posts_pre_query
n'aide pas. Votre solution est la meilleure jusqu'à présent. :) Si vous savez comment nous pouvons quitter la requête juste aprèspre_get_posts
, cela pourrait être parfait. Je vous remercie!posts_pre_query
sera disponible à partir du 4.6;)WP_Query
classe avec uneget_posts()
méthode personnalisée , avec un possible début précoce et qui appelleparent::get_posts()
et tente de remplacer la requête pertinente avec elle. Mais je ne sais pas si cela fonctionnerait ou aurait un sens avec votre cas ici ;-) @DanIl sera rendu possible en 4.6 (en supposant qu'il n'y ait aucun changement jusqu'à la sortie) avec le nouveau
posts_pre_query
filtre https://core.trac.wordpress.org/ticket/36687la source
Oui, c'est possible selon ce que vous voulez mettre en cache. J'ai fait une chose similaire pour mettre en cache la boucle principale sur notre page d'accueil. Essentiellement, vous pouvez utiliser
posts_request
etposts_results
pour détourner la requête et accéder au cache à la place, puis également utiliserfound_posts
pour corriger la pagination.Exemple vraiment grossier tiré de notre code (non testé) mais vous devriez vous aider à avoir l'idée:
Plus ici: https://www.reddit.com/r/Wordpress/comments/19crcn/best_practice_for_hijacking_main_loop_and_caching/
la source