Releases: bywuilgonzalezstudio/omnidiscount-opensource
Release list
v1.6.0
- Welcome-popup email capture with unique, single-use coupons per visitor
- First-purchase identity verification to prevent welcome-coupon abuse
- Customizable HTML confirmation and code-reveal emails with live preview
- Fixed a pricing bug where certain BOGO/gift promos could collapse cart lines to $0
- Promo exclusivity, atomic usage reservation, and granular accumulation controls
- Redesigned Analytics panel
v1.4.1 — Fix promos UX to match prototype + independent menu
Changes
- Fix promos dashboard UX: Aligned ~30 CSS class names in admin-promos.js with admin-promos.css so all prototype styling now applies correctly (cards, KPIs, badges, modals, type selector, meta stats, empty state)
- Independent plugin menu: Moved OmniDiscount to its own top-level WordPress admin menu instead of being nested under WooCommerce
- Toggle label CSS: Added
.drw-toggle-labelrule for toggle label wrappers in the promo editor modal
Files changed
assets/js/admin-promos.js— Rewrote all class names to match CSS prototypeassets/css/admin-promos.css— Added.drw-toggle-labelrulesrc/Controllers/AdminController.php—add_menu_page()+ hook check updatediscount-rules-woo.php— Version bump to 1.4.1
v1.4.0 — OmniDiscount
OmniDiscount v1.4.0
Rebrand
- Plugin renombrado a OmniDiscount — Dynamic Pricing & Discount Rules for WooCommerce
Dashboard de Promos (Nuevo)
- Panel premium de gestión de cupones/promociones con 15 tipos de oferta:
percent,fixed,launch,2x1,3x2,second_unit,tiered,bundle,free_ship_threshold,free_ship,welcome,gift,cashback,flash,data_capture - KPI cards con métricas en tiempo real
- Filter chips para filtrado rápido por estado y tipo
- Grid de PromoCards con toggle de activación
- Modal editor con selector visual de tipos
- REST API completa: GET/POST/PUT/DELETE promos
Seguridad
- Capability check
manage_woocommerceen todos los endpoints - Sanitización con
sanitize_text_field()en todas las entradas - Whitelist estricta de tipos, validación de porcentajes (<=100%), formato de fechas
- Sin uso de
innerHTML— DOM seguro contextContent/createElement
Técnico
- CSS con variables
--drw-*, layout responsivo,transform: scaleX()para animaciones - Compatible PHP 7.4 – 8.2, WooCommerce 6.0 – 10.8
v1.3.11
v1.3.11 — Restore all v1.3.0-v1.3.5 features + no_coupon_stacking
Restored Features
- ShortcodeController: Catalog grid with IntersectionObserver infinite scroll, badge overlays, category filters
- AnalyticsController: Analytics dashboard with Chart.js visualizations
- ImportExportController: JSON import/export of discount rules
- ProgressBarController: Cart progress bar with configurable thresholds
- StoreApiController: WooCommerce Block Cart/Checkout integration
- drw-shortcode.js: Frontend shortcode rendering with lazy loading
- drw-analytics.js: Analytics chart initialization
- public-style.css: Full public-facing styles with container queries
New Features
- No Coupon Stacking: Global option (
drw_global_no_coupon_stacking) and per-rule field to prevent discounts when coupons are applied - Parent category fallback: Product targeting now checks parent categories for both inclusion and exclusion
- Public accessors:
get_cached_cart_item_prices()andget_cached_cart_level_discounts()on RulesEngine
Fixes
- Fixed PHPCS equals sign alignment in class-router.php
- Fixed AnalyticsController/ImportExportController submenu parent slug
- Fixed StoreApiController double hook registration
v1.3.10 — Grid, badge, filtro por categoría restaurados
Novedades en v1.3.10
📱 Grid móvil — 2 columnas en teléfono
container-type:inline-size ahora está en .drw-sale-wrap (contenedor padre), no en el grid mismo. Esto permite que las @container queries funcionen correctamente sobre los hijos. Se mantienen @media queries como fallback universal.
- Móvil ≤767px → 2 columnas
- Tablet/desktop → columnas configuradas (default 4)
🏷️ Badge "-XX%" ya no flota sobre el header al hacer scroll
Se añadió isolation:isolate a .drw-sale-item, encapsulando el z-index dentro de la card.
🛍️ Badge consistente en catálogo/tienda estándar
.woocommerce-loop-product__link ahora tiene position:relative para que el badge se posicione correctamente en las páginas de tienda de WooCommerce.
🔍 Filtro de categorías con botón ✕ Limpiar
- Al seleccionar una categoría, el grid recarga vía AJAX (sin recargar la página)
- El botón rojo ✕ Limpiar aparece cuando hay un filtro activo
- Al presionar Limpiar, vuelve a "Todas las categorías" y el botón desaparece
↕️ Ordenar por
- Mayor descuento (default)
- Precio: menor a mayor / mayor a menor
- Más recientes
📐 Sort bar responsive
En pantallas <640px los controles se apilan en columna a ancho completo.
⚙️ Auto-actualización
El ZIP se adjunta automáticamente — actualiza desde WP sin subir archivos manualmente.
v1.3.9 — Grid responsivo e imágenes en shortcode
Correcciones en v1.3.9
📱 Grid responsive en móvil
- El shortcode
[awdr_sale_items_list]ahora adapta las columnas según pantalla:- Desktop (>900px): 4 columnas
- Tablet (640–900px): 3 columnas
- Móvil (<640px): 2 columnas
- Causa raíz corregida: el CSS anterior usaba
@containerqueries que no funcionan para estilizar el propio contenedor
🖼️ Imágenes faltantes
- Los productos sin miniatura asignada en WooCommerce ahora muestran el placeholder estándar de WooCommerce en lugar de un espacio en blanco
- Tarjetas con
aspect-ratio: 1/1+object-fit: coverpara altura uniforme en el grid
⚙️ Auto-actualización
El ZIP se adjunta automáticamente — actualiza desde WP sin subir archivos manualmente.
v1.3.8 — Settings UI, catalog grid fix, autoloader fix
Novedades en v1.3.8
✨ Nueva pantalla: Configuración Global
- Accede desde WooCommerce → Discount Rules → botón ⚙ Configuración
- Tipos de Descuento: habilita/deshabilita porcentaje, precio fijo, bulk, BOGO, bundle, envío gratis
- Comportamiento de Reglas: estrategia de combinación (mejor, suma, único), orden de aplicación
- Características Generales: programación por fechas, límites de uso, etiquetas de descuento, redondeo de precios
- Tema y Colores: preset de tema, colores personalizados, tipografía, espaciado
🐛 Correcciones
- Grid de catálogo restaurado: los precios tachados con descuento vuelven a funcionar (regresión de v1.3.6)
- Fatal error resuelto: autoloader ahora resuelve
class-router.php(PHPCS) antes de intentarRouter.php(legacy) — elimina Class "Drw\App\Router" not found en producción
⚙️ Auto-actualización
El plugin se actualiza automáticamente desde el panel de WordPress (sin subir ZIP manualmente).
v1.3.7 — Fix Autoloader + WordPress Auto-Update
v1.3.7 — Fix Critical Autoloader + WordPress Auto-Update System
Bug Fix (Crítico)
- Autoloader corregido: el autoloader de respaldo ahora resuelve correctamente archivos con convención PHPCS (
class-router.php,class-settingscontroller.php,class-settingsmodel.php) además de los legacy (RuleModel.php,Database.php). Esto eliminó el error fatal "Class Drw\App\Router not found" en instalaciones sin Composer.
Nuevo: Auto-Update desde WordPress
- El plugin ahora se actualiza automáticamente desde WordPress → Plugins → Actualizaciones, igual que un plugin oficial
- Usa el sistema de releases de GitHub como fuente de actualizaciones
- Cada release incluye un ZIP distributable limpio (
discount-rules-woo-vX.X.X.zip) adjunto automáticamente por el nuevo workflowbuild-release.yml
Infraestructura CI/CD
- Nuevo workflow
.github/workflows/build-release.yml: se activa al publicar un release, genera un ZIP limpio del plugin (sin.git,.github,vendor,tests,scratch) y lo adjunta al release para que WordPress lo use en las actualizaciones
Checklist CI
- ✅ PHP Syntax Check (7.4, 8.0, 8.1, 8.2)
- ✅ WordPress Coding Standards (PHPCS)
- ✅ Security Scan
v1.3.6 — Global Settings & Configuration Panel
What's New
Global Settings & Configuration System
A new centralized settings panel with full control over plugin behavior.
REST API Endpoints (/drw/v1/settings):
GET /drw/v1/settings— Retrieve all settingsPOST /drw/v1/settings— Save settingsPOST /drw/v1/settings/reset— Reset to defaultsGET /drw/v1/settings/types— List discount typesGET /drw/v1/settings/conditions— List conditionsGET /drw/v1/settings/themes— List theme presets
SettingsModel (src/Models/class-settingsmodel.php):
- Dot-path key access (
discount_types.bulk.max_tiers) - 12-hour transient cache
- Deep merge defaults with saved values
- 4 built-in theme presets: Default, Dark, Colorful, Minimal
Settings Groups:
- Discount types (percentage, fixed, bulk, BOGO, bundle_set, free_shipping)
- 17 condition types (cart, user, product)
- 4 filter types
- Rules behavior (combination strategy, apply order)
- Theme & colors
- General features
CI:
- All 6 checks pass: PHP Syntax (7.4–8.2), WordPress Coding Standards, Security Scan
v1.3.5 — Fix mobile grid, badge z-index, clear filter
Cambios en v1.3.5
Correcciones urgentes de UI y comportamiento
Grid móvil — 4 columnas → 2 columnas en teléfono
El container-type: inline-size estaba en .drw-sale-items-grid (el propio grid), lo que impide que las @container queries funcionen porque un elemento no puede consultarse a sí mismo. Se movió a .drw-sale-wrap (el contenedor padre) y se añadieron @media queries como fallback:
- Móvil ≤767px → 2 columnas
- Tablet y desktop → columnas configuradas (default 4)
Badge "-15%" aparecía sobre el header al hacer scroll
El badge tenía z-index: 10 sin contexto de apilamiento propio, lo que permitía que "escapara" sobre elementos fijos del tema. Se añadió isolation: isolate a .drw-sale-item para que el z-index quede encapsulado dentro de la card.
Badge inconsistente en catálogo/tienda
En las páginas de catálogo WooCommerce el badge (position: absolute) se posicionaba relativo a un ancestro lejano porque el enlace de la imagen no tenía position: relative. Se añadió CSS defensivo para .woocommerce-loop-product__link.
Botón "✕ Limpiar" en el filtro de categorías
Al seleccionar una categoría aparece un botón rojo "✕ Limpiar" que resetea el filtro y recarga el grid vía AJAX sin recargar la página. Al volver a "Todas las categorías" el botón desaparece.
Sort bar responsive en móvil
En pantallas <640px los selectores de categoría y orden se apilan en columna a ancho completo, en lugar de desbordarse horizontalmente.