J'ai une page d'accueil affichant le home.php
modèle, contenant 2 barres latérales avec des widgets.
La requête principale tire toujours dans les 10 publications standard, mais comme je ne les affiche pas, j'aimerais éliminer complètement la requête effectuée dans la base de données. Si besoin est, une boucle de message vide fera comme je n'utilise pas la boucle principale dans mon home.php
modèle.
Comment pourrais-je faire ça? Je pourrais utiliser pre_get_posts
pour minimiser et réduire la requête, mais cela me laisse encore une requête très rapide, comment puis-je l'éliminer complètement?
Réponses:
Le
posts_request
filtreEn parcourant le,
WP_Query
nous trouvons cette partie d'intérêt:Nous pourrions essayer d'éliminer la demande d'accueil principale via le
posts_request
filtre. Voici un exemple:où nous forçons la
'fields' => 'ids'
sortie anticipée.Le
posts_pre_query
filtre (WP 4.6+)Nous pourrions également utiliser le nouveau filtre
posts_pre_query
src disponible dans WordPress 4.6+Ce filtre permet d'ignorer les requêtes de base de données habituelles pour implémenter une injection de publications personnalisée à la place.
Je viens de tester cela et j'ai remarqué que cela n'empêchera pas les messages collants, contrairement à l'
posts_request
approche.Consultez le ticket # 36687 pour plus d'informations et l' exemple par @boonebgorges.
la source
WP_Query
tôt, par exemple à travers un argument comme'skip_query' => true
ou même à travers un filtre, mais je me rends compte à quel point cela pourrait facilement gâcher des sites sur Internet, donc plusieurs façons ;-) @TomJNowellsplit_the_query
juste en dessous des lignes, faites exactement la même chose mais je me demande qu'il ne réduit pas le nombre de requêtes!'fields' => 'ids'
, et je l'utilise beaucoup ;-)Voici une astuce intéressante que j'ai apprise de @birgire, nous pouvons arrêter la requête principale en ajoutant
AND where 0=1
à laWHERE
clause de la requête SQL. Cela peut toujours entraîner une seule requête db, mais cela empêchera sûrement la requête principale d'interroger les publicationsVous pouvez également essayer de remplacer la
WHERE
clause parwhere 0 = 1
au lieu de
Malheureusement, je n'ai pas le temps de tester quoi que ce soit, mais cela devrait être un bon point de départ
la source
$q->set( 'ignore_sticky_posts', true );
au cas où.Pour référence, avant: 45q, après: 42q
Le code est très similaire au code utilisé par @birgire
la source