web-dev-qa-db-fra.com

Utiliser get_posts et WP_Query

J'utilise le PHP suivant: Code Sniffs sur du code WordPress, et l'avertissement suivant apparaît

 352 | WARNING | get_posts is discouraged in favor of creating a new
     |         | WP_Query() so that Advanced Post Cache will cache
     |         | the query, unless you explicitly supply
     |         | suppress_filters => false.

Bien que je sois un programmeur expérimenté, je ne connais pas très bien l’histoire de WordPress. Cet avertissement semble important, mais son libellé est maladroit. Je suis confus sur quelques points et d'autres réponses j'ai trouvé sur le sujet ne semblent pas répondre à mes points.

  1. Qu'est ce que le "Advanced Post Cache"? Je sais que WordPress (comme beaucoup d'applications PHP) gère la mise en cache à différents niveaux.

  2. Cet avertissement me dit-il que get_posts n'utilisera jamais le cache, mais WP_Query l'utilisera?

  3. Cet avertissement me dit-il que l'utilisation de suppress_filters avec WP_Query contournera le cache de publication avancée? Ou que l'utilisation de suppress_filters avec get_posts appellera le cache? Ou autre chose?

  4. Que fait d'autre suppress_filters?

Si quelqu'un de plus familier avec le sujet pouvait trouver des indices dans un newb WordPress, je l'apprécierais. Je ne cherche pas une réponse du type "toujours utiliser X, ou ne jamais utiliser Y" - j'essaie de comprendre les compromis de chaque approche.

5
Alan Storm

Ceci est directement lié à, et une conséquence de WordPress.com VIP

Chez VIP, nous traitons avec des sites qui comptent des centaines de millions de pages vues par semaine. En conséquence, les situations qui peuvent ralentir votre site sont beaucoup plus perceptibles à cette échelle que sur un petit hôte partagé, mais cela affecte tout de même un site avec un trafic modéré de l’ordre de 100 utilisateurs environ sur un VPS décent. Nous vérifions également tout le code avant qu'un code d'agence n'arrive en production

get_posts en particulier ne cache pas ses résultats. Si vous effectuez le même appel get_posts cinq fois, la base de données sera enregistrée cinq fois, au lieu d’enregistrer le résultat pour plus tard. WP_Query ne le fait pas, et la mise en cache y est bien meilleure, ainsi que d'autres optimisations qui ne sont pas possibles dans get_posts en raison de la façon dont elle renvoie la publication entièrement formée.

Il existe un moyen de faire en sorte que get_posts mette en cache les résultats. Cependant, l'option suppress_filters est true par défaut, mais si vous le définissez sur false, les mécanismes de mise en cache de WordPress fonctionnent et les résultats sont sauvegardés pour plus tard.

En ce qui concerne l'endroit où ils sont stockés, il existe un système de mise en cache des objets appelé WP_Cache. Par défaut, cela stockera tout ce que vous y avez mis et le gardera (n'allez pas implémenter votre propre cache pour éviter que le travail ne soit effectué plusieurs fois dans un chargement de page, WP vous a couvert!) .

Cependant, il existe des plugins qui fournissent advanced-cache.php ou object-cache.php, WP_Cache peut être rendu persistant. Par exemple, batcache obligera WP_Cache à utiliser memcached pour stocker des éléments, en laissant les données persistantes entre les chargements de page, ce qui améliorera considérablement les performances. Il existe des plugins similaires pour Redis/memcache/etc

Je vous recommande de consulter https://vip.wordpress.com/documentation/ , dont certaines sont spécifiques à la plate-forme WordPress.com VIP, mais d'autres sont importantes pour la performance et la sécurité. . Il existe également un outil de scanner VIP qui détecte d'autres éléments, tels que l'utilisation de fonctions non mises en cache.

9
Tom J Nowell