web-dev-qa-db-fra.com

Modifier l'état de la commande juste après le paiement dans WooCommerce

Je dois modifier automatiquement le statut d'une commande pour qu'elle soit terminée après réception du paiement, mais uniquement si le statut de la commande est "en cours de traitement". J'ai trouvé cet extrait, ce qui rend le statut des commandes terminé dans tous les cas, mais mes plugins de paiement après des modifications de paiement réussies renvoient des données et modifient le statut de la commande pour le "traitement". Je voudrais le changer en "terminé" après le succès et ne pas le changer si le statut n'est pas "en cours de traitement". Le principal problème que j'ai rencontré est que je ne sais pas comment obtenir la commande de statut reçue.

Voici mon code:

add_filter( 'woocommerce_thankyou', 'update_order_status', 10, 2 );

function update_order_status( $order_id ) {
   $order = new WC_Order( $order_id );
   $order_status = $order->get_status();    
   if ('processing' == $order_status) {    
       $order->update_status( 'completed' );    
    }    
 //return $order_status;
}

Éditer:

Je l'ai déjà compris. Voici le code qui fonctionne pour moi:

add_filter( 'woocommerce_thankyou', 'update_order_status', 10, 1 );

function update_order_status( $order_id ) {
  if ( !$order_id ){
    return;
  }
  $order = new WC_Order( $order_id );
  if ( 'processing' == $order->status) {
    $order->update_status( 'completed' );
  }
  return;
}
9
Borys Zielonka

Mise à jour 2 - 2019: utilisez WooCommerce: saisie automatique des commandes payées (fil mis à jour)

Donc le bon crochet à utiliser est woocommerce_payment_complete_order_status filtre renvoyé terminé


Mise à jour 1: Compatibilité avec WooCommerce version 3+

J'ai changé la réponse

Basé sur: WooCommerce - Commandes virtuelles payées Auto Complete (selon les méthodes de paiement) , vous pourrez également gérer toutes les méthodes de paiement dans les conditions:

// => not a filter (an action hook)
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 = new WC_Order( $order_id );

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

La fonction woocommerce_thankyou est une action. Vous devez utiliser add_action fonction pour s'y accrocher. Je recommanderais de changer la priorité en 20 afin que d'autres plugins/modifications de code puissent être appliqués avant update_order_status.

add_action( 'woocommerce_thankyou', 'update_order_status', 20);
4
Pranav