Attiva Javascript su Gutenberg (Block Editor) Salva


9

Quindi ho un metabox che voglio attivare alcuni Javascript quando viene salvato un post (per aggiornare la pagina in questo caso d'uso).

In Classic Editor, questo può essere fatto tramite un semplice reindirizzamento agganciato a save_post(con priorità alta)

Ma poiché Gutenberg converte il processo di salvataggio dei metabox esistenti in singole chiamate AJAX ora, deve essere javascript, quindi come posso:

  • Ascoltare un evento in cui tutti i processi di salvataggio sono completi e quindi attivare il javascript? In tal caso, come si chiama questo evento? C'è ancora un riferimento a questi eventi da qualche parte? O

  • Attivare javascript all'interno del processo AJAX di salvataggio di metabox, che può quindi controllare lo stato del processo di salvataggio della pagina principale prima di continuare?


1
Rendere Gutenberg ricaricare solo il tuo metabox è anche una potenziale soluzione, così come implementare l'interfaccia utente metabox in JS e fare affidamento su archivi di wp.datadati
Tom J Nowell

@TomJNowell Ho trovato questo riferimento che posso usare per controllare alcuni stati, ma non sono sicuro di come accedervi: wordpress.org/gutenberg/handbook/data/data-core-editor
majick

finora ho: ad es. wp.data.select('core/editor').isSavingPost()... questo tipo di accesso non è documentato da nessuna parte che posso vedere ... e sembra anche inaffidabile in quanto ritorna falsedopo che il post è stato salvato per la prima volta (prima che sia indefinito) se l'editor sta ancora salvando o meno. facepalm
majick,

Puoi anche sollevare un problema sul repository di Gutenberg per ricevere supporto, è un argomento qui, ma potresti far sì che le persone più competenti rispondano lì. Anche il sistema di ganci JS WP potrebbe essere una possibilità, ma è solo una supposizione
Tom J Nowell

Pazzamente, qualcosa di semplice come questo è già richiesto e non supportato: github.com/WordPress/gutenberg/issues/10044 ... quindi sto cercando di trovare un modo per farlo da solo.
Majick,

Risposte:


9

Non sono sicuro che esista un modo migliore, ma sto ascoltando subscribepiuttosto che aggiungere un listener di eventi al pulsante:

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

  }
})

Documenti ufficiali dei dati del Post Editor: https://wordpress.org/gutenberg/handbook/designers-developers/developers/data/data-core-editor/


sembra molto più pulito, solo curioso da dove subscribeprovenga il metodo? fa parte della wp.datafunzione? Non lo vedo menzionato nei documenti.
Maj

Sì, subscribeè un metodo del modulo wp.data . Apri la console quando modifichi un post con Gutenberg ed esegui wp.data. Questo elenca tutti i metodi disponibili del modulo dati.
Tomyam,

2
ben fatto nel trovarlo! è un peccato che i documenti di Gutenberg siano così oscurati e non abbiano abbastanza esempi. inoltre l'aspettativa che gli sviluppatori conosceranno e / o vorranno imparare i metodi di React è davvero troppo ... Sono sicuro che può essere abbastanza un risparmio se lo conosci già, ma è un vero e proprio timewaster se non lo fai - preso ore solo per capire come accedere a qualcosa di utile nel wp.datamodello. è tornato a PHP (e al classico editor) per me.
maestà

Grazie per averlo condiviso! Come posso intercettare e interrompere l'aggiornamento / pubblicazione del post in base a una condizione.
Mohammad AlBanna,

Sembra che questo metodo attivi anche il codice quando un utente fa clic sul pulsante "Sposta nel cestino" (lo stato del post cambia in "cestino" e il valore isSavingPost è "vero" indipendentemente da questo). Inoltre, un clic "Aggiorna" ha attivato il codice di abbonamento 3 volte nel mio caso. Ho finito per ascoltare clic su .editor-post-publishing-button, .editor-post-save-draft e .editor-post-preview.
Oksana Romaniv,

2

Okay, quindi una soluzione molto più confusa di quanto volessi, ma ha funzionato ...

Ecco un modo leggermente semplificato e astratto di farlo dal mio codice, nel caso qualcuno abbia mai bisogno di fare lo stesso (come sono sicuro che altri plugin lo faranno nel prossimo futuro).

    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);
    });

... ho solo bisogno di cambiare metabox_input_ide trigger_valueabbinare secondo necessità. :-)


Questo è stato utile, l'unico esempio di riferimento che ho trovato per accedere alla gerarchia del modulo javascript di gutenberg: github.com/front/gutenberg-js
majick,

0

È necessario raccogliere la funzione di annullamento dell'iscrizione da iscriviti e chiama per evitare chiamate multiple.

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();

            }
        });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.