管理员设置是否在每次点击主页时更新?

时间:2016-05-26 作者:tjfo

我创建了一个插件,可以将当天X点之前下的所有订单发送到电子邮件Y。我在这里遵循了教程:https://scotch.io/tutorials/how-to-build-a-wordpress-plugin-part-1

在每次选项更新时,它会删除所有计划的事件并添加新的事件。出于某种原因,我不明白,只要有人以管理员身份登录主页,就会发送电子邮件。一旦我更改并保存设置,它就会停止。以下是我认为相关的代码:

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\');
}
在添加操作的位置:`

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\');
}
有人能帮我理解为什么会发生这种情况吗?

1 个回复
SO网友:Shawn H

更好的钩子是update\\u option{option\\u name}动态钩子,它只在特定选项更新后运行。比如:

add_action(\'update_option_woocommerce_email_send_time\', \'send_time\')

function update_send_time() {
     // Add code here to update cron job
}
这里唯一的问题是,将cron作业调度到比当前时间早的时间将触发它立即发送。例如,如果现在是下午3:40,而您计划在下午1点发送电子邮件,则会立即发送,因为今天时间已经过去了。如果你把它安排在下午5点,它会一直等到下午5点。有意义吗?

我可能要做的是存储另一个值(可能使用WordPress瞬态)和摘要电子邮件的最后发送日期,然后在发送电子邮件之前再次检查该值。一旦发送电子邮件,我会用当前日期更新该瞬态。

参考文献:

update\\u option函数-https://developer.wordpress.org/reference/functions/update_option/

相关推荐

OOP development and hooks

我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private