Hola!
Todos los productos de mi web, están creados como productos simples virtuales. Algunos de ellos tienen un precio y otros son subvencionados (precio 0€). Tengo instalado el plugin SG Woocommerce Order Approval, para que cuando el usuario llegue al checkout, no pueda realizar el pago y quede pendiente de aprobación por nuestra parte (en Woocommerce aparece con el estado "Pendiente de aprobación"). Una vez lo revisamos y aprobamos, le llega un email al usuario para que pueda realizar el pago. Hasta aquí todo bien.
El problema lo tengo con los productos subvencionados, ya que aunque son gratuitos, también deben ser revisados y aprobados. Pero por alguna razón, cuando el usuario llega al checkout, en lugar de llegarnos dicho pedido como "Pendiente de aprobación", nos llega a Woocommerce como "Procesando", saltándose de esta manera, todo el proceso de aprobación por nuestra parte.
¿Sabéis si hay alguna manera de que los producto con precio 0, lleguen a Woocommercer con el estado "Pendiente de aprobación"?
Gracias!
Contenido solo visible a usuarios registrados
Hola Carlos.
Por favor adjunta una URL con uno de los productos para que podamos comprobarlo.
Un saludo
Hola!
Te paso uno subvencionado y otro con precio:
Lo importante es que la acción solo afecte a los productos subvencionados, ya que con los de pago, tal como está, nos va genial.
He probado con los dos códigos que aparecen en este artículo de Karen, pero uno de ellos (el 2º) me genera un error de servidor, y el primero, a pesar de cambiar esta parte $payment_complete_status = 'completed'; por on hold, siempre me llegan los pedidos como "pendiente de pago" y esto no me sirve. Si de alguna manera conseguimos que los productos gratuitos (solo los gratuitos) lleguen como "en espera" (on hold), me iría perfecto.
Quedo a la espera, muchas gracias!
Hola carlos.
Disculpa pero tienes la web en mantenimiento 🙄
Por favor abre la web un momento para que podamos revisarlo.
Un saludo
Aisn perdona Pepe, ya está abierta.
Saludos!
Hola Carlos.
Ok, puedes volver a poner la web en mantenimiento si quieres.
Una cosa, es producto es de WooCommerce o es una entrada/página? no veo ningun boton para poder agregarlo al carro.
Para los productos virtuales puedes utilizar el siguiente codigo:
add_filter( 'woocommerce_payment_complete_order_status', 'auto_complete_virtual_orders', 10, 3 ); function auto_complete_virtual_orders( $payment_complete_status, $order_id, $order ) { $current_status = $order->get_status(); // Solo queremos actualizar el estado a 'on-hold' si proviene de uno de los siguientes estados: $allowed_current_statuses = array( 'complete', 'pending', 'failed' ); if ( 'processing' === $payment_complete_status && in_array( $current_status, $allowed_current_statuses ) ) { $order_items = $order->get_items(); // Crear una matriz de productos en el pedido $order_products = array_filter( array_map( function( $item ) { // Obtenga el producto asociado para cada artículo de línea return $item->get_product(); }, $order_items ), function( $product ) { // Eliminar no productos return !! $product; } ); if ( count( $order_products > 0 ) ) { // Comprobar si cada producto es 'virtual' $is_virtual_order = array_reduce( $order_products, function( $virtual_order_so_far, $product ) { return $virtual_order_so_far && $product->is_virtual(); }, true ); if ( $is_virtual_order ) { $payment_complete_status = 'on-hold'; } } } return $payment_complete_status; }
Otra opción podría ser con un ID de producto:
function action_woocommerce_order_status_changed( $order_id, $old_status, $new_status, $order ) {
// Compare
if( $old_status === 'processing' ) {
// Get items
$items = $order->get_items();
foreach ( $items as $item ) {
// Get product id
$product_id = $item->get_product_id();
if ($product_id == 10 ) {
$order->update_status( 'on-hold' );
break;
}
}
}
}
add_action( 'woocommerce_order_status_changed', 'action_woocommerce_order_status_changed', 10, 4 );
En la línea if ($product_id == 10 ) le indicamos el ID del producto
Un saludo
Hola Pepe!
Sí, es un producto/curso de Woocommerce, lo que pasa que he cambiado el texto del botón para que en lugar de poner "añadir al carrito", ponga "inscribirme al curso", pero sí, es un producto de Woocommerce.
He probado el primer código, y cuando voy al carrito para continuar con la inscripción al curso, me sale este mensaje de error "internal server error", y no me deja continuar.
El segundo código no lo he probado, porque por lo que veo, es para un solo curso/producto, y claro, el problema de eso, es que nosotros los cursos subvencionados no son siempre los mismos, de manera que esta semana tenemos 3, y la semana que viene pueden ser otros 3 diferentes, por lo que habría que ir cambiando continuamente el id.
Por eso decía que lo ideal, es que el código se ciñera a todos los cursos/productos con el precio 0€.
No sé si lo ves viable.
PD: Antes de enviar este mensaje, he probado el segundo código y tampoco funciona. En este caso sí me deja continuar, pero no cambia el estado a "en espera".
Ten en cuenta que a lo mejor es porque ese botón no lo genera woocommerce, sino el plugin que te comenté al principio, no sé.
Saludos!
Hola Carlos,
En este caso comprueba si el siguiente código te permite configurar que los pedidos realizados indiferentemente del tipo de producto se marquen con un estatus especifico
function action_woocommerce_payment_complete( $order_id ) {
if( ! $order_id ) return;
$order = wc_get_order( $order_id );
$order->update_status( 'wc-on-hold' ); //Puedes cambiar el estatus de la orden por el que desees.
};
// add the action
add_action( 'woocommerce_payment_complete', 'action_woocommerce_payment_complete', 10, 3 );
Puedes ver los diferentes estatus de WooCommerce en esta lista
‘wc-pending’ => _x( ‘Pending payment’, ‘Order status’, ‘woocommerce’ ),
‘wc-processing’ => _x( ‘Processing’, ‘Order status’, ‘woocommerce’ ),
‘wc-on-hold’ => _x( ‘On hold’, ‘Order status’, ‘woocommerce’ ),
‘wc-completed’ => _x( ‘Completed’, ‘Order status’, ‘woocommerce’ ),
‘wc-cancelled’ => _x( ‘Cancelled’, ‘Order status’, ‘woocommerce’ ),
‘wc-refunded’ => _x( ‘Refunded’, ‘Order status’, ‘woocommerce’ ),
‘wc-failed’ => _x( ‘Failed’, ‘Order status’, ‘woocommerce’ ),
Verifica esto y nos comentas como va todo
Un Saludo
Muchas gracias Karen! Creo que ya lo tengo.
Con el código que me proporcionas, he conseguido que los productos/cursos con precio 0 (subvencionados), pasen a estado de "espera".
Por otro lado, lo he tenido que combinar con otro código que proporcionas en el artículo que menciono más arriba, para que los pedidos de productos que sí tienen precio, pasen directamente al estado "Completado" cuando se realiza el pago.
De esta manera, y a falta de hacer más pruebas, creo que tengo la configuración que necesitaba.
Muchísimas gracias a los dos, @pepe y @karen.
Saludos!
Hola Carlos,
Enhorabuena has logrado configurar todo lo que necesitabas, es un placer para nosotros siempre poder ayudarte.
No dudes en escribirnos si tienes cualquier otra consulta.
Un Saludo 😊