it-swarm.com.de

Aktualisierung der Admin-Einstellungen jedes Mal, wenn die Homepage aufgerufen wird?

Ich habe ein Plugin erstellt, das eine E-Mail mit allen Bestellungen an diesem Tag bis X Uhr an Y sendet. Ich habe das Tutorial hier verfolgt: https://scotch.io/tutorials/how-to-build-a- WordPress-Plugin-Teil-1

Bei jeder Optionsaktualisierung 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 zu stoppen. 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?

7
tjfo

Ein viel besserer Hook wäre der dynamische Hook update_option_ {option_name}, der nur ausgeführt wird, nachdem Ihre spezifische Option aktualisiert wurde. Also so etwas wie:

add_action('update_option_woocommerce_email_send_time', 'send_time')

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

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 jetzt zum Beispiel 15:40 Uhr ist und Sie den Versand der E-Mail um 13:00 Uhr planen, wird die E-Mail sofort gesendet, da diese Zeit bereits heute verstrichen 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 Transients) mit dem letzten Datum zu speichern, an dem die zusammenfassende E-Mail gesendet wurde, und diesen Wert dann vor dem Versenden der E-Mail zu überprüfen. Sobald die E-Mail gesendet wurde, würde ich diese Transiente mit dem aktuellen Datum aktualisieren.

Verweise:

update_option function - https://developer.wordpress.org/reference/functions/update_option/

1
Shawn H