Trigger Javascript auf Gutenberg (Block Editor) Speichern

9

Ich habe also eine Metabox, die beim Speichern eines Beitrags Javascript auslösen soll (um die Seite in diesem Anwendungsfall zu aktualisieren).

Im klassischen Editor kann dies über eine einfache Umleitung erfolgen, die mit save_post(mit hoher Priorität) verbunden ist.

Da Gutenberg den Speichervorgang für vorhandene Metaboxen jetzt in einzelne AJAX-Aufrufe konvertiert, muss es sich um Javascript handeln. Wie kann ich also Folgendes tun:

  • Auf ein Ereignis warten, bei dem alle Speichervorgänge abgeschlossen sind, und dann das Javascript auslösen? Wenn ja, wie heißt dieses Ereignis? Gibt es irgendwo einen Hinweis auf diese Ereignisse? ODER

  • Javascript innerhalb des AJAX-Prozesses zum Speichern der Metabox auslösen, der dann den Status des Speichervorgangs der übergeordneten Seite überprüfen kann, bevor Sie fortfahren?

Majick
quelle
1
Gutenberg nur Ihre Metabox neu laden zu lassen, ist ebenfalls eine mögliche Lösung, ebenso wie die Implementierung der Metabox-Benutzeroberfläche in JS und die Verwendung von wp.dataDatenspeichern
Tom J Nowell
@ TomJNowell Ich habe diese Referenz gefunden, mit der ich einige Zustände überprüfen kann, bin mir aber nicht sicher, wie ich darauf zugreifen soll: wordpress.org/gutenberg/handbook/data/data-core-editor
Majick
Bisher habe ich: z. wp.data.select('core/editor').isSavingPost()... diese Art des Zugriffs ist nirgends dokumentiert, wo ich sie sehen kann ... und sie scheint auch unzuverlässig zu sein, da sie falsenach dem ersten Speichern des Beitrags (vorher undefiniert) zurückkehrt, ob der Editor noch speichert oder nicht. Gesichtspalme
Majick
Sie können auch ein Problem im gutenberg Repo zur Unterstützung ansprechen. Es ist hier ein Thema, aber Sie werden möglicherweise mehr sachkundige Leute finden, die dort antworten. Auch das JS WP Hooks System könnte eine Möglichkeit sein, aber das ist nur eine Vermutung
Tom J Nowell
Verrückt, so etwas Einfaches wird bereits gefragt und nicht unterstützt: github.com/WordPress/gutenberg/issues/10044 ... daher versuche ich, einen Weg zu finden, es selbst zu tun.
Majick

Antworten:

8

Ich bin mir nicht sicher, ob es einen besseren Weg gibt, aber ich höre zu, subscribeanstatt der Schaltfläche einen Ereignis-Listener hinzuzufügen:

wp.data.subscribe(function () {
  var isSavingPost = wp.data.select('core/editor').isSavingPost();
  var isAutosavingPost = wp.data.select('core/editor').isAutosavingPost();

  if (isSavingPost && !isAutosavingPost) {
    // Here goes your AJAX code ......

  }
})

Offizielle Dokumente der Post Editor-Daten: https://wordpress.org/gutenberg/handbook/designers-developers/developers/data/data-core-editor/

Tom Yam
quelle
das sieht viel sauberer aus, nur neugierig, woher die subscribeMethode überhaupt kommt? ist es Teil der wp.dataFunktion? Ich sehe es nicht in den Dokumenten erwähnt.
Majick
Ja, subscribeist eine Methode des Moduls wp.data . Öffnen Sie die Konsole, wenn Sie einen Beitrag mit Gutenberg bearbeiten, und führen Sie ihn aus wp.data. Hier werden alle verfügbaren Datenmodulmethoden aufgelistet.
Tomyam
2
gut gemacht, dies zu finden! Es ist bedauerlich, dass die Gutenberg-Dokumente so dunkel angelegt sind und nicht genügend Beispiele haben. Außerdem ist die Erwartung, dass Entwickler React-Methoden kennen und / oder lernen wollen, wirklich zu viel ... Ich bin sicher, dass es eine ziemliche Zeitersparnis sein kann, wenn Sie es bereits wissen, aber es ist eine echte Zeitverschwendung, wenn Sie es nicht getan haben Ich habe Stunden Zeit, um herauszufinden, wie ich auf alles zugreifen kann, was im wp.dataModell nützlich ist . Für mich ist es zurück zu PHP (und klassischem Editor).
Majick
Danke, dass du das geteilt hast! Wie kann ich den Beitrag basierend auf einer Bedingung abfangen und die Aktualisierung / Veröffentlichung beenden?
Mohammad AlBanna
Es scheint, dass diese Methode den Code auch auslöst, wenn ein Benutzer auf die Schaltfläche "In den Papierkorb verschieben" klickt (der Post-Status ändert sich in "Papierkorb" und der isSavingPost-Wert ist unabhängig davon "true"). Außerdem hat ein "Update" -Klick den Abonnementcode in meinem Fall dreimal ausgelöst. Am Ende habe ich auf Klick auf .editor-post-Publish-Button, .editor-post-save-Draft und .editor-post-Preview gewartet.
Oksana
2

Okay, also viel mehr hackige Lösung als ich wollte, aber es hat funktioniert ...

Hier ist eine leicht vereinfachte und abstrahierte Methode, um dies aus meinem Code heraus zu tun, falls jemand jemals dasselbe tun muss (da ich sicher bin, dass in naher Zukunft weitere Plugins verfügbar sein werden).

    var reload_check = false; var publish_button_click = false;
    jQuery(document).ready(function($) {
        add_publish_button_click = setInterval(function() {
            $publish_button = jQuery('.edit-post-header__settings .editor-post-publish-button');
            if ($publish_button && !publish_button_click) {
                publish_button_click = true;
                $publish_button.on('click', function() {
                    var reloader = setInterval(function() {
                        if (reload_check) {return;} else {reload_check = true;}
                        postsaving = wp.data.select('core/editor').isSavingPost();
                        autosaving = wp.data.select('core/editor').isAutosavingPost();
                        success = wp.data.select('core/editor').didPostSaveRequestSucceed();
                        console.log('Saving: '+postsaving+' - Autosaving: '+autosaving+' - Success: '+success);
                        if (postsaving || autosaving || !success) {classic_reload_check = false; return;}
                        clearInterval(reloader);

                        value = document.getElementById('metabox_input_id').value;
                        if (value == 'trigger_value') {
                            if (confirm('Page reload required. Refresh the page now?')) {
                                window.location.href = window.location.href+'&refreshed=1';
                            }
                        }
                    }, 1000);
                });
            }
        }, 500);
    });

... müssen sich nur ändern metabox_input_idund trigger_valuenach Bedarf anpassen. :-)

Majick
quelle
Dies war nützlich, das einzige Referenzbeispiel, das ich für den Zugriff auf die Hierarchie des gutenberg-Javascript-Moduls finden konnte: github.com/front/gutenberg-js
majick
0

Sie müssen die Funktion zum Abbestellen von Abonnieren und Anrufen erfassen , um Mehrfachanrufe zu vermeiden.

const unsubscribe = wp.data.subscribe(function () {
            let select = wp.data.select('core/editor');
            var isSavingPost = select.isSavingPost();
            var isAutosavingPost = select.isAutosavingPost();
            var didPostSaveRequestSucceed = select.didPostSaveRequestSucceed();
            if (isSavingPost && !isAutosavingPost && didPostSaveRequestSucceed) {
                console.log("isSavingPost && !isAutosavingPost && didPostSaveRequestSucceed");
                unsubscribe();


                // your AJAX HERE();

            }
        });
Phillip Kamikaze
quelle