保存时刷新的Add_META_BOXS操作

时间:2019-05-06 作者:Adriano Castro

我已经创建了一个元框,使用add_meta_boxes 当我打开任何帖子进行编辑时,它就会起作用。

add_action(\'add_meta_boxes\', function() {
    add_meta_box(
        ...
    );
});
当WP自动保存帖子时,或者当我单击“另存为草稿”(save as draft)时,甚至当我发布帖子时,我会在元框标题上看到一个小的加载图标。调试断点还向我证明add_meta_box 正在对任何保存操作调用函数。好的,这很适合我的需要,但问题是:加载图标消失时,元框HTML不会更新。

我能做些什么来允许WP在任何保存操作后重新加载元框内容,或者唯一的方法是重新加载(F5)页面?

1 个回复
SO网友:hedgehog90

所以我设法用一点javascript拼凑出一些东西。。。它很粗糙,但我觉得有点优雅。

add_action(\'admin_init\', function () {
    if ( current_user_can("send_notifications") ) {
        $post_types = ["post", "go_live"];
        foreach ($post_types  as $post_type) {
            add_meta_box(
                \'cabtv_notif_on_post\',
                \'Notifications\',
                function ($post) {
                    wp_nonce_field( \'cabtv_notif_metabox\', \'cabtv_notif_metabox\' );
                    $sent = (bool) get_post_meta( $post->ID, \'cabtv_notifications_sent\', true );
                    $checked = cabtv_should_post_send_notification($post->ID);
                    ?>
                    <div id="cabtv_notification_sent" style=\'margin-bottom:10px; <?php if (!$sent) echo \'display: none\'; ?>\'><span style=\'color:red; font-weight:bold;\'>Notifications have been sent for this post.</span></div>
                    <label><input type="checkbox" id="cabtv_send_notification" name="cabtv_send_notification" value="1" <?php if ($checked) echo \'checked\'; ?>></input> <?php echo esc_attr(\'Send notification on \'.($post->post_status === \'publish\' ? \'update\' : \'publish\') ); ?></label>
                    <script>
                    $(document).ready(()=>{
                        function update_meta_box() {
                            var cb = document.querySelector("#cabtv_send_notification");
                            if (cb.checked) document.querySelector("#cabtv_notification_sent").style.display = null;
                            cb.checked = false;
                        }
                        var dispatch = wp.data.dispatch( \'core/edit-post\' );
                        var oldMetaBoxUpdatesSuccess = dispatch.metaBoxUpdatesSuccess;
                        dispatch.metaBoxUpdatesSuccess = function(...args) {
                            update_meta_box();
                            return oldMetaBoxUpdatesSuccess.apply(this, args);
                        }
                    });
                    </script>
                <?php },
                $post_type,
                \'side\',
                \'high\'
            );
        }
    }
});
我浏览了wordpress\'edit-post.js 并找到一个名为metaBoxUpdatesSuccess 这似乎什么都不做,但它是在所有metabox标题中的微调器消失时调用的。因此,我用包装器替换了该函数,这也会触发我的metabox html更新。令人烦恼的是,这意味着必须在PHP中编写两次相同的内容&;基本上是JS,我可以想象这样一种场景,需要额外的AJAX来获取基本数据。

不管怎样,总比什么都没有好!

相关推荐

插件无法工作,在Nginx上升级到php 7x后出现固定链接错误

这个插件代码在使用php5的apache服务器上运行良好,但现在我正在使用php7和;wordpress 5。x、 它有permalink错误(显示404错误)。它使用wordpress普通永久链接(只显示404错误,即新页面正在打开),但不使用自定义永久链接。插件概述:该插件检查wp帖子/页面中的链接,单击这些链接,它将在新页面中打开该链接。基本上,它对链接执行两个步骤,而不是在帖子中直接打开链接。 <?php if (!class_exists(\'wordpress_l