我发现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类型的帖子时获取日志条目。
最合适的回答,由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
}
}
可能需要一些调整,可能考虑只应用于新帖子,而不在编辑时应用,以避免保留不变的记录。但似乎效果不错。