plugin-development – ¿La configuración del administrador se actualiza cada vez que se accede a la página de inicio?

Pregunta:

He creado un complemento que envía un correo electrónico con todos los pedidos realizados ese día a las X en punto al correo electrónico Y. Seguí el tutorial aquí: https://scotch.io/tutorials/how-to-build-a-wordpress- complemento-parte-1

En cada actualización de opciones, elimina todos los eventos programados y agrega otros nuevos. Por alguna razón que no entiendo, el correo electrónico se envía cada vez que alguien que inicia sesión como administrador accede a la página de inicio. Una vez que cambio y guardo la configuración, parece que se detiene. Aquí está lo que creo que es el código relevante:

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');
}

Y donde se agrega la acción: `

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');
}

¿Alguien puede ayudarme a entender por qué podría estar pasando esto?

Respuesta:

Un gancho mucho mejor para usar sería el gancho dinámico update_option_ {option_name}, que solo se ejecuta después de que se haya actualizado su opción específica. Entonces algo como:

add_action('update_option_woocommerce_email_send_time', 'send_time')

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

El único problema que obtendrá aquí es que programar el trabajo cron por un tiempo antes de la hora actual lo activará para que se envíe de inmediato. Por ejemplo, si son las 3:40 p. M. En este momento y programa el envío del correo electrónico a la 1 p. M., Se enviará de inmediato porque esa hora ya pasó hoy. Si lo programó para las 5:00 p. M., Esperaría hasta las 5:00 p. M. ¿Tener sentido?

Lo que probablemente haría es almacenar otro valor (probablemente usando WordPress Transients) con la última fecha en que se envió el correo electrónico de resumen, y luego verificar ese valor antes de enviar el correo electrónico. Una vez que se envía el correo electrónico, actualizaría ese transitorio con la fecha actual.

Referencias:

función update_option – https://developer.wordpress.org/reference/functions/update_option/

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım