Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Black Friday, Navidad y liquidaciones en WooCommerce: muestra el precio más bajo de los últimos 30 días

Se viene la temporada fuerte del comercio online: Black Friday, Navidad y las liquidaciones de enero, una detrás de otra. Lo normal es programar las tres campañas y dejar que WooCommerce muestre el precio tachado. El problema es que WooCommerce siempre tacha el «Precio normal», sin importar lo que pasó antes. Y eso puede convertir tu descuento de Navidad en una subida de precio disfrazada.

En esta entrada vemos la regla que usan las tiendas que quieren que sus descuentos sean defendibles, la aplicamos a un calendario real y armamos un snippet para que WooCommerce recuerde los precios por ti.

La regla de los 30 días

En la Unión Europea es ley desde 2022 (la llamada Directiva Ómnibus): cuando anuncias una rebaja, el precio «de antes» debe ser el más bajo que tuvo ese producto en los 30 días anteriores, no tu precio habitual. En Chile, la Ley del Consumidor prohíbe la publicidad engañosa y el SERNAC fiscaliza los descuentos en eventos como el CyberDay y el Black Friday. Aunque tu país no exija la cifra exacta de 30 días, usarla es la forma más simple de que nadie pueda decir que tu descuento era falso.

Y cuenta como «anunciar una rebaja» casi todo lo que rodea al precio: el precio tachado, la etiqueta «¡Oferta!», el porcentaje («-30 %») y los banners de campaña.

Esto no es asesoría legal. Si vendes en varios países o manejas campañas grandes, confirma los detalles con un abogado o con las guías de la autoridad de consumo de tu país.

El calendario, con números

Una polera que normalmente cuesta $19.990, con tres campañas:

  • Black Friday (27 al 30 de noviembre): $12.990. Los 30 días anteriores el precio fue $19.990. Puedes anunciar «Antes $19.990»: un 35 % menos. ✅
  • Navidad (18 al 26 de diciembre): «30 % de descuento», o sea $13.990. Pero dentro de sus 30 días anteriores está el Black Friday a $12.990. Tu «30 % de descuento» en realidad es una subida de $1.000. ❌
  • Liquidación de enero (7 al 20 de enero): $11.990. Sí es rebaja, pero contra $13.990 (el precio de Navidad), o sea un 14 %, no un 40 %. ✅ con la cifra correcta.

Puedes vender la polera a $13.990 en Navidad, por supuesto. Lo que no conviene es tacharle los $19.990 al lado ni ponerle «-30 %».

Tres formas de hacerlo bien

  1. Que cada oferta baje de la anterior. Si en Navidad la dejas en $11.990, puedes anunciarla: «Antes $12.990», un 8 % menos.
  2. Vender sin anunciar rebaja. Cambias el precio, sin tachado, sin etiqueta y sin porcentaje. Es un precio, no una oferta.
  3. Separar las campañas más de 30 días. Es la única manera de que tu precio normal vuelva a ser la referencia. Entre noviembre y enero casi nunca da.

El snippet: que WooCommerce recuerde los precios

WooCommerce no guarda un historial de precios. Este mu-plugin lo hace: cada vez que un producto se guarda (también cuando una oferta programada empieza o termina), anota el precio del día. Y en la ficha del producto, si está en oferta, muestra el precio más bajo de los 30 días anteriores al inicio de la oferta.

Guárdalo como wp-content/mu-plugins/cwp-precio-30-dias.php:

<?php
/**
 * Plugin Name: Precio más bajo de 30 días (Curso WordPress)
 * Description: Guarda el historial de precios y lo muestra en productos en oferta.
 */

function cwp_guardar_precio( $producto_id ) {
	$producto = wc_get_product( $producto_id );
	if ( ! $producto || '' === $producto->get_price() ) {
		return;
	}
	$historial = get_post_meta( $producto_id, '_cwp_historial_precios', true );
	if ( ! is_array( $historial ) ) {
		$historial = array();
	}
	$hoy    = wp_date( 'Y-m-d' );
	$precio = (float) $producto->get_price();

	$historial[ $hoy ] = isset( $historial[ $hoy ] ) ? min( $historial[ $hoy ], $precio ) : $precio;

	// Guardamos 90 días para poder mirar 30 días antes de cualquier oferta reciente.
	$limite = wp_date( 'Y-m-d', strtotime( '-90 days' ) );
	foreach ( array_keys( $historial ) as $dia ) {
		if ( $dia < $limite ) {
			unset( $historial[ $dia ] );
		}
	}
	update_post_meta( $producto_id, '_cwp_historial_precios', $historial );
}
add_action( 'woocommerce_update_product', 'cwp_guardar_precio' );
add_action( 'woocommerce_update_product_variation', 'cwp_guardar_precio' );

add_filter( 'woocommerce_get_price_html', function ( $html, $producto ) {
	if ( ! $producto->is_on_sale() || $producto->is_type( 'variable' ) ) {
		return $html;
	}
	$historial = get_post_meta( $producto->get_id(), '_cwp_historial_precios', true );
	if ( ! is_array( $historial ) ) {
		return $html;
	}

	$inicio_oferta = $producto->get_date_on_sale_from();
	$inicio        = $inicio_oferta ? $inicio_oferta->date( 'Y-m-d' ) : wp_date( 'Y-m-d' );
	$desde         = gmdate( 'Y-m-d', strtotime( $inicio . ' -30 days' ) );

	$previos = array();
	foreach ( $historial as $dia => $precio ) {
		if ( $dia >= $desde && $dia < $inicio ) {
			$previos[] = $precio;
		}
	}
	if ( ! $previos ) {
		return $html;
	}

	return $html . '<small style="display:block;opacity:.8">Precio más bajo de los 30 días anteriores: '
		. wc_price( min( $previos ) ) . '</small>';
}, 10, 2 );

Cómo usarlo bien

  • Instálalo ya, no el día del Black Friday. El historial empieza a contar desde que lo activas. Para registrar el precio actual de todos tus productos, ve a Productos, selecciónalos todos, elige Editar en las acciones en lote y pulsa Actualizar sin cambiar nada.
  • Programa las ofertas con fechas. En la ficha del producto, junto al Precio rebajado, pulsa Programar y define desde y hasta. Así el snippet sabe cuándo empezó la oferta y mira los 30 días correctos.
  • Compara antes de publicar el banner. Si la línea «Precio más bajo de los 30 días anteriores» muestra un valor menor o igual que tu oferta, esa campaña no debería anunciarse como rebaja.

Productos variables: el snippet guarda el historial de cada variación, pero no muestra la línea en el precio del producto padre, porque ahí WooCommerce enseña un rango. Si tu tienda vive de variaciones, revisa el historial de la variación en oferta antes de anunciar el porcentaje.

¿Estás armando tu calendario de ofertas? Comparte en el foro las fechas y precios que tienes pensados (de un producto de ejemplo) y te ayudamos a revisar que cada descuento se pueda anunciar con la cifra correcta.