web-dev-qa-db-fra.com

Réinitialiser le transitoire le nouveau jour

J'ai un plugin qui s'interface avec une API et stocke les données de planification extraites dans un transitoire .

Stockage du transitoire pendant 24 heures:

set_transient($schedule_cache, $schedule_data, 60 * 60 * 24);

Le problème (je pense) est le suivant: Pour quelles 24 heures est-il stocké? Je veux que TODAY soit affiché, mais si le transitoire a été réglé à 23h la nuit dernière lorsque quelqu'un a chargé la page, nous afficherons HIER jusqu'à 23h ce soir.

L’approche inélégante avec laquelle je travaille consiste à stocker un deuxième transitoire avec un identifiant unique TODAY:

$this::$time_tracker = date('Fd', strtotime("today")); # 'March30' 
set_transient($schedule_timer, $this::$time_tracker, 60 * 60 * 48);

Et ensuite, si le suivi temporel actuel ne correspond pas aux éléments transitoires, supprimez tous les éléments transitoires (il en existe d'autres pour la pagination):

if($last_look != $this::$time_tracker)
    // Delete all the transients and save new ones

Exemple de travail minimal:

class transientIssues {

    public function __construct(){
        $this::$time_tracker = date('Fd', strtotime("today"));
    }

        $schedule_cache = 'sched_che';
        $schedule_timer = 'sched_tim';

        $last_look = get_transient($schedule_timer);

        if ( $last_look != $this::$time_tracker ){
            // delete_transient( $schedule_cache );
            // Replaced above with the following so we could deal with multiple date ranges being called.
            global $wpdb;
            $wpdb->query( "DELETE FROM `$wpdb->options` WHERE `option_name` LIKE ('%sched_ch%' OR '%sched_tim%')" );
        }

        if ( false === get_transient( $schedule_cache ) ) {

            $api = $this->instantiate_API();
            if ($api == 'NO_SOAP_SERVICE') {
                pr($api);
                }else{
                $api->gettData(); 
                }

            set_transient($schedule_timer, $this::$time_tracker, 60 * 60 * 24);
            set_transient($schedule_cache, $schedule_data, 60 * 60 * 24);

             // END caching*/
        }
}

Cela vous semble-t-il une approche raisonnable? J'accepterais des idées.

2
MikeiLL

Il n’existe aucun moyen fiable d’atteindre ce que vous voulez avec l’API Transients - ou même, si vous l’avez envisagé, avec WP Cron système. Le problème est simple: ces systèmes d’API dépendent des entrées de l’utilisateur. Si vous voulez en savoir plus à ce sujet, faites une recherche, comme cela a été discuté à plusieurs reprises.
Pour avoir une solution fiable, vous pouvez utiliser le réel - le WP n’a pratiquement rien à voir avec cela et, dans mon esprit, il ne devrait même pas être appelé de la même manière, mais peu importe - Le système CRON et les tâches cron que vous pouvez configurer avec. Je n’entrerai pas dans les détails, car vous trouverez suffisamment d’informations de départ sur "Comment utiliser le véritable CRON avec WordPress" sur Internet. Comme @MarkKaplun l'a justement souligné, WP CRON et le CRON réel peuvent être utilisés conjointement pour atteindre votre objectif.

2
Nicolai