As configurações de Admin atualizam a atualização toda vez que a página inicial é acessada?

8

Eu criei um plug-in que envia um e-mail com todos os pedidos feitos naquele dia por X para o e-mail Y. Eu segui o tutorial aqui: enlace

Em cada atualização de opções, ele remove todos os eventos agendados e adiciona novos. Por alguma razão que eu não entendo, o e-mail está enviando sempre que alguém logado como administrador acessa a página inicial. Depois de alterar e salvar as configurações, pare de funcionar. Aqui está o que eu acho que é o 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');
}

E onde a ação é adicionada: '

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

Alguém pode me ajudar a entender por que isso pode estar acontecendo?

    
por tjfo 26.05.2016 / 03:15

1 resposta

1

Um gancho muito melhor para usar seria o gancho dinâmico update_option_ {option_name}, que só é executado após sua opção específica ter sido atualizada. Então, algo como:

add_action('update_option_woocommerce_email_send_time', 'send_time')

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

O único problema que você obterá aqui é que o agendamento do cron job por um tempo anterior ao horário atual o acionará para enviar imediatamente. Por exemplo, se for às 3:40 da tarde, e você programar o e-mail para ser enviado às 13h, ele será enviado imediatamente porque esse horário já passou hoje. Se você agendou para 17:00, seria esperar até às 17:00. Faz sentido?

O que eu provavelmente faria é armazenar outro valor (provavelmente usando o WordPress Transients) com a última data em que o email de resumo foi enviado e, em seguida, verificar esse valor antes de enviar o email. Depois que o e-mail for enviado, atualizarei esse transiente com a data atual.

Referências:

função update_option - enlace

    
por Shawn H 16.09.2017 / 21:42