En optimisant les performances des sites Web WordPress volumineux, je cherche toujours à mettre en cache certaines parties du site Web, principalement (bien sûr) celles qui nécessitent beaucoup de requêtes/calculs.
Pour la mise en cache du menu WordPress, j'utilise généralement une fonction comme celle que j'ai postée comme réponse ici .
Cette fonction vérifie s'il existe un transitoire contenant le menu HTML et, s'il existe, fournit le code HTML du transitoire. S'il n'existe pas, le menu est construit et l'ensemble transitoire. Pour être propre, j'accroche également à wp_update_nav_menu
pour nettoyer le transitoire dès que le menu est enregistré, afin de toujours avoir la dernière version disponible.
Cette technique fonctionne très bien et améliore considérablement les performances, surtout si le menu contient beaucoup d'entrées.
Quelques mois après avoir développé cette méthode, je me suis heurté à un problème et je me sens stupide de ne pas y penser.
En fonction de la page appelée, wp_nav_menu
fournit un code HTML différent. current-menu-item
et des classes comme celles-là s’appliquent bien sûr aux menus.
Le problème est donc de savoir quel est le meilleur moyen de mettre en cache les menus tout en conservant les classes correctes disponibles pour chaque page spécifique.
ID
séparément, ce qui entraîne un certain chargement de base de données, si la page contient beaucoup de menusCependant, j'ai tendance à utiliser la deuxième option. Avez-vous des problèmes avec la mise en cache autant de HTML que de Transit?
Il n’existe pas de solution générique à ce problème: le même menu peut être affiché avec des lecteurs différents sur des pages différentes, ou des plugins modifient le menu sur certaines pages.
Vous pouvez étendre votre script pour évaluer les différences en un menu vierge et créer le code JavaScript nécessaire à la volée… et le mettre en cache également… pour chaque page.
Je ne pense pas que cela en vaille la peine. obtenir tous les cas Edge est un travail difficile, et le menu serait toujours différent pour les utilisateurs sans JavaScript (moteurs de recherche, erreurs de script non résolues, etc.).