WooCommerce, forcer le statut après paiement

////WooCommerce, forcer le statut après paiement

Parfois nous avons besoin de forcer le statut des commandes à « Terminée » dès le paiement, voyons comment le faire.

Pour rappel, les statuts de WooCommerce sont les suivants :

  • Attente : la commande est en attente d’un choix de moyen de paiement.
  • En attente : le paiement différé (chèque, virement, à la livraison) est en attente de réception.
  • En cours : le paiement a été confirmé, la commande est en cours de préparation.
  • Terminée : la commande a été envoyée.
  • Annulée
  • Remboursée
  • Échouée

Dans le cas particulier de produits virtuels téléchargeables, WooCommerce passe le statut des commandes de « Attente » à « Terminée » car les produits sont automatiquement disponibles par téléchargement.

Mais dans certains cas nous pouvons souhaiter que le statut « Terminée » soit forcé pour le produits non virtuels. Exemple concret, un client qui ne désire pas gérer les commandes dans WooCommerce mais qui veut que les clients puissent repasser une précédente commande. Il faut savoir que lorsqu’une commande passe au statut « Terminée », WooCommerce propose un bouton pour recommander depuis l’historique.

Moyen de paiement immédiat ou différé ?

En fonction du moyen de paiement sélectionné par le client, le code va être différent.

Pour un paiement immédiat (carte bancaire, Paypal, Stripe, etc.) nous allons filtrer sur woocommerce_payment_complete_order_status.

add_filter( 'woocommerce_payment_complete_order_status', 'rfvc_update_order_status', 10, 2 );
function rfvc_update_order_status( $order_status, $order_id ) {
  $order = new WC_Order( $order_id );
  if ( 'processing' == $order_status && ( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) {
    return 'completed';
  }
  return $order_status;
}

source

Si le statut passait à « En cours » en venant de « Attente », « En attente » ou « Échouée », on renvoi le statut « Terminée » (completed).

A noter que si vous avez de l’argent à perdre, vous pouvez acheter l’extension WooCommerce Order Status Control qui fait la même chose.

Pour les paiements différés (chèque, virement, à la livraison) le filtre précédant ne sera pas déclenché, alors on va placer une action sur woocommerce_thankyou, un crochet de la page de remerciement qui s’affiche en fin de processus de ces moyens de paiement.

add_action( 'woocommerce_thankyou', 'abw_woocommerce_auto_complete_order' );
function abw_woocommerce_auto_complete_order( $order_id ) {
    if ( !$order_id ) return;
    $order = new WC_Order( $order_id );
    $order->update_status( 'completed' );
}

On se contente de forcer le statut de la commande, ici pour « Terminée » (completed), mais cela pourrait être pour « En cours » (processing), le statut initial étant « En attente » (on-hold).

Attention aux e-mails ! Dans le cas d’un paiement différé le client va recevoir un e-mail de nouvelle commande et un e-mail de commande terminée… Pour résoudre ce problème, il vous suffit de désactiver l’e-mail de votre choix dans l’onglet E-mails des paramètres de WooCommerce.

Par |2018-05-26T17:05:46+00:001 mars 2016|Categories: WooCommerce|15 Comments

_e("Are you hungry?")

15 Comments

  1. LAURENT GOUAUX 28 août 2018 à 11h49 - Répondre

    Bonjour

    est-il possible de mettre une condition sur un changement de statut ?
    ex: je passe manuellement un statut en « pending » et lorsque le client paye je voudrais que son statut passe en « processing ». Sauf qu’à l’heure actuelle il revient en « on-hold ».
    Si j’utilise votre code en changeant « complete » par « processing » ça fonctionne mais pour toutes les commandes et pas seulement celle en « pending »

    add_action( ‘woocommerce_thankyou’, ‘abw_woocommerce_auto_complete_order’ );
    function abw_woocommerce_auto_complete_order( $order_id ) {
    if ( !$order_id ) return;
    $order = new WC_Order( $order_id );
    $order->update_status( ‘processing’ );
    }

    Si vous avez une idée ?
    Merci beaucoup
    Laurent

  2. Pascal 22 janvier 2017 à 11h59 - Répondre

    Bonjour,
    Y a-t-il un endroit précis dans Function.php où on doit insérer le code?
    Je viens de faire le test avec un payement PaiPal et la commande est restée sur « en cours », il a fallu que je la valide manuellement par la terminer.
    Merci pour votre aide.
    Cordialement,
    Pascal

    • ABSOLUTE Web 23 janvier 2017 à 9h59 - Répondre

      Bonjour Pascal,
      En principe cela peut être n’importe où dans le fichier functions.php sauf si du code doit contrarier le résultat attendu en intervenant avant ou après votre code.
      Nicolas.

  3. Cyrille 4 octobre 2016 à 10h06 - Répondre

    Bonjour,

    Quel fichier doit être modifié?

  4. HalepS 16 mai 2016 à 21h09 - Répondre

    Bonjour,
    J’utilise woocommerce + woocomerce atos et mes paiements (CB) restent « en attente » malgré la confirmation de la transaction. Par conséquent je ne reçois pas non plus l’email « nouvelle commande client » et je suis donc obligé de forcer la commande à « en cours ». Pouvez-vous m’aider sur ce sujet ?

    Bien cordialement

    • ABSOLUTE Web 17 mai 2016 à 10h01 - Répondre

      Bonjour,

      L’absence de retour de banque peut avoir plusieurs causes. Il faut que le site soit accessible à tous (pas de blocage par une extension de maintenance, par un htaccess ou autre). Certaines extensions de sécurité peuvent bloquer le retour de banque (wordfence, ithemes, …). Le firewall d’OVH peut bloquer le retour de banque. Bref le site doit être accessible pour une requête distante en POST.

      Nicolas.

      • Gachet philippe Terroirs Secrets 4 juin 2017 à 10h04 - Répondre

        probleme identique que faut t il faire j’ai bien wordfence

  5. Martinez 29 mars 2016 à 13h27 - Répondre

    Avec la CB, passerelle Atos sips, HSBC, Elysnet

    • ABSOLUTE Web 29 mars 2016 à 13h47 - Répondre

      C’est à la passerelle de paiement d’actualiser les commandes après un paiement réussi. Vous n’utilisez pas la passerelle d’ABSOLUTE Web ?

      • Martinez 29 mars 2016 à 13h48 - Répondre

        Si j’utilise Absolute web.. Je ne comprends pas que parfois cela reste en annulé.. Alors que le client a été débité

        • ABSOLUTE Web 29 mars 2016 à 14h52 - Répondre

          Si ce n’est pas systématique c’est que la banque ne parvient pas toujours à joindre la boutique après paiement. Dans ce cas les e-mails client / marchand ne doivent pas non plus être envoyés. Vous pouvez contacter notre support par e-mail si vous êtes client ABSOLUTE Web avec une licence active.
          Forcer le statut avec le code proposé sur cette page n’est pas du tout une solution.

  6. Martinez 29 mars 2016 à 12h38 - Répondre

    Bonjour,

    Est ce que cela vient d’un soucis sur la mise à jour Woocomerce que certaines commandes soient marquées comme « annulées » alors que le client a été débité ? La fonction que vous proposez ci-dessus résout-elle se problème ?

    Merci d’avance
    CM

    • ABSOLUTE Web 29 mars 2016 à 12h42 - Répondre

      Bonjour,
      Avec quel mode de paiement rencontrez-vous ce problème ? Carte bancaire ? Quelle passerelle ?
      Nicolas.

Ecrire un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.