web-dev-qa-db-fra.com

Activation de l'enregistrement automatique lorsque le plugin est désactivé

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

2
Robert Fitzpatrick

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.

0
Robert Fitzpatrick

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

  1. Cela doit s'exécuter après que WC ait ajouté sa propre action
  2. vous devez trouver comment trouver exactement le même $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

0
Mark Kaplun