Tutoriales

No reducir el stock de un producto en renovaciones con WooCommerce Subscriptions

Si estamos usando WooCommerce Subscriptions (con el que podéis cobrar usando Redsys) y necesitáis controlar el inventario del producto que vendéis, os habréis dado cuenta que por defecto, en cada renovación, el stock del producto se reduce.

A priori es un comportamiento lógico porque a efectos prácticos si estáis vendiendo algo con stock y se vende de nuevo, una renovación, debería restarse.

Pero es algo curioso, imaginad que tengo un producto con stock = 0, y si llega un pedido de renovación se cursará y se cobrará normalmente y el stock ahora será, stock = -1. Así que es verdad que el tema de los stocks en los productos de suscripción es cuanto menos algo a pensarse.

Por qué podría interesarme controlar el inventario de una suscripción

Pues la mayoría cuando hablamos de suscripciones pensamos en productos digitales que se venden solos y que si se se venden 2.000 será siempre mejor a que se venda 1.000. Pero es que las suscripciones de WooCommerce Subscriptions se usan para otras muchas cosas y un caso que veo muy a menudo es para su uso para cobrar matrículas y mensualidades de actividades extra escolares, gimnasios o clubes deportivos.

Os pongo el siguiente caso, tenemos una academia de fútbol que tiene 25 plazas. Vende 24 matrículas y sigue habiendo una plaza libre. Pero al pasar el mes y cobrarse las renovaciones el stock se decrementa, pasa a un número negativo y ya el producto no puede comprarse. Pero está mal porque sigue habiendo una plaza libre. ¿Cuál es la solución?

No reducir el stock en las renovaciones

Para ello usamos el hook woocommerce_can_reduce_order_stock que se incluyó para gestionar cuando no debe decrementarse el stock (o sí) de los pedidos al procesarse. Tan sencillo como usar este hook mezclándolo con alguno de los métodos que ofrece WooCommerce Subscriptions para ver si el pedido es una renovación o no.

add_filter( 'woocommerce_can_reduce_order_stock', function( $reduce_stock, $order ) {
 if ( function_exists( 'wcs_order_contains_renewal' ) && wcs_order_contains_renewal( $order ) ) {
  $reduce_stock = false;
 } elseif ( class_exists( 'WC_Subscriptions_Renewal_Order' ) && WC_Subscriptions_Renewal_Order::is_renewal( $order ) ) {
  $reduce_stock = false;
 }

 return $reduce_stock;
}, 10, 2 );

Para evitar problemas de errores por hacer llamadas a funciones o clases que no existen, usamos condicionales. El código se explica por si mismo, si detectamos una renovación por cualquiera de los dos métodos, directamente decimos que no se reduce el stock y si no, devolvemos lo que había llegado al hook.

Nota: Hay una valoración incrustada en esta entrada, por favor, visita esta entrada para valorarla.

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

Francisco Javier Carazo Gil

Entradas recientes

RedSys para Contact Form 7 ahora muestra el justificante y el motivo del rechazo en la página de gracias

Ya está disponible la versión 2.2 de Contact Form 7 – Integración con RedSys, y…

hace % días

¿Qué aporta la integración de Bizum y métodos similares en el proceso de pago?

El comercio electrónico español, que se encuentra en pleno crecimiento y transformación, vive actualmente un…

hace % días

Pagos recurrentes en Contact Form 7: suscripciones con RedSys, paso a paso

Hasta ahora, la integración de Contact Form 7 con RedSys solo sabía cobrar pagos únicos:…

hace % días

Cuotas personalizadas con RedSys

El pago fraccionado de RedSys para WooCommerce lleva un tiempo permitiendo dividir el precio de…

hace % días

Contact Form 7 – Integración con RedSys ya habla catalán, gallego y euskera

Ya está disponible la versión 1.24 de Contact Form 7 - Integración con RedSys, y…

hace % días

Calendario de pagos a medida en WooCommerce Subscriptions: cobra en las fechas que tú decidas

Hasta ahora, cobrar una suscripción en WooCommerce significaba aceptar una regla muy simple: eliges un…

hace % días