Ich habe ein Plugin erstellt, das eine E-Mail mit allen an diesem Tag bis X Uhr aufgegebenen Bestellungen an Y sendet. Ich habe das Tutorial hier befolgt: https://scotch.io/tutorials/how-to-build-a-wordpress- Plugin-Teil-1
Bei jedem Optionsupdate werden alle geplanten Ereignisse entfernt und neue hinzugefügt. Aus irgendeinem Grund, den ich nicht verstehe, wird die E-Mail gesendet, wenn jemand, der als Administrator angemeldet ist, auf die Startseite gelangt. Sobald ich die Einstellungen ändere und speichere, scheint es anzuhalten. Folgendes ist meiner Meinung nach der relevante Code:
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');
}
Und wo die Aktion hinzugefügt wird: `
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');
}
Kann mir jemand helfen zu verstehen, warum dies passieren könnte?
admin_init
, mit der ein Ereignis gelöscht und geplant wird (letzte Zeile Ihres zweiten Codeblocks).admin_init
Wird beim Laden der Seite im Admin-Bereich ausgelöst , nicht bei einem Optionsupdate.Antworten:
Ein viel besserer Hook wäre der dynamische Hook update_option_ {option_name}, der erst ausgeführt wird, nachdem Ihre spezifische Option aktualisiert wurde. Also so etwas wie:
Das einzige Problem, das Sie hier bekommen, ist, dass das Planen des Cron-Jobs für eine Zeit vor der aktuellen Zeit das sofortige Senden auslöst. Wenn es beispielsweise gerade 15.40 Uhr ist und Sie den Versand der E-Mail um 13.00 Uhr planen, wird sie sofort gesendet, da diese Zeit bereits heute abgelaufen ist. Wenn Sie es für 17 Uhr planen, würde es bis 17 Uhr warten. Sinn ergeben?
Was ich wahrscheinlich tun würde, ist, einen anderen Wert (wahrscheinlich unter Verwendung von WordPress-Transienten) mit dem letzten Datum zu speichern, an dem die zusammenfassende E-Mail gesendet wurde, und diesen Wert dann vor dem Versenden der E-Mail noch einmal zu überprüfen. Sobald die E-Mail gesendet wurde, würde ich diesen Übergang mit dem aktuellen Datum aktualisieren.
Verweise:
Funktion update_option - https://developer.wordpress.org/reference/functions/update_option/
quelle