web-dev-qa-db-fra.com

Comment enregistrer de nouveaux transitoires si la requête change?

J'utilise WP REST API pour extraire des articles de blog sur un autre site. Tout fonctionne très bien, mais je dois maintenant enregistrer les résultats dans des éléments transitoires pour éviter d'interroger le blog à chaque fois. Je suis nouveau sur les transitoires, mais aussi sur WP REST api, je cherche donc le moyen correct/le meilleur moyen de procéder.

J'ai une fonction get_blog_posts_by_tags ($ tags) qui utilise l'API WP REST pour récupérer les publications. Une fois que j'ai les résultats dans une variable, je règle le transitoire. Cependant, $ tags peuvent changer de page en page où ces publications sont affichées. Comment puis-je vérifier si la nouvelle requête API WP REST _ est identique/différente de celle déjà stockée dans le transitoire?

function get_posts_by_tags($tags){
    if(false === ($result = get_transient('rest-posts'))) {
        $args = array(
            'filter[orderby]' => 'date',
            'filter[posts_per_page]' => 4,
            'filter[order]' => 'DESC',
            'filter[post_status]' => 'publish',
            'filter[tag]' => $tags,
        );
        $url = 'http://blog.myblog.com/wp-json/posts';
        $url = add_query_arg($args,$url);
        $response = wp_remote_get($url);
        //Check for error
        if (is_wp_error($response)) {
            return sprintf( 'The URL %1s could not be retrieved.', $url);
        }
        //get just the body
        $data = wp_remote_retrieve_body($response);
        //return if not an error
        if (!is_wp_error($data)){
          //decode and return
          $result = json_decode( $data );
          set_transient('rest-posts', $result,24 * HOUR_IN_SECONDS);
        }
    }
    return $result;
}

J'ai envisagé de stocker la requête API WP dans un autre transitoire, puis d'utiliser get_transient () à chaque fois et de vérifier si le contenu transitoire (la requête query wp api) correspond à la nouvelle requête wp api. Mais cela semble un peu superflu et je ne suis pas sûr que ce soit la meilleure approche.

3
gdaniel

Selon le code dans OP, la seule chose qui change le résultat est la variable $tags.

Dans ce cas, la meilleure façon de faire est de faire du $tags une partie du nom du transitoire.

function get_posts_by_tags($tags){

    $transient = 'rest-posts-' . md5(serialize($tags));

    if(false === ($result = get_transient($transient))) {

          // the rest of yout function here ...

          if (!is_wp_error($data)){
             $result = json_decode( $data );

             set_transient($transient, $result, 24 * HOUR_IN_SECONDS);
          }   
    }

    return $result;
}

Donc, pour chaque $tags, il y a un transitoire.

Si différentes pages produisent le même $tags, elles interrogeront (et stockeront) le même transitoire et tout devrait fonctionner comme prévu.

1
gmazzap