グーテンベルクでJavascriptをトリガー(ブロックエディター)保存


9

だから私は投稿が保存されたときにJavascriptをトリガーしたいメタボックスを持っています(このユースケースではページを更新するためです)。

クラシックエディターでは、これはsave_post(優先度が高い)に接続された単純なリダイレクトを介して実行できます。

しかし、Gutenbergは既存のメタボックスの保存プロセスを個別のAJAX呼び出しに変換するので、それはJavaScriptである必要があります。

  • すべての保存プロセスが完了したイベントをリッスンしてから、JavaScriptをトリガーしますか?もしそうなら、このイベントは何と呼ばれていますか?これらのイベントへの参照はまだどこにもありますか?または

  • メタボックス保存AJAXプロセス内のJavaScriptをトリガーします。続行する前に、親ページ保存プロセスの状態を確認できますか?


1
Gutenbergにメタボックスだけをリロードさせることも、JSにメタボックスUIを実装してwp.dataデータストアに依存するように、潜在的な解決策です
トムJノウェル

@TomJNowellいくつかの状態を確認するために使用できるこの参照を見つけましたが、それらにアクセスする方法がわかりません:wordpress.org/gutenberg/handbook/data/data-core-editor
majick

これまでのところ、例えば。wp.data.select('core/editor').isSavingPost()...この種のアクセスはどこにも文書化されていません...またfalse、エディターがまだ保存しているかどうかにかかわらず、投稿が最初に保存された後(未定義になる前)に戻るため、信頼性が低いようです。facepalm
majick

あなたはサポートのためにgutenbergリポジトリで問題を提起することもできます、それはここでのトピックですが、あなたはそこでより知識のある人々が答えるかもしれません。また、JS WPフックシステムも可能性がありますが、それは推測にすぎません
トムJノーウェル

夢中になっては、このようなものを単純にはすでにを求め、サポートされていません。github.com/WordPress/gutenberg/issues/10044 ...ので、私はそれを自分で行う方法を見つけようとしています。
majick

回答:


9

より良い方法があるかどうかはわかりませんsubscribeが、ボタンにイベントリスナーを追加するのではなく、聞いています。

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

  }
})

投稿エディターデータの公式ドキュメント:https : //wordpress.org/gutenberg/handbook/designers-developers/developers/data/data-core-editor/


これははるかにきれいに見えますが、subscribe方法はどこから来たのでしょうか?wp.data関数の一部ですか?ドキュメントに記載されていません。
majick

はい、wp.​​dataモジュールsubscribeメソッドです。Gutenbergで投稿を編集するときにコンソールを開き、を実行しwp.dataます。これにより、使用可能なすべてのデータモジュールメソッドが一覧表示されます。
tomyam

2
これを見つけることでよくできました!残念ながら、gutenbergのドキュメントは非常にあいまいに配置されており、十分な例がありません。加えて、開発者が知っているか、Reactメソッドを学びたいという期待は本当に多すぎます...すでに知っていればかなり時間の節約になると思いますが、知らなければ、それは本当の時間の浪費ですwp.dataモデルで役立つものにアクセスする方法を理解するためだけに何時間もかかります 。私にとってはPHP(および従来のエディター)に戻っています。
majick

これを共有してくれてありがとう!条件に基づいて、投稿を傍受して更新/公開を停止するにはどうすればよいですか。
Mohammad AlBanna 19/12 / 12、1:

このメソッドは、ユーザーが「ゴミ箱に移動」ボタンをクリックしたときにもコードをトリガーするようです(投稿のステータスが「ゴミ箱」に変わり、isSavingPostの値がこれに関係なく「true」)。また、私の場合、「更新」クリック1回でサブスクリプションコードが3回トリガーされました。.editor-post-publish-button、.editor-post-save-draft、および.editor-post-previewのクリックを聞いてしまいました。
Oksana Romaniv

2

さて、私が望んだよりもはるかにハックな解決策でしたが、それを機能させました...

これは、誰かが同じことをする必要がある場合に備えて、コードからそれを行うための少し単純化され抽象化された方法です(近い将来、より多くのプラグインが使用されると確信しています)。

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

...変更metabox_input_idtrigger_valueて、必要に応じて一致させるだけです。:-)


これは役に立ちました。gutenbergjavascript
majick

0

複数回の呼び出し回避するには、サブスクライブおよび呼び出しからアンサブスクライブ機能を収集する必要があります。

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

            }
        });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.