web-dev-qa-db-fra.com

Comment utiliser les transitoires et les variables

J'essaie d'implémenter des fragments transitoires, j'ai fait ce qui est suggéré ici: http://css-tricks.com/wordpress-fragment-caching-revisited/

Bien que cela fonctionne pour les en-têtes, les pieds de page et les pages de destination, je ne parviens pas à le faire fonctionner pour les sections contenant des variables.

Ceci est mon code dans functions.php:

function fragment_cache($key, $ttl, $function) {
  if ( is_user_logged_in() ) {
    call_user_func($function);
    return;
  }
  $key = apply_filters('fragment_cache_prefix', 'fragment_cache_').$key;
  $output = get_transient($key);
  if ( empty($output) ) {
    ob_start();
    call_user_func($function);
    $output = ob_get_clean();
    set_transient($key, $output, $ttl);
  }
  echo $output;
}

Et voici une version simplifiée de mon code sur une seule page (j'utilise des répéteurs Advanced Custom Fieds, mais je ne pense pas à ce problème):

while ( have_rows('images') ): the_row();
  fragment_cache('cms_images_text' . $post->ID, WEEK_IN_SECONDS, function() {
    $gallery_image = get_sub_field('image');
    $gallery_image_small = $gallery_image['sizes']['square-small'];
    echo '<img src="' . $gallery_image_small .  '">;
  });
endwhile;

Mon problème est que dans cette boucle while, on me renvoie quatre images identiques. Comment puis-je résoudre ce problème?

2
alemur

Vous sauvegardez les données dans une boucle sous la même clé pour chaque itération. Vous devrez ajouter l'index de l'itération actuelle de la boucle à la clé si vous voulez une valeur unique pour chaque. Quelque chose comme:

$i = 0;
while ( have_rows('images') ): the_row();
  fragment_cache('cms_images_text_' . $i . '_' . $post->ID, WEEK_IN_SECONDS, function() {
    $gallery_image = get_sub_field('image');
    $gallery_image_small = $gallery_image['sizes']['square-small'];
    echo '<img src="' . $gallery_image_small .  '">';
  });
  $i++;
endwhile;

Ou peut-être simplement sauvegarder le contenu de la boucle entière sous une seule clé.

2
Milo