web-dev-qa-db-fra.com

Transitoires vs CRON + Champs personnalisés: mise en mémoire cache des données par publication

Je voulais des opinions sur une solution que j'essaie de trouver:

J'ai un plugin fan/enthousiaste sur lequel je travaille pour les fans d'émissions de télévision. L'un des types de publication personnalisés attachés au plug-in est un type de version qui stocke des données sur les versions dvd d'un spectacle. Certaines des métadonnées que je stockais sont des informations d'Amazon à l'aide de leur API de publicité produit. Je voulais mettre en mémoire cache certaines des données de tarification disponibles, telles que le prix actuel du DVD.

Je pensais utiliser des transitoires, mais d'après ce que je peux en dire, rien de plus qu'un calque sur WP options; leur trop global. Il me faudrait créer de nombreux transitoires avec un schéma de nommage qui indiquerait un certain post.

L'autre option consisterait à utiliser des champs personnalisés mais à utiliser l'API CRON pour le mettre à jour. Je demanderais soit à un travail Cron de mettre à jour tous les champs personnalisés toutes les heures, soit de créer un travail cron par publication.

Ma question est la suivante: quelle solution serait la plus pratique et la plus pratique?

1
Manny Fleurmond

Je pense que je voudrais écrire une fonction wrapper autour des champs personnalisés, quelque chose comme ceci:

function get_post_transient( $post_ID, $meta_key, $update_function ) {
    $current_value = get_post_meta( $post_ID, $meta_key, true );
    if ( is_array( $current_value ) && $current_value['expiration'] < date('U') )
        return $current_value['data'];

    $new_value = call_user_function( $update_function, $post_ID );
    update_post_meta( $post_ID, $meta_key, $new_value );

    return $new_value['data'];  

}

et enregistrez la méta en tant que tableau, de la forme:

array(
    'expiration' => //timestamp that this field exires
    'data' => // all the custom data you want to save.
);

Vous aurez juste besoin que votre fonction de mise à jour retourne la même structure de tableau. Je ne sais pas si cette approche présente un avantage réel par rapport à l'utilisation de la table d'options par le biais de transitoires, mais il serait plus logique que la méta-publication soit stockée dans la table postmeta.

3
goldenapples

Lors de la mise en œuvre de la mise en cache avec une API, j'ai utilisé la route transitoire. Principalement parce qu'ils sont conçus pour cela et faciles à utiliser. Il n'y a pas beaucoup de problèmes en termes de taille de table ou de requêtes. MySQL est fait pour les gros jeux de données.

Mon approche consistait à prendre un hachage de l'URL et/ou des arguments que je passais à l'API et à l'utiliser comme identifiant transitoire. La fonction qui établit la communication avec l'API commence par vérifier si le transitoire existe et s'il n'existe pas ou s'il a expiré, continue avec l'appel standard de l'API. Post meta a l’avantage de vous présenter une seule table et une clé que nous vérifions. C’est donc rapide, il n’a pas besoin de boucle ni de code complexe et l’API n’est appelée que lorsque le transitoire a expiré et lorsque les données sont demandées, ce qui devrait réduire le nombre d'appels à l'API que vous effectuez.

Fonctionne bien pour mes plugins flickr et themoviedb.org.

2
sanchothefat

S'il est connecté à un poste spécifique, il devrait être en postmeta. J'ai moi-même enfreint ce principe plusieurs fois pour des raisons de rapidité et de facilité d'utilisation, mais je me sentais sale à chaque fois. :)

La meilleure façon, à mon avis, serait plutôt de stocker les données et une date d'expiration dans postmeta. Au lieu de vérifier tous les types toutes les heures, vérifiez-les uniquement lorsqu'ils sont visualisés. Avantage majeur: vous pouvez le faire paresseusement!

Exemple:

Sur l'affichage de poste, la méta est tirée. S'il s'agit de données expirées, les données expirées sont affichées, mais un paramètre est laissé quelque part dans une variable globale (stockant uniquement l'identifiant de publication, probablement) indiquant à une autre partie du code d'actualiser ces données à la fin de l'affichage de la page.

Ensuite, vous utilisez le hook d’action "shutdown". Ici, vous allez vérifier cette variable globale et, si certaines données doivent être actualisées, vous devez extraire les données d'Amazon, mettre à jour le postmeta et retarder l'expiration par un certain laps de temps.

C'est le meilleur de tous les mondes, vraiment. La publication est toujours affichée rapidement et votre téléspectateur n'a pas à attendre que les nouvelles données proviennent d'Amazon. Les données Amazon sont actualisées une fois la page terminée. Et vous actualisez uniquement les données que les utilisateurs consultent, et uniquement lorsqu'ils les consultent, en minimisant le traitement.

2
Otto