Das Update der Admin-Einstellungen wird jedes Mal aktualisiert, wenn die Startseite aufgerufen wird.

7

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?

tjfo
quelle
Sie fügen eine Aktion hinzu admin_init, mit der ein Ereignis gelöscht und geplant wird (letzte Zeile Ihres zweiten Codeblocks). admin_initWird beim Laden der Seite im Admin-Bereich ausgelöst , nicht bei einem Optionsupdate.
Andrew Bartel
Hey Andrew, das war es, was ich dachte, aber ich konnte nicht herausfinden, was es sein sollte. Ich habe versucht, Dinge zu ändern und daraus ein "options_updated" zu machen, aber ohne Erfolg. Am Ende habe ich die Boilerplate entfernt, um den Code zu vereinfachen. Das Boilerplate war für dieses einfache Plugin sowieso übertrieben. Am Ende habe ich die Optionen, die ich definiert hatte, hart codiert, was ich nicht liebe, aber zumindest funktioniert es. Ich hoffe, dass ich darauf zurückkommen und eine bessere Lösung finden kann.
tjfo
Wie bist du mit diesem @tjfo umgegangen? Haben Sie eine bessere Lösung gefunden?
Tim Malone
Hallo @ TimMalone! Ich bin nie darauf zurückgekommen. Es bestand kein großer Bedarf, die Einstellungen konfigurierbar zu machen, da sie sich nicht sehr oft, wenn überhaupt, ändern sollten. Ich könnte es versuchen, nachdem ich das nächste Projekt abgeschlossen habe, an dem ich arbeite, nur um meine Neugier zu befriedigen!
tjfo
@tjfo Keine Sorge. Lassen Sie uns wissen, wie es Ihnen geht - Sie können hier eine Selbstantwort posten, wenn Sie es herausfinden :)
Tim Malone

Antworten:

1

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:

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 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/

Shawn H.
quelle