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.