WP cron: wann ein einmaliges Ereignis geplant werden soll

Ich habe einen benutzerdefinierten Post-Typ (‘my_cpt’) und nach save_post_my_cpt ich möglicherweise eine große Anzahl von Änderungen an anderen Posts vornehmen (abhängig vom Status des Posts, zB post_status, post_meta Werte und Terme aus der benutzerdefinierten Taxonomie). Diese anderen Änderungen müssen möglicherweise in anderen Blogs in einer Multisite vorgenommen werden. Daher kann die function save_post_my_cpt bis zu einer Minute dauern, bis die Ausführung abgeschlossen ist … was für den Admin-Benutzer, der die save_post_my_cpt , nicht sehr “benutzerfreundlich” ist.

Ich stelle Dinge auf, so dass diese anderen Änderungen über WP Cron geschehen. Also habe ich:

 add_action ('save_post_my_cpt', 'save_cpt') ; function save_cpt ($post_id) { if (defined ('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return ; } // do stuff related to saving post meta, etc // eg, update_post_meta ($post_id, '_some_meta_name', $_REQUEST['some_meta_name'], true) ; // schedule an event to do the modifications of other posts // see below for question related to the time this cron job will be scheduled $time = time () ; wp_schedule_single_event ($time, 'my_cron_hook', array ($post_id)) ; return ; } add_action ('my_cron_hook', 'cron_func') ; function cron_func ($post_id) { $post = get_post ($post_id) ; // get_blogs_that_might_need_to_be_modified() returns an array of blog_id's that // MIGHT have other posts related to $post that need to be modified // get_posts_in_that_blog_that_need_to_be_modified() returns an array of posts // related to $post that need to be modified // modify_post() returns a modified version of a related post based on the // current state of $post // the details of these functions aren't relevant to this question foreach (get_blogs_that_might_need_to_be_modified ($post) as $blog_id) { switch_to_blog ($blog_id) ; foreach (get_posts_in_that_blog_that_need_to_be_modified ($post) as $other_post) { $other_post = modify_post ($post) ; wp_update_post ($other_post) ; } restore_current_blog () ; } } 

Hoffentlich sind alle bis zu diesem Punkt bei mir. Meine Frage hat mit der Zeit zu tun, zu der ich diesen 1-Cron-Job einplanen sollte.

Wenn ich den Cron-Job “sofort” cron_func() (wie im obigen Code), kann ich sicher sein, dass bis zum cron_func() von cron_func() alle mit dem Speichern meines CPT verbundenen DB-Updates abgeschlossen sein werden (seit die in cron_func() aufgerufenen cron_func() müssen den modifizierten Zustand von $post_id ) lesen?

Die Planung des Ereignisses für die Ausführung “sofort” scheint in meiner lokalen Entwicklungsumgebung (wo ich als Einziger die Seite betritt) gut zu funktionieren.

Ich frage mich, ob ich wahrscheinlich Probleme haben werde, die Dinge so zu machen, wenn die Seite in einer Produktionsumgebung mit starker Aktivität läuft (dh mit einer Anzahl von Admin-Benutzern, die gleichzeitig Inhalte am Backend bearbeiten, während eine beträchtliche Anzahl von Ends) – Benutzer treffen das Frontend)

Zwei Alternativen, über die ich nachdenke:

  1. Fügen Sie time() einen Offset hinzu, wenn Sie das Ereignis planen?
    1. Bitten Sie es zum Beispiel um 1 Minute später zu laufen
    2. wenn ich das tun muss, irgendwelche Vermutungen darüber, wie lange ich warten soll
  2. sammle alle Informationen, die ich in save_cpt() brauche, und save_cpt() sie im Parameter $args an wp_schedule_single_event()
    1. Ich würde es vorziehen, diesen Weg nicht zu gehen, da das Sammeln dieser Information selbst eine Weile dauern könnte, was den Admin-Benutzer verlangsamen würde
    2. Gibt es “Ausgaben” (dh Speicher / etc) beim Übermitteln einer großen Menge von Informationen an einen Job über Cron?

Gibt es noch andere Überlegungen, die ich berücksichtigen sollte? Zum Beispiel was passiert wahrscheinlich, wenn:

  1. admin user A bearbeitet Post X, der den Cron-Job einplant
  2. Bevor der Cron-Job beendet wird, nimmt der Admin-Benutzer B eine weitere Bearbeitung vor, um X zu veröffentlichen

Solutions Collecting From Web of "WP cron: wann ein einmaliges Ereignis geplant werden soll"

Wenn ich den Cron-Job “sofort” ausführen lasse (wie im obigen Code), kann ich sicher sein, dass bis zum Aufruf von cron_func () alle mit dem Speichern meines CPT verbundenen DB-Updates abgeschlossen sein werden (seit Die in cron_func () aufgerufenen functionen müssen den modifizierten Zustand von $ post_id lesen)

Ja. save_post Hook wird ausgetriggers, nachdem der Post tatsächlich gespeichert wurde. Also wird der cron_func den modifizierten Status des cron_func erhalten. Sie brauchen dafür keine Alternative.

Gibt es noch andere Überlegungen, die ich berücksichtigen sollte? Zum Beispiel was passiert wahrscheinlich, wenn:

  1. admin user A bearbeitet post X, der den Cron-Job vor dem Abschluss des Cron-Jobs einplant.
  2. Admin-Benutzer B führt eine weitere Bearbeitung zum Posten von X durch

Wenn der Cron-Job einige Zeit in Anspruch nimmt, ist es sehr wahrscheinlich, dass ein solches Problem auftritt. Um dieses Problem zu lösen, können Sie beim Erstellen der Cron-Task eine Markierung (es kann sich um ein Post-Meta handeln) auslösen und die Markierung löschen, wenn Cron-Task beendet ist. Möglicherweise möchten Sie die Bearbeitung des Beitrags deaktivieren, solange die Markierung für einen Beitrag vorhanden ist.