Saltar al contenido

WooCommerce: Autocompletar pedidos pagados

Te sugerimos que pruebes esta solución en un entorno controlado antes de pasarlo a producción, saludos.

Solución:

La solución más precisa, eficaz y ligera(Para WooCommerce 3 y superior) – 2019

Este gancho de filtro se encuentra en:

  • WC_Order Clase adentro payment_complete() método que es utilizado por todos los métodos de pago Cuándo se requiere un pago en caja
  • WC_Order_Data_Store_CPT Clase adentro update() método.

Como puede ver, por defecto el estados de pedidos pagados permitidos son “procesando” y “completado”.

###Explicaciones:

  1. Ligero y eficaz:

Como es un gancho de filtro, woocommerce_payment_complete_order_status solo se activa cuando se requiere un pago en línea(no para los métodos de pago “cheque”, “bacs” o “cod”). Aquí solo cambiamos el estados de pedidos pagados permitidos.

Por lo tanto, no es necesario agregar condiciones para las pasarelas de pago ni nada más.

  1. Preciso(evitar múltiples notificaciones):

Esta es la única manera para evitar enviar 2 notificaciones de clientes diferentes al mismo tiempo:
• Uno para el estado de los pedidos en “procesamiento”
• Y uno para el estado de pedidos “completados”.

Por lo tanto, al cliente solo se le notifica una vez sobre el estado del pedido “completado”.

Usando el código a continuación, simplemente cambiar el estado del pedido pagado(esto lo establece la pasarela de pago para pedidos pagados) a “completado”:

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';

El código va en el archivo function.php del tema secundario activo (o tema activo).

Relacionados: WooCommerce: autocompletar pedidos pagados según el método de envío


2018 – Versión mejorada(Para WooCommerce 3 y superior)

Basado en el gancho oficial de Woocommerce, encontré una solución a este problema *(Funciona con WC 3+).

En Woocommerce para todas las demás pasarelas de pago que no sean bacs(Transferencia bancaria), cheque y cod(Contra reembolso), los estados del pedido pagado son “procesando” y “completado”.

Por lo tanto, apunto el estado del pedido de “procesamiento” para todas las pasarelas de pago como Paypal o pago con tarjeta de crédito, actualizando el estado del pedido para completarlo.

El código:

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' );
    

El código va en el archivo function.php del tema secundario activo (o tema activo).


respuesta original(Para todas las versiones de woocommerce):

El código:

/**
 * 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 )  ( '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' );
    

El código va en el archivo function.php del tema secundario activo (o tema activo).

Con la ayuda de esta publicación: ¿Cómo verificar el método de pago en un pedido de WooCommerce por identificación?

con este : get_post_meta( $order_id, '_payment_method', true ); de helgatheviking

Los métodos de pago “Transferencia bancaria” (bacs), “Contra reembolso” (cod) y “Cheque” (cheque) se ignoran y mantienen su estado de pedido original.

Se actualizó el código para compatibilidad con WC 3.0+ (2017-06-10)

Para mí, este gancho se llamó incluso si el pago no se realizó o falló, y esto resultó en pagos fallidos completos. Después de investigar un poco, lo cambié para usar ‘woocommerce_payment_complete’ porque solo se llama cuando se completa el pago y cubre el problema que @LoicTheAztec menciona anteriormente:

add_action( 'woocommerce_payment_complete', '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;
    // Updated status to "completed" for paid Orders with all others payment methods
     else 
        $order->update_status( 'completed' );
    

Reseñas y valoraciones del artículo

Si guardas alguna perplejidad o capacidad de beneficiar nuestro artículo puedes añadir una interpretación y con gusto lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *