Bonjour � tous,
J�ai besoin de votre expertise sur WordPress.
Je poss�de une petite boutique en ligne et j�aimerais ajouter un compteur pour afficher le temps restant avant la fin de la promotion.
J�ai donc programm� un compteur en PHP en utilisant le timestamp de la fin de la promo et celui de l�heure du serveur (je ne voulais pas qu�il soit c�t� client).
Cela donnait bri�vement (et de mani�re simplifi�e) quelque chose comme ceci :
Cela fonctionnait tr�s bien, sauf que� le cache a fait son apparition.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9 <script> var countPromo = parseInt("<?php echo $timestampPromo; ?>"); var nowInUTCMinus6 = parseInt("<?php echo $timestampNow; ?>"); var countdownfunction = setInterval(function () { var timer = countPromo - nowInUTCMinus6; document.getElementById("timer").innerHTML = timer; nowInUTCMinus6 = nowInUTCMinus6 + 1; }, 1000); </script>
La page �tait mise en cache avec les valeurs statiques, et du coup, quand l�utilisateur revenait sur la page, le cache prenait le relais, affichant non plus le compteur mis � jour, mais celui � la date de sa mise en cache.
Catastrophe ! D�autant plus que le cache joue un r�le important dans la performance de mon site, et je ne souhaite pas le d�sactiver.
J�ai donc d�cid� de revoir la conception de ce compteur.
Je me suis dit que la page produit pouvait �tre mise en cache, mais que je devais � externaliser � les valeurs du compteur.
J�ai donc cr�� une API qui retourne les deux timestamps pour un produit donn�.
J�ai modifi� le fichier functions.php en ajoutant ce code :
La page produit effectue donc un appel AJAX vers l�API pour r�cup�rer les donn�es.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 add_action('rest_api_init', function () { register_rest_route('custom/v1', '/counter/(?P<product_id>\d+)', array( 'methods' => 'GET', 'permission_callback' => '__return_true', 'callback' => function ($data) { $product_id = $data['product_id']; $date_expire = get_field('date_fin_promo', $product_id); $date = new DateTime($date_expire); $date->setTimezone(new DateTimeZone('UTC')); $countDownDate = $date->getTimestamp(); $now = new DateTime('now', new DateTimeZone('UTC')); $nowInUTCMinus6 = $now->getTimestamp(); return new WP_REST_Response([ 'countDownDate' => $countDownDate, 'nowInUTCMinus6' => $nowInUTCMinus6, ], 200); }, )); });
Bien que je n�aie pas encore effectu� beaucoup de tests, cela semble fonctionner correctement !
J�aimerais avoir votre avis : pensez-vous que ma conception est judicieuse, ou voyez-vous une meilleure approche ?
Egalement, je rencontre un probl�me : c�est que mon h�bergeur bloque par d�faut les appels aux API WordPress sans authentification (pour les utilisateurs non connect�s). Je suis donc oblig� de d�sactiver la protection WordPress de mon h�bergeur (o2switch), car il n�y a pas d�option sp�cifique pour cela, afin que l�appel fonctionne.
Je suis un peu h�sitant, car je me demande si cela pourrait ouvrir la � porte de Pandore ��
Merci pour vos retours !
Partager