web-dev-qa-db-fra.com

On-the-Time-to-User Administrator

J'ai créé un plugin qui envoie un courrier électronique à toutes les commandes passées ce jour-là par X heure. J'ai suivi le tutoriel ici: https://scotch.io/tutorials/how-to-build-a- wordpress-plugin-part-1

À chaque mise à jour des options, il supprime tous les événements planifiés et en ajoute de nouveaux. Pour une raison que je ne comprends pas, le courrier électronique est envoyé chaque fois que quelqu'un connecté en tant qu'administrateur accède à la page d'accueil. Une fois que je modifie et enregistre les paramètres, cela semble s’arrêter. Voici ce que je pense est le code pertinent:

public function options_update() {
    register_setting($this->plugin_name, $this->plugin_name, array($this, 'validate'));
    wp_clear_scheduled_hook('send_woocommerce_daily_order_summary_email');
    $options = get_option($this->plugin_name);
    $timestamp = strtotime($options['send_time'] . ":00:00 " . get_option('timezone_string'));
    wp_schedule_event($timestamp, 'daily', 'send_woocommerce_daily_order_summary_email');
}

Et où l'action est ajoutée:

private function define_admin_hooks() {
    $plugin_admin = new Woocommerce_Daily_Order_Summary_Email_Admin( $this->get_plugin_name(), $this->get_version() );

    $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
    $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );

    // Add menu item
    $this->loader->add_action( 'admin_menu', $plugin_admin, 'add_plugin_admin_menu' );

    // Add Settings link to the plugin
    $plugin_basename = plugin_basename( plugin_dir_path( __DIR__ ) . $this->plugin_name . '.php' );
    $this->loader->add_filter( 'plugin_action_links_' . $plugin_basename, $plugin_admin, 'add_action_links' );

    // Save/Update our plugin options
    $this->loader->add_action('admin_init', $plugin_admin, 'options_update');
}

Quelqu'un peut-il m'aider à comprendre pourquoi cela pourrait se produire?

7
tjfo

Un hook bien meilleur à utiliser serait le hook dynamique update_option_ {option_name}, qui ne s'exécutera qu'après la mise à jour de votre option spécifique. Donc, quelque chose comme:

add_action('update_option_woocommerce_email_send_time', 'send_time')

function update_send_time() {
     // Add code here to update cron job
}

Le seul problème que vous aurez ici est que la planification de la tâche cron pour une heure antérieure à l'heure actuelle déclenche son envoi immédiat. Par exemple, s'il est 15 h 40 pour le moment et que vous planifiez l'envoi du courrier électronique à 13 heures, il sera envoyé immédiatement, car l'heure est déjà passée. Si vous l'aviez programmé pour 17 heures, il attendrait jusqu'à 17 heures. Avoir un sens?

Ce que je ferais probablement serait de stocker une autre valeur (probablement avec WordPress Transients) avec la dernière date d'envoi du courrier électronique de résumé, puis de vérifier cette valeur avant d'envoyer le courrier électronique. Une fois l'e-mail envoyé, je mettrais à jour ce transitoire avec la date du jour.

Références:

update_option function - https://developer.wordpress.org/reference/functions/update_option/

1
Shawn H