web-dev-qa-db-fra.com

Mise en cache WordPress - API Transients ou Cronjob "update_user_meta"?

J'essaie de définir la méta utilisateur en fonction des requêtes. Fondamentalement, des choses comme SI la requête retourne vrai, définissez ceci ou sinon, définissez ceci (ou ne le définissez pas, si c'est vrai). Cela fonctionne très bien, mais le problème est que je passe actuellement l'appel EVERTYIME pour vérifier si vrai ou faux, ce qui est mauvais et inutile, en particulier pour les types de requêtes que je fais (si c'est vrai, cela restera TOUJOURS vrai après).

Alors, comment devrais-je mettre en cache ces demandes? Dois-je le définir avec l'API WordPress Transient ou dois-je exécuter un travail cron pour qu'il s'exécute toutes les X heures, puis "update_user_meta" en fonction du résultat?

Je suis juste un peu perdu sur l'une ou l'autre approche et j'ai besoin de conseils sur le bon chemin pour cela. Merci!

1
Zach Reed

Bien que vos deux options (c'est-à-dire utiliser des transitoires ou un travail cron) soient viables, je suis plutôt fan de l'utilisation des transitoires, sauf si l'ensemble de données est exceptionnellement volumineux ou s'il est nécessaire d'automatiser le processus.

Sans voir une grande partie de votre code actuel, il est difficile de donner un exemple concret. Néanmoins, si vous finissez par emprunter la voie des passagers transitoires, je vous recommanderais quelque chose comme ceci:

// Now, check to see if the value is in the cache...
if( !( $our_data = get_transient($key) ) ) {

    // If not, then we'll check the user meta...
    if( !($our_data = get_user_meta($user_id, $key, true)) ) {

        // If not there, we create it and store it.
        $our_data = 'our data';
        update_user_meta($user_id, $key, $our_data);

    } // end if

    // And we unconditionally update the cache with an expiration of 1 day
    set_transient($key, $our_data, (60 * 60 * 24) );        

} // end if

De manière générale, le code ci-dessus fera ceci:

  • Vérifiez le cache pour voir si la valeur existe. Si la valeur est trouvée, alors rien d'autre ne sera exécuté; cependant, le cache expirera au bout de 24 heures et finira donc par .

  • Si la valeur ne se trouve pas dans le cache, nous vérifions les métadonnées de l'utilisateur. Si c'est là, nous l'utilisons; sinon, nous le créerons manuellement, puis mettrons à jour la méta de l'utilisateur. Si la méta de l'utilisateur n'a jamais été créée, WordPress l'ajoutera lors de l'exécution de la fonction update_user_meta .

  • Enfin, nous mettons inconditionnellement à jour le cache avec les données de la table méta ou avec ce qui a été créé manuellement.

Le seul problème avec le code ci-dessus est que si la méta de l'utilisateur n'est jamais mise à jour car la fonction ci-dessus utilise ce qui existe et ne la met à jour que si elle est nulle. Pour atténuer cela, je m'attendrais à:

  • Soit une autre fonction ailleurs dans votre base de code met à jour la valeur de l'utilisateur
  • Vous introduisez une autre condition pour déclencher la fonction de mise à jour.

Par exemple:

// Contrived. This could be a query, the result of another function, etc.
$user_should_be_updated = true;

if( $user_should_be_updated || !( $our_data = get_user_meta($user_id, $key, true) ) ) {
   /* Create the data, update the user */
} // end if

Le commentaire de Manny fournit également de bonnes informations, alors n'ignorez pas les réponses à cette question.

3
Tom

Il y a eu quelques bonnes réponses lorsque j'ai posé une question similaire il y a quelques mois ici

1
Manny Fleurmond