php - pasarela - WooCommerce: Autocompletar pedidos pagados
woocommerce comision (2)
Normalmente wooCommerce debería completar automáticamente los pedidos de productos virtuales. Pero no es así y este es un problema real, incluso un error.
Entonces, en este punto, puede encontrar algunas cosas útiles (pero no realmente convenientes):
1) Un código de fragmento (que puede encontrar en los documentos de 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'' ); }
Pero este fragmento no funciona para BACS * , Pago contra entrega y Verificar métodos de pago. Está bien para los métodos de pago de las pasarelas de Paypal y tarjeta de crédito.
* BACS es un método de pago por transferencia bancaria directa
Y ...
2) Un complemento: órdenes de autocompletado de WooCommerce
Este complemento funciona para todos los métodos de pago, pero no para otros métodos de pago de pasarelas de tarjeta de crédito .
Mi pregunta:
Usando (como base) el fragmento de wooCommerce en el punto 1:
¿Cómo puedo implementar código condicional basado en métodos de pago de woocommerce?
Me refiero a algo como: si los métodos de pago no son "BACS", "Pagar contra entrega" y "Verificar", entonces aplique el código de fragmento (estado de actualización a "completado" para pedidos pagos relacionados con productos virtuales).
Alguna ayuda será muy agradable.
Para mí, este gancho se llamó incluso si el pago no se realizó o falló, y este resultado para completar pagos fallidos, después de algunas investigaciones lo cambié para usar ''woocommerce_payment_complete'' porque se llama solo cuando el pago se completa y cubre el problema que @ LoicTheAztec menciona arriba -
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'' );
}
}
La solución más precisa, efectiva y liviana (para WooCommerce 3 y superior) - 2019
Este gancho de filtro se encuentra en:
-
Clase
WC_Order
dentro del métodopayment_complete()
que se utiliza en todos los métodos de pago cuando se requiere un pago en el pago. -
WC_Order_Data_Store_CPT
Clase dentro del métodoupdate()
.
Como puede ver, por defecto, los estados permitidos de los pedidos pagados son "procesando" y "completados".
Explicaciones:
Ligero y efectivo:
Como es un
woocommerce_payment_complete_order_status
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 "bacalao") . Aquí solo cambiamos los estados permitidos de los pedidos pagados .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 forma de evitar el envío de 2 notificaciones de clientes diferentes al mismo tiempo :
• Uno para el estado de pedidos de "procesamiento"
• Y uno para el estado de los pedidos "completados".Por lo tanto, el cliente solo recibe una notificación sobre el estado del pedido "completado".
Usando el código a continuación, simplemente cambiará el estado de la orden pagada (que se establece mediante la pasarela de pago para las órdenes pagas) a "completada":
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).
Relacionado: WooCommerce: autocompletar pedidos pagados según el método de envío
2018 - Versión mejorada (para WooCommerce 3 y superior)
Basado en el enlace 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
bacs
sean
bacs
(transferencia bancaria)
,
cheque
y
cod
(contra reembolso)
,
los estados de los pedidos pagados son "procesados" y "completados"
.
Así que apunto al 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 completar.
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 ) {
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'' );
}
}
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 id?
con esto:
get_post_meta( $order_id, ''_payment_method'', true );
de
helgatheviking
Los métodos de pago por transferencia bancaria, contra reembolso y cheque se ignoran y mantienen el estado original del pedido.
Se actualizó el código para compatibilidad con WC 3.0+ (2017-06-10)