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.
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:
WC_Order
Classe à l'intérieur de la méthode payment_complete()
qui est utilisée par tous les modes de paiement lorsque un paiement est requis à la caisse.WC_Order_Data_Store_CPT
Classe à l'intérieur de la méthode update()
.Comme vous pouvez le voir, par défaut, les statuts de commande payée autorisés sont "en cours" et "terminés".
Explications:
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.
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)