web-dev-qa-db-fra.com

WooCommerce: Compléter automatiquement les commandes payées

Normalement, wooCommerce doit compléter automatiquement les commandes de produits virtuels. Mais ce n'est pas le cas et c'est un vrai problème, même un BUG.

Donc, à ce stade, vous pouvez trouver des choses utiles (mais pas vraiment pratiques):

1) Un extrait de code (que vous pouvez trouver dans les documents wooCommerce):

/**
 * Auto Complete all WooCommerce orders.
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    $order->update_status( 'completed' );
}

Mais cet extrait ne fonctionne pas pour les modes de paiement BACS *, Pay on delivery et Check. C'est ok pour les méthodes de paiement des passerelles Paypal et Carte de crédit.

* BACS est un mode de paiement par virement bancaire direct

Et …

2) Un plugin: Commandes WooCommerce à saisie semi-automatique

Ce plugin fonctionne pour toutes les méthodes de paiement, mais pas pour autre méthodes de paiement des passerelles de cartes de crédit.

Ma question:

En utilisant (comme base) l'extrait de wooCommerce au point 1:

Comment puis-je implémenter un code conditionnel basé sur les méthodes de paiement woocommerce?

Je veux dire quelque chose comme: si les méthodes de paiement ne sont pas "BACS", "Pay on delivery" et "Check" alors appliquez le code d'extrait (mettez à jour le statut à "terminé" pour les commandes payantes concernant les produits virtuels).

Une aide sera très agréable.

27
LoicTheAztec

La solution la plus précise, efficace et légère (Pour WooCommerce 3 et supérieur) - 2019

Ce crochet de filtre est situé dans:

Comme vous pouvez le voir, par défaut, les statuts de commande payée autorisés sont "en cours" et "terminés".

Explications:

  1. Léger et efficace:

    Comme il s'agit d'un crochet de filtre, woocommerce_payment_complete_order_status n'est déclenché que lorsqu'un paiement en ligne est requis (pas pour "chèque" , méthodes de paiement "bacs" ou "morue"). Ici, nous modifions simplement les statuts autorisés des commandes payées .

    Donc, pas besoin d'ajouter des conditions pour les passerelles de paiement ou autre chose.

  2. Précis (éviter les notifications multiples):

    C'est le seul moyen d'éviter d'envoyer 2 notifications client différentes en même temps :
    • Un pour le statut de traitement des commandes
    • Et un pour le statut des commandes "terminées".

    Le client n'est donc informé qu'une seule fois de l'état de la commande "terminée".

En utilisant le code ci-dessous, il suffit de changer le statut de la commande payée (qui est défini par la passerelle de paiement pour les commandes payées) = à "terminé":

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    return 'completed';
}

Le code va dans le fichier function.php du thème enfant actif (ou thème actif).

Connexes: WooCommerce: saisie semi-automatique des commandes payées en fonction de la méthode d'expédition


2018 - Version améliorée (Pour WooCommerce 3 et supérieur)

Sur la base du hook officiel de Woocommerce, j'ai trouvé une solution à ce problème * (Fonctionne avec WC 3+).

Dans Woocommerce pour toutes les autres passerelles de paiement autres que bacs (Virement bancaire), cheque et cod (Paiement à la livraison ), les statuts des commandes payées sont "en cours" et "terminés" .

Je cible donc le statut de commande de "traitement" pour toutes les passerelles de paiement comme Paypal ou le paiement par carte de crédit, en mettant à jour le statut de la commande pour terminer.

Le code:

add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1 );
function wc_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
        return;

    // Get an instance of the WC_Product object
    $order = wc_get_order( $order_id );

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
        return;
    } 
    // For paid Orders with all others payment methods (paid order status "processing")
    elseif( $order->has_status('processing') ) {
        $order->update_status( 'completed' );
    }
}

Le code va dans le fichier function.php du thème enfant actif (ou thème actif).


Réponse originale (Pour toutes les versions de woocommerce):

Le code:

/**
 * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
    return;

    $order = wc_get_order( $order_id );

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
        return;
    } 
    // For paid Orders with all others payment methods (with paid status "processing")
    elseif( $order->get_status()  === 'processing' ) {
        $order->update_status( 'completed' );
    }
}

Le code va dans le fichier function.php du thème enfant actif (ou thème actif).

Avec l'aide de cet article: Comment vérifier le mode de paiement d'une commande WooCommerce par identifiant?

avec ceci: get_post_meta( $order_id, '_payment_method', true ); de helgatheviking

Les méthodes de virement bancaire, de paiement à la livraison et de paiement par chèque sont ignorées et conservent leur statut de commande d'origine.

Mise à jour du code pour la compatibilité avec WC 3.0+ (2017-06-10)

32
LoicTheAztec