web-dev-qa-db-fra.com

Comment organiser et mettre en cache des données supplémentaires associées à des termes?

Je suis en train de mettre à jour un de mes plugins et j'ai du mal à trouver le "meilleur moyen" pour intégrer une fonctionnalité spécifique. Le plugin permet aux utilisateurs d'associer des images de leur médiathèque à n'importe quel terme de n'importe quelle taxonomie. Je travaille actuellement sur la création de fonctions que les utilisateurs peuvent ajouter à leurs thèmes et plug-ins pour récupérer les données stockées par le plug-in. Le code que j'ai jusqu'à présent peut être visualisé ici: https://github.com/mfields/Taxonomy-Images/blob/master/public-filters.php

La fonctionnalité présentée dans ce fichier permet aux utilisateurs d’obtenir l’image du terme actuellement interrogé (pour les vues d’archives de taxonomie) et une autre fonction est essentiellement un wrapper pour la fonction principale get_terms() qui renvoie tous les termes d’une taxonomie donnée tout en ajoutant l’identifiant d’image à chaque terme objet. J'aimerais ajouter une troisième fonction au fichier avant la publication. Ce serait un wrapper pour get_the_terms() et renverrait tous les termes associés à l'objet de publication global qui ont des images.

Je pensais à la modélisation de la fonction get_the_terms() après la fonction get_terms() qui intègre la mise en cache pour les fichiers image. Mais j'ai un peu peur de ce qui arriverait si cette fonction était utilisée dans la boucle de n'importe quel modèle d'archive.

Fondamentalement, le flux de travail ressemblerait à ceci:

  1. Obtenir toutes les associations image/terme (0 requêtes).
  2. Obtenez les termes associés à la publication globale: get_the_terms() (0 requêtes).
  3. Requête pour toutes les images associées aux termes (3 requêtes). Ceci est fait en créant une liste de tous les ID d'image et en les passant à get_posts() via le paramètre include.

IMHO c'est bien de faire dans des vues simples (single.php, page.php, etc.), mais que se passerait-il si un utilisateur devait utiliser cette fonction dans la boucle dans une vue d'archive? Vous devrez multiplier 3 requêtes (produites par get_posts()) par la valeur du paramètre publications par page (10 dans une installation WordPress par défaut). Nous en sommes maintenant à 30 requêtes au total. Ça devient un peu moche vite! Surtout si les utilisateurs veulent que les images de plus d'une taxonomie soient affichées. 2 taxonomies par publication ajouteraient 60 à ce que WordPress doit faire!

En gros, il y a quelques chemins à suivre et je voudrais savoir ce que vous feriez dans une situation comme celle-ci.

  1. Ne construisez pas la fonctionnalité du tout.

  2. Créez la fonction et informez les utilisateurs qu’un plug-in de mise en cache doit être installé s’ils utilisent get_the_terms () dans les vues d’archives.

  3. Construisez la fonction + créez une autre fonction qui mettra en cache toutes les images avant le chargement d'un modèle d'archive. Ce processus impliquerait quelque chose comme: Une fois que le tableau $posts a été généré (mais avant que le modèle ne soit chargé), parcourez toutes les publications du tableau en appelant get_the_terms () à chaque itération pour chaque taxonomie publique. La sortie de tous les objets de terme serait stockée dans un nouveau tableau. Ensuite, je pourrais déterminer quelles images sont associées à chaque terme de chaque taxonomie et transmettre les ID d’image à get_posts() en une seule fois. Cela permettrait à toutes les informations d'image d'être mises en cache pour être utilisées dans le modèle dans 3 requêtes au lieu de 30, 60 ou 90.

IMHO 3 semble être une solution logique, mais je ne sais pas vraiment si ce serait une anti optimisation ou non.

S'il vous plaît laissez-moi savoir vos pensées à ce sujet!

5
mfields

Je dirais que votre troisième option est la voie à suivre.

Incidemment, pourquoi avez-vous lancé votre propre cache statique dans taxonomy_image_plugin_get_associations() au lieu d'utiliser l'API WP_Cache intégrée pour cela? Y a-t-il une raison pour que wp_cache_get ne fonctionne pas ici? Il semblerait que l’utilisation du cache d’objets WP permettrait une meilleure optimisation lorsque les plug-ins de mise en cache sont activés.

1
goldenapples