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 adentropayment_complete()
método que es utilizado por todos los métodos de pago Cuándo se requiere un pago en cajaWC_Order_Data_Store_CPT
Clase adentroupdate()
método.
Como puede ver, por defecto el estados de pedidos pagados permitidos son “procesando” y “completado”.
###Explicaciones:
- 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.
- 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.