web-dev-qa-db-ja.com

ホームページが表示されるたびに管理者設定の更新が更新される?

私は、その日に出されたすべての注文をEメールYにXで送るEメールを送るプラグインを作成しました。私はここでチュートリアルに従いました: https://scotch.io/tutorials/how-to-build-a -wordpress-plugin-part-1

オプションが更新されるたびに、スケジュールされているすべてのイベントが削除され、新しいイベントが追加されます。私が理解していないいくつかの理由で、管理者としてログインした誰かがホームページにアクセスしたときはいつでもEメールが送信されます。設定を変更して保存すると、停止したように見えます。これが私が関連するコードだと思うものです:

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

なぜこれが起きるのかを理解するのを手伝ってくれる人はいますか?

7
tjfo

もっと良いフックはupdate_option_ {option_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時まで待機します。理にかなって?

サマリーEメールが最後に送信された日付を別の値(おそらくWordPress Transientsを使用)に格納し、Eメールを送信する前にその値を再確認します。電子メールが送信されたら、現在の日付で一時的に更新します。

参考文献:

update_option関数 - https://developer.wordpress.org/reference/functions/update_option/

1
Shawn H