禁用插件时启用自动保存

时间:2017-02-25 作者:Robert Fitzpatrick

我发现Woocommerce正在禁用autosave,这可能是有原因的,但我想打开它,看看它是否存在问题。这是我在他们的post type类中的\\uu构造中发现的,来自wp-content/plugins/woocommerce/includes/admin/class-wc-admin-post-types。php。。。。

// Disable Auto Save
add_action( \'admin_print_scripts\', array( $this, \'disable_autosave\' ) );
然后再往下看,我看到这个函数。。。。

/**
 * Disable the auto-save functionality for Orders.
 */
public function disable_autosave() {
       global $post;
       if ( $post && in_array( get_post_type( $post->ID ), wc_get_order_types( \'order-meta-boxes\' ) ) ) {
                  wp_dequeue_script( \'autosave\' );
            }
    }
我尝试对上面的wp\\u dequeue\\u脚本调用进行注释,只是为了测试该脚本是否已排队,它是否可以工作并且仍然不会自动保存。但我宁愿不要因为它是在Woocommerce的核心,而且会随时更新。如何在不更改插件的情况下重新启用?或者有没有人有过我为什么不应该这样做的经验?

我测试的方法是将此添加到save\\u post挂钩:

add_action( \'save_post\', \'save_product_meta\' );
function save_product_meta( $post_id ) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
        error_log("DOING AUTOSAVE for " . $post_id);
        return $post_id;
}
在WordPress admin中,我在屏幕上放置一篇普通帖子而不保存时获取日志条目,但在创建shop\\u order类型的帖子时获取日志条目。

2 个回复
最合适的回答,由SO网友:Robert Fitzpatrick 整理而成

最后我自己把帖子自动保存到帖子中。使用AJAX的php。。。。

add_action( \'admin_head\', \'woocommerce_admin_init\' );
function woocommerce_admin_init() {
  $screen = get_current_screen();
  if ( $screen->post_type == "shop_order" && $screen->base == "post" ) {
  ?>
  <script type="text/javascript">
    jQuery(document).ready(function ($) {
            var unsaved = false;
            $(\'#post input\').on(\'change\', function() {
                unsaved = true;
            });
            function wc_autosave(){
                //alert(unsaved);
                if (unsaved) {
                    $("#post").block({ message: "<h1>Please wait...</h1><h3>saving</h3>", centerY: false, css: { top: \'50px\' } });
                    $.ajax({
                        data: $("#post").serialize(),
                        type: "POST",
                        url: \'<?php echo admin_url(\'post.php\'); ?>\',
                        async: false
                    }).complete(function(){
                        unsaved = false;
                        $("#post").unblock();
                        setTimeout(function(){wc_autosave();}, 10000);
                    });
                } else {
                    setTimeout(function(){wc_autosave();}, 10000); return;
                }
            }
            wc_autosave();
    });
  </script>
  <?php
  }
}
可能需要一些调整,可能考虑只应用于新帖子,而不在编辑时应用,以避免保留不变的记录。但似乎效果不错。

SO网友:Mark Kaplun

您需要通过执行以下操作来删除WC添加的操作

remove_action( \'admin_print_scripts\', array( $this, \'disable_autosave\' ) );
要做到这一点,有两个棘手的部分

这需要在WC添加自己的操作后运行,您需要找出如何找到完全相同的操作$this 添加操作时使用的值disable_autosave 是一个稳定的函数名,在下一个版本中不太可能更改

相关推荐

Autosave control in WordPress

我一直在试图在WordPress中找到一个过滤器或设置来控制自动保存行为,最好是按帖子类型。在查询数据库时,我看到我们的自动草稿只能追溯到一周前,WordPress中是否有什么东西可以控制这种行为?如果可能的话,我想让一些帖子类型的自动草稿保留90天或更长时间?我阅读了下面关于Autosave的文章,可能我有点误解,但我的经验是,当我创建一个新帖子时,记录处于自动草稿状态,而当我刷新新帖子时,又创建了一个记录。php。这篇文章似乎暗示每个用户只有一个自动保存。。。https://codex.wordpre