Une offre limitée avec un shortcode

J'ai eu à construire une petite astuce sans prétention que j'aimerais partager avec vous aujourd'hui. L'idée est de permettre au rédacteur du post d'utiliser un shortcode pour écrire une offre limitée dans le temps.

Pourquoi un shortcode?

Cela m'a paru l'outil le mieux adapté. C'est souple et paramétrable et le code qui va suivre montre qu'il n'y aura pas besoin d'aller mettre à jour le post. J'ai donc utilisé une vielle astuce, enfin sur le principe, que j'avais montrée en screencast : Date de péremption dépassée?. Je vais donc intégrer la date de publication du post en référence et partir de là pour établir une durée limitée.

MAJ  du 02/03/2014

Cette MAJ utilise donc la classe DateTime() de PHP pour un calcul plus fin et donc une portée plus importante du code c'est à dire tenant compte des décalages de temps tels qu'heure d'été/heure d'hiver : voir le commentaire de JB PS : aidez-vous de ce lien aussi si vous devez utiliser la classe DateTime.
add_shortcode( 'limited', '_jm_limited_offer' );
function _jm_limited_offer( $atts, $content = null ) {
extract(shortcode_atts(array(
'interval' => 1,
'text' => 'La promo est terminée'
), $atts, 'jmlo_shortcode'));
//quelques vars
global $post;
$current = current_time("c");
$post_time = get_the_time("c", $post->post_date);
$d1 = new DateTime( $post_time );
$d2 = new DateTime( $current );
$iv = $d2->diff($d1);
//verif et nettoyage des params
$interval = ( is_int($interval) ) ? $interval : 1 ;// on vérifie qu'on a pas n'importe quoi de rentré dans le param
//L'intervalle en jours avec la classe DateTime() de PHP (merci à jb)
$diff = $iv->format('%d');
//résultat
return $limited = ( $diff < $interval ) ? do_shortcode($content) : $text;
}

Utilisation

Il suffira pour l'utiliser d'écrire ceci dans les posts pour une offre d'une durée de 2 jours:
[limited interval="2" text="Vous avez raté l'offre exceptionnelle!"]Offre exceptionnelle ![/limited]

Conclusion

Une technique simple mais qui peut servir je pense. Qu'en pensez-vous?

6 réponses à “Une offre limitée avec un shortcode”

  1. jb dit :

    Une journée ne fait pas forcément 24 heures (certaines comportent 23 ou 25 heures). Si tu veux calculer un intervalle en nombre de jours tu dois utiliser la classe DateTime() et pas le nombre de jours * 24 heures.

    • Julien Maury dit :

      Salut JB, bienvenue sur le blog :D. Encore une journée où j'apprends quelque chose (je sais c'est triste mais je ne le savais pas). D'ailleurs le coup des 25 heures m'échappe. Tu peux m'expliquer ?

    • Julien Maury dit :

      EDIT1: on pourrait passer par

       strtotime('+'.$interval.' day', $post_time); 

      EDIT2: ok je vois ce que tu veux dire enfin je crois :

      $date = new DateTime();
      $date->setTimestamp($post_time);
      • jb dit :

        Oui tu peux passer par l'ancienne API (Date/strtotime, etc) ou utiliser DateTime. Cette dernière est juste plus moderne, pratique et unifiée et c'est aussi plus facile de l'étendre pour créer sa propre classe de manipulation des unités de temps. Mais les anciennes fonctions marchent très bien aussi. :)

        Pour les journées qui ne font pas toutes 24 heures cela peut être du aux passages à l'heure d'été ou à l'heure d'hiver dans certains pays ou encore aux secondes intercalaires. L'API de manipulations des dates en PHP se charge de gérer tout ça pour toi.

      • jb dit :

        Oui, si tu veux rajouter 2 jours par exemple tu fais simplement : $date->add(new DateInterval('P2D'));