pay pasarela pago for crear comision php wordpress woocommerce payment-gateway orders

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:

Como puede ver, por defecto, los estados permitidos de los pedidos pagados son "procesando" y "completados".

Explicaciones:

  1. 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.

  2. 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)