J'ai trouvé que Woocommerce désactive l'enregistrement automatique, peut-être pour une bonne raison, mais j'aimerais l'avoir activé et voir s'il présente un problème. C'est ce que j'ai trouvé dans le __construct dans leur classe de type de message, à partir de wp-content/plugins/woocommerce/includes/admin/class-wc-admin-post-types.php ....
// Disable Auto Save
add_action( 'admin_print_scripts', array( $this, 'disable_autosave' ) );
Plus loin, je vois cette fonction ....
/**
* 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' );
}
}
J'ai essayé de commenter l'appel wp_dequeue_script ci-dessus juste pour tester si ce script était mis en file d'attente, cela fonctionnerait-il et ne serait toujours pas enregistré automatiquement. Mais je préfère ne pas le faire car il est dans le noyau de Woocommerce et soumis à des mises à jour. Comment puis-je réactiver sans modifier le plugin? Ou est-ce que quelqu'un sait pourquoi je ne devrais pas?
La façon dont je teste est en ajoutant ceci au crochet save_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;
}
Dans WordPress admin, j'obtiens l'entrée de journal tout en laissant un post normal s'afficher à l'écran sans enregistrer, mais pas lorsqu'un post de type shop_order est créé.
J'ai fini par faire ma propre publication de sauvegarde automatique sur post.php en utilisant AJAX ....
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
}
}
Il a probablement besoin de quelques ajustements, pourrait envisager de ne postuler qu'aux nouveaux articles et non lors de la modification pour éviter de laisser des enregistrements inchangés. Mais semble bien fonctionner.
Vous devez supprimer l'action ajoutée par WC en faisant quelque chose comme
remove_action( 'admin_print_scripts', array( $this, 'disable_autosave' ) );
Il y a deux parties difficiles à bien faire
$this
valeur utilisée lors de l'ajout de l'action.Je vous conseille toujours de contacter le support WC, car ils peuvent garantir que disable_autosave
est un nom de fonction stable qu'ils ne changeront probablement pas dans la prochaine version