En WooCommerce, una oferta programada solo termina cuando se ejecuta una tarea en segundo plano que vuelve a poner el precio normal. Si esa tarea falla, no llega a ejecutarse (WP-Cron desactivado, una cola llena de tareas fallidas) o una caché sigue sirviendo la página vieja, tus clientes ven el precio rebajado después de la fecha de fin. Desde WooCommerce 10.5 hay además un caso que despista: la oferta sí termina, pero el precio rebajado y las fechas se quedan guardados en la ficha del producto.

Por qué pasa

  • La tarea programada no se ejecutó. Desde WooCommerce 10.5, cada producto con fechas de oferta tiene sus propias acciones de Action Scheduler, wc_product_start_scheduled_sale y wc_product_end_scheduled_sale (grupo woocommerce-sales), a la hora exacta del inicio y del fin. Una acción diaria, woocommerce_scheduled_sales, pasa hacia la medianoche de la hora de la tienda como red de seguridad. Antes de la 10.5 solo existía la diaria. Si no corre ninguna, la oferta sigue.
  • WP-Cron está apagado. Action Scheduler arranca con WP-Cron. Si tu wp-config.php tiene define( 'DISABLE_WP_CRON', true ); y nada en el servidor lo sustituye, o la tienda recibe muy pocas visitas, las acciones se acumulan como vencidas.
  • La tarea falla. En un hilo de principios de 2026 del foro de WooCommerce, la tienda tenía más de 13.000 acciones fallidas y la tarea de ofertas se cortaba a los 300 segundos, lo que apuntaba a un límite de tiempo. Al ejecutarla a mano decía «completada», pero los precios no cambiaban.
  • Los productos se cambiaron fuera del editor. Un comentario en GitHub de marzo de 2026 explica que las acciones por producto se crean al guardar el producto de la forma normal. Los importadores o el código a medida que escriben directamente en la base de datos pueden dejar el producto esperando a la tarea diaria, que puede llegar con casi un día de retraso.
  • Una caché sirve la página vieja. La caché de páginas (WP Super Cache, la de tu alojamiento, Cloudflare) puede enseñar la oferta hasta que la vacías, aunque el producto ya esté bien.
  • Las listas y los filtros se quedan atrás. En WooCommerce 10.5 a 10.7, la ficha del producto estaba bien, pero el bloque «En oferta», los filtros de precio y el orden por precio podían seguir mostrando ofertas caducadas, porque no se actualizaba la tabla de búsqueda de productos. WooCommerce lo corrigió en la 10.8.0.
  • La oferta terminó, pero los datos se quedaron. En las versiones recientes, al acabar la oferta WooCommerce solo cambia el precio activo. El precio rebajado y las fechas «Desde… Hasta…» siguen en el editor. Una petición de junio de 2026 en woocommerce.com (con la 10.8.1) pide que se vuelvan a borrar solos, como antes.

Cómo comprobarlo

  1. Mira el producto como cliente. Ábrelo en una ventana privada. Si ves el precio normal sin la etiqueta de oferta, la oferta terminó y lo que queda en el editor son datos sobrantes. Si ves el descuento, sigue.
  2. Abre las acciones programadas. Entra en WooCommerce > Estado > Acciones programadas. Busca woocommerce_scheduled_sales y wc_product_end_scheduled_sale. Revisa las pestañas de pendientes, vencidas y fallidas.
  3. Lee el registro de una acción fallida. Haz clic en la acción para ver su registro. Un límite de tiempo o un error de «clase no encontrada» apuntan a un límite del servidor o a archivos de WooCommerce que no se actualizaron bien.
  4. Comprueba el cron. En WooCommerce > Estado, mira en el informe la sección de Action Scheduler y cuántas acciones vencidas hay. Pregunta a tu alojamiento si WP-Cron está desactivado y, si lo está, si lo sustituye un cron del servidor.
  5. Descarta la caché. Vacía la caché de páginas y la de tu CDN, y vuelve a cargar el producto.
  6. Mira tu versión de WooCommerce. Si tienes de la 10.5 a la 10.7 y el fallo solo se ve en la tienda, los filtros o el bloque «En oferta», actualizar a la 10.8 o superior lo arregla.

Cómo arreglarlo

  1. Haz una copia de seguridad y, si la tienda es grande, prueba antes en una copia de pruebas.
  2. Ejecuta la tarea. En Acciones programadas, pasa el ratón por la acción woocommerce_scheduled_sales pendiente y pulsa Ejecutar. Haz lo mismo con las wc_product_end_scheduled_sale pendientes de los productos afectados. Con WP-CLI puedes usar wp action-scheduler run.
  3. Limpia las acciones fallidas. Si miles vienen de un plugin que ya borraste, quitarlas aligera la cola. Si el registro muestra cortes por tiempo, pide a tu alojamiento o a tu desarrollador que suba el límite de tiempo de PHP.
  4. Haz que el cron sea fiable. Si WP-Cron está desactivado, crea en el panel de tu alojamiento una tarea cron que llame a wp-cron.php cada 5 minutos, o pídeselo a tu alojamiento.
  5. Quita la oferta a mano. Edita el producto, vacía Precio rebajado, pulsa Cancelar junto a las fechas de la oferta (o bórralas) y pulsa Actualizar. En un producto variable, entra en Datos del producto > Variaciones y haz lo mismo en cada variación. Al guardar desde el editor, WooCommerce recalcula el precio y sus cachés.
  6. ¿Son muchos productos? Exporta los productos en Productos > Exportar, vacía las columnas del precio rebajado y de las fechas de la oferta, e impórtalos marcando la opción de actualizar los productos existentes. Prueba antes con uno o dos. También sirve un editor masivo (el nuestro es BulkPilot).
  7. Vacía las cachés otra vez y revisa el producto, la página de la tienda y el bloque «En oferta».
  8. Actualiza WooCommerce a la 10.8 o superior si las listas de la tienda siguen mostrando la oferta caducada.

Cómo evitar que vuelva a pasar

Revisa Acciones programadas una vez por semana y ten un cron de verdad funcionando. Si prefieres que lo vigile otro, Melopo Radar revisa cada producto en cada sincronización y te avisa con «Oferta caducada aún visible» cuando la fecha de fin ya pasó y el producto se sigue cobrando a precio rebajado. Si la oferta terminó bien y solo quedaron guardados el precio rebajado y las fechas, no avisa: compara con el precio que se cobra de verdad. Desde el mismo aviso puedes quitar la oferta con un clic, de un producto o en bloque; Radar borra el precio rebajado a través de WooCommerce, así que el precio se recalcula. Ten en cuenta sus límites: Radar no lee las acciones programadas, no arregla el cron ni las tareas fallidas, no borra las fechas de la oferta y mira el precio del producto, no el de cada variación. Radar tiene un plan gratis para una tienda y una prueba de Pro de 14 días sin tarjeta.

Preguntas frecuentes

¿A qué hora termina una oferta en WooCommerce? El editor toma la fecha de fin como el final de ese día, a las 23:59:59 en la zona horaria de la tienda. Desde la 10.5 se programa una acción para ese momento; si no se ejecuta, la tarea diaria de medianoche debería recogerla.

¿Por qué el editor sigue mostrando el precio rebajado si la oferta ya terminó? En las versiones recientes WooCommerce cambia el precio activo pero deja guardados el precio rebajado y las fechas. Si la tienda muestra el precio normal, la oferta terminó. Puedes borrar esos datos a mano.

¿Importa que WP-Cron esté desactivado? Sí. Action Scheduler necesita WP-Cron o un cron del servidor para arrancar. Sin ninguno de los dos, las ofertas no empiezan ni terminan a su hora.

¿Por qué fallan más los productos variables? Cada variación tiene su propio precio rebajado y sus fechas, y el producto principal enseña un rango de precios calculado a partir de ellas. Si una variación no se actualiza, el rango sigue mostrando la oferta.

¿Vaciar la caché termina la oferta? Solo si el producto ya estaba bien y la caché enseñaba una página vieja. Si el precio rebajado sigue activo en WooCommerce, tienes que ejecutar la tarea o quitar la oferta.