Javascript kích hoạt trên Gutenberg (Trình chỉnh sửa khối) Lưu


9

Vì vậy, tôi có một metabox mà tôi muốn kích hoạt một số Javascript khi bài đăng được lưu (để làm mới trang trong trường hợp sử dụng này.)

Trong Classic Editor, điều này có thể được thực hiện thông qua một chuyển hướng đơn giản được nối với save_post(với mức độ ưu tiên cao)

Nhưng vì Gutenberg chuyển đổi quy trình lưu cho các metabox hiện có thành các cuộc gọi AJAX riêng lẻ ngay bây giờ, nên nó cần phải là javascript, vậy tôi phải làm thế nào:

  • Nghe một sự kiện trong đó tất cả các quá trình lưu đã hoàn tất và sau đó kích hoạt javascript? Nếu vậy sự kiện này được gọi là gì? Có một tài liệu tham khảo cho các sự kiện này bất cứ nơi nào chưa? HOẶC LÀ

  • Kích hoạt javascript bên trong quy trình AJAX lưu metabox, sau đó có thể kiểm tra trạng thái của quy trình lưu trang mẹ trước khi tiếp tục?


1
Làm cho Gutenberg chỉ tải lại metabox của bạn cũng là một giải pháp tiềm năng, cũng như triển khai UI metabox trong JS và dựa vào wp.datacác cửa hàng dữ liệu
Tom J Nowell

@TomJNowell tôi đã tìm thấy thông tin này tôi có thể sử dụng để kiểm tra một số tiểu bang, nhưng không chắc chắn làm thế nào để truy cập chúng: wordpress.org/gutenberg/handbook/data/data-core-editor
majick

cho đến nay tôi có: vd. wp.data.select('core/editor').isSavingPost()... loại quyền truy cập này không được ghi lại ở bất cứ nơi nào tôi có thể thấy ... và dường như nó cũng không đáng tin cậy vì nó trở lại falsesau khi bài đăng được lưu lần đầu (trước đó không được xác định) cho dù trình soạn thảo có còn lưu hay không. facepalm
majick

Bạn cũng có thể nêu ra một vấn đề trên repo gutenberg để được hỗ trợ, đó là chủ đề ở đây nhưng bạn có thể nhận được nhiều người hiểu biết hơn trả lời ở đó. Ngoài ra, hệ thống hook JS WP có thể là một khả năng nhưng đó chỉ là dự đoán
Tom J Nowell

Thật điên rồ, một cái gì đó đơn giản như thế này đã được yêu cầu và không được hỗ trợ: github.com/WordPress/gutenberg/issues/10044 ... do đó tôi đang cố gắng tự mình tìm cách làm điều đó.
Majick

Câu trả lời:


8

Không chắc chắn nếu có một cách tốt hơn, nhưng tôi đang lắng nghe subscribehơn là thêm một trình lắng nghe sự kiện vào nút:

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

  }
})

Tài liệu chính thức của dữ liệu Trình chỉnh sửa bài: https://wordpress.org/gutenberg/handbook/designers-developers/developers/data/data-core-editor/


Điều này có vẻ sạch sẽ hơn nhiều, chỉ tò mò subscribephương pháp thậm chí đến từ đâu? nó là một phần của wp.datachức năng? Tôi không thấy nó được đề cập trong các tài liệu.
Majick

Có, subscribelà một phương thức của mô-đun wp.data . Mở bàn điều khiển khi chỉnh sửa bài đăng với Gutenberg và chạy wp.data. Điều này liệt kê tất cả các phương pháp mô-đun dữ liệu có sẵn.
tomyam

2
cũng được thực hiện trên việc tìm kiếm này! thật không may là các tài liệu của Gutenberg được đặt ra một cách khó hiểu và không có đủ ví dụ. cộng với kỳ vọng rằng các nhà phát triển sẽ biết và / hoặc muốn tìm hiểu các phương pháp React thực sự quá nhiều ... Tôi chắc chắn rằng nó có thể là một công cụ tiết kiệm thời gian nếu bạn đã biết, nhưng đó là một máy đo thời gian thực sự nếu bạn không - thực hiện tôi chỉ mất hàng giờ để tìm ra cách truy cập bất cứ thứ gì hữu ích trong wp.datamô hình. nó trở lại với PHP (và trình soạn thảo cổ điển) đối với tôi.
Majick

Cảm ơn đã chia sẻ điều này! Làm cách nào tôi có thể chặn và dừng cập nhật / xuất bản bài đăng dựa trên một điều kiện.
Mohammad AlBanna

Có vẻ như phương thức này cũng kích hoạt mã khi người dùng nhấp vào nút "Chuyển đến Thùng rác" (trạng thái bài đăng thay đổi thành "thùng rác" và giá trị isSavingPost là "đúng" bất kể điều này). Ngoài ra, một lần nhấp "Cập nhật" đã kích hoạt mã đăng ký 3 lần trong trường hợp của tôi. Tôi đã kết thúc việc nghe nhấp chuột vào .editor-post-Publish-button, .editor-post-save -raft và .editor-post-preview.
Oksana Romaniv

2

Được rồi, vì vậy cách giải quyết hack nhiều hơn tôi muốn, nhưng làm cho nó hoạt động ...

Đây là một cách đơn giản và trừu tượng để thực hiện nó từ mã của tôi, trong trường hợp bất kỳ ai cũng cần phải làm như vậy (vì tôi chắc chắn sẽ có nhiều plugin hơn trong tương lai gần.)

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

... Chỉ cần thay đổi metabox_input_idtrigger_valueđể phù hợp khi cần thiết. :-)


Điều này rất hữu ích, ví dụ tham khảo duy nhất tôi có thể tìm thấy để truy cập vào hệ thống phân cấp mô-đun javascript của
gutenberg

0

Bạn cần thu thập chức năng hủy đăng ký từ đăng ký và gọi để tránh cuộc gọi nhiều lần.

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

            }
        });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.