Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/yosdeny/ygb-ofertas/archive/refs/heads/main.zipPlugin para mostrar popups de ofertas de productos, compatible con WooCommerce y con el tema Astra.
Description
YGB Ofertas permite mostrar un popup promocional con un producto concreto de tu tienda WooCommerce. Está pensado para destacar ofertas puntuales sin modificar el tema ni el núcleo de WordPress.
Características principales:
- Popup configurable desde el escritorio de WordPress (menú YGB Ofertas).
- Selección de un producto específico de WooCommerce mediante buscador AJAX (por nombre o ID).
- Personalización de diseño: color de botón, color de texto, color de fondo, color del overlay, ancho y animación (desvanecer, deslizar, zoom).
- Control de comportamiento: retraso de aparición, mostrar en cada visita, popup de salida (exit intent), popup al hacer scroll con porcentaje configurable y expiración de cookie.
- Programación por fechas: mostrar de inmediato o dentro de un rango de fecha/hora de inicio y fin.
- Segmentación por dispositivo: desactivar en móviles y/o tablets.
- Restricción por páginas: mostrar solo en páginas seleccionadas (inicio, tienda, carrito, finalizar compra, etc.).
- Dos tipos de contenido: producto de WooCommerce o solo una imagen (ambos con botón opcional).
- Lista de productos excluidos para impedir que aparezcan en el popup.
- Compatible con el tema Astra.
Installation
- Sube la carpeta
ygb-ofertasal directorio/wp-content/plugins/o instala el plugin subiendo el archivo ZIP desde Plugins → Añadir nuevo → Subir plugin. - Activa el plugin en el menú Plugins de WordPress.
- Asegúrate de que WooCommerce está instalado y activo (el plugin lo requiere para leer los productos).
- Accede a YGB Ofertas en el menú lateral del escritorio para configurar el popup.
Frequently Asked Questions
¿Necesito WooCommerce?
Sí. El plugin usa las APIs de producto de WooCommerce (wc_get_product, wc_price) para obtener los datos que se muestran en el popup. Si WooCommerce no está activo, el plugin muestra un aviso y no carga sus funciones.
¿Dónde se guardan los ajustes?
En la opción ygb_ofertas_settings de la tabla wp_options del sitio actual. La lista de productos excluidos se guarda en ygb_ofertas_excluded_products. En una instalación multisite, cada sitio tiene su propia configuración.
¿El popup se muestra a usuarios ya suscritos o que lo cerraron?
Depende de la configuración. Con la cookie activa, el popup no vuelve a mostrarse hasta que expira (por defecto según el valor de "Expiración de la cookie"). Con la opción "Mostrar siempre" se ignora la cookie.
¿Cómo evito que un producto concreto aparezca en el popup?
Tienes dos vías: la pestaña Productos Excluidos dentro de la configuración del plugin, o la casilla de exclusión en la pantalla de edición del propio producto.
¿Es compatible con temas distintos de Astra?
Está desarrollado y probado con Astra, pero al usar hooks estándar de WordPress (wp_enqueue_scripts, wp_footer) debería funcionar con la mayoría de temas correctamente codificados.
¿Puedo usar HTML en la descripción del popup?
Sí. El campo Descripción de la pestaña General admite HTML limitado a la allowlist de WordPress: strong, em, b, i, a, br, ul, ol, li, p, span, h1–h6, blockquote, etc. Al guardar se filtra con wp_kses_post() y al mostrarlo se aplica wpautop() (convierte saltos de línea en párrafos) más un segundo wp_kses_post() como defensa en profundidad. No se permiten atributos style inline ni etiquetas script, iframe, object, form; tampoco eventos on* ni javascript: en href.
Screenshots
- Pestaña General: estado del popup, título, descripción y texto del botón.
- Pestaña Diseño: colores, animación y ancho del popup.
- Pestaña Producto: buscador AJAX de productos de WooCommerce y modo "Solo una imagen".
- Pestaña Programación: rango de fechas y páginas específicas.
Changelog
1.8.3
- El campo Descripción de la pestaña General admite ahora HTML. Al guardar se filtra con
wp_kses_post()(allowlist estándar de WordPress:strong,em,a,br,ul,li,p,h1–h6, etc.) en lugar desanitize_textarea_field(), que eliminaba todo el marcado y dejaba el campo inservible para dar formato. - En el frontend la descripción se renderiza con
wpautop( wp_kses_post( $descripcion ) ):wpautop()convierte los saltos de línea del texto plano en párrafos ywp_kses_post()vuelve a filtrar como defensa en profundidad (por si el valor llega modificado por migración, import o SQL directo). - Retirado el envoltorio
<p>fijo del bloque.popup-descriptionentemplates/popup-template.php: ahora el usuario controla los bloques ywpautopya añade los<p>necesarios para texto plano. - No se permiten atributos
styleinline ni etiquetasscript,iframe,object,form; tampoco eventoson*nijavascript:enhref. Si necesitas colores o tipografías personalizadas, la vía correcta es añadir una clase al contenedor.popup-descriptiony definirla en el tema. - El
<textarea>del panel pasa arows="6"yclass="large-text code"(fuente monoespaciada) para editar HTML con comodidad. El texto de ayuda de la fila indica qué etiquetas están permitidas. - Retrocompatibilidad: las descripciones guardadas en texto plano se siguen viendo correctamente porque
wpautoplas convierte en párrafos. Las descripciones que ya contuvieran HTML (antes se veían como texto literal porqueesc_htmllas escapaba) ahora se renderizan como HTML, que es el comportamiento esperado. - Unificada la versión en todos los ficheros a 1.8.3 (header, constante
YGB_OFERTAS_VERSION,admin.js,popup.jsy este readme).
1.8.2
uninstall.phpreescrito con prefijos EXCLUSIVOS del plugin (ygb_ofertas_/_ygb_ofertas_): al desinstalar ya no se borran opciones, transients, metadata, roles ni capacidades de otros plugins que pudieran compartir el prefijo genéricoygb_. La limpieza de multisite ahora pagina en lotes de 500 sitios en lugar de usar un tope fijo.- Corregida la pérdida de decimales en "Retraso en la visualización":
popup.jsusaparseFloaten lugar deparseInt, así que un valor de 5.5 s se respeta. - Corregida la división por cero en el trigger de scroll: si la página cabe entera en el viewport, el popup ya no se dispara sin que el usuario haya hecho scroll.
- Cookie
ygb_ofertas_shownconSameSite=Laxpara evitar su envío en peticiones cross-site. - Eliminado el aviso de administración muerto que leía
settings-updated(los ajustes se guardan por AJAX, nunca llega ese parámetro). - Simplificada la carga del textdomain: se llama directamente desde el constructor en lugar de registrar un callback extra a
initque podía no dispararse. admin_enqueue_scripts()usa coincidencia exacta de hook en lugar destr_contains, para no cargar assets en pantallas ajenas con ese substring.- Accesibilidad del popup:
role="dialog",aria-modal="true",aria-hidden,aria-labeltraducible ytype="button"en los botones de cierre. El símbolo×queda como decorativo (aria-hidden). - En el modo "Solo una imagen" ya no se renderiza el bloque de nombre y precio del producto: la plantilla condiciona
.popup-headery.popup-productal tipoproduct. El título del adjunto se sigue usando solo como atributoaltde la imagen. - Imagen responsiva en modo imagen: se dimensiona contra el ancho en píxeles del popup (variable
--ygb-popup-width) en lugar de un 100% relativo; mantiene la proporción original sin recortes ni deformaciones. - Imagen de producto en un marco cuadrado de 300×300 px en escritorio (pequeño ajuste en móvil), con
object-fit: contain, centrada y sin recortes. - Precio del producto en color rojo (
#ff0000). - Unificada la versión en todos los ficheros a 1.8.2 (antes había discrepancias entre el header, la constante,
admin.js,popup.jsy este readme).
1.8.1
- Eliminada la opción "Imagen + texto propio" del tipo de contenido del popup: su título y su texto se mezclaban con el título y la descripción generales del popup y resultaba confuso. El popup vuelve a ofrecer dos tipos de contenido: producto de WooCommerce o solo una imagen (ambos con botón opcional).
- Migración automática: las instalaciones que tenían activo ese modo pasan a "Solo una imagen" si había una imagen guardada; si no, vuelven al modo producto. Los campos
custom_titleycustom_textdejan de leerse, guardarse y renderizarse.
1.8.0
- En el modo Solo una imagen (sin producto) el alto de la imagen es libre: se quita el
max-heightfijo y el recorte (object-fit: cover) para que la imagen del popup se vea completa, sin cortes. - La vista previa de la imagen en el panel de configuración tampoco limita el alto, por coherencia con lo que se verá en el popup.
1.7.10
- Corrección del error
ygb_ofertas is not defined: el plugin se inicializa ahora eninit(prioridad 0) en lugar deplugins_loaded, donde la claseWooCommerceaún podía no estar definida. - Carga del textdomain reenganchada a
initcon prioridad 1 para que no quede sin ejecutar tras el cambio anterior. - Implementada la restricción por páginas específicas (
specific_pages_only), que hasta ahora se configuraba en el panel pero no tenía efecto: ahora limita la carga de assets y el render a inicio, tienda, carrito y finalizar compra. - Normalización de la comprobación del estado del popup (
enabled) para tolerar valores guardados como entero o cadena. - Normalización en JavaScript de los ajustes booleanos y numéricos del popup, que podían llegar con tipos distintos según cómo los serializara
wp_localize_script. - Guarda contra
wc_get_product()devolviendofalseen el buscador AJAX de productos del panel.
1.7.9
- Endurecimiento de seguridad: escapado contextual de todas las salidas (
esc_html,esc_attr,esc_url,esc_textarea,esc_js,wp_kses_post). - Validación de colores HEX de 3 y 6 dígitos y de valores
rgba()antes de inyectarlos en atributos de estilo. - Validación estricta del formato
datetime-localen las fechas de programación. - Sanitización de la lista de productos excluidos como enteros únicos.
- Corrección de marcado HTML en la pestaña Producto.
1.7.8
- Mejoras en la selección de producto y en la vista previa del escritorio.
1.7.0
- Añadida programación por fechas y segmentación por dispositivo.
1.0.0
- Versión inicial.
Upgrade Notice
1.8.3
- La Descripción del popup admite ahora HTML limitado a la allowlist de WordPress (
strong,em,a,br,ul,li,p...). Los sitios que tuvieran HTML en ese campo empezarán a verlo renderizado en lugar de como texto escapado. No requiere ninguna acción por parte del usuario: la migración es transparente. - No se permiten atributos
styleinline; si necesitas colores personalizados, añade una clase al contenedor.popup-descriptionen tu tema.
1.8.2
- Corregido el
uninstall.php: usa prefijos exclusivos del plugin para no borrar datos de otros plugins al desinstalar. Si vas a eliminar YGB Ofertas, actualiza primero a esta versión. - Diversas correcciones de robustez en el frontend (decimales del delay, scroll sin overflow, SameSite en la cookie).
- Mejoras de accesibilidad y de maquetación del popup.
1.8.1
- Eliminada la opción "Imagen + texto propio" del tipo de contenido del popup: su título y su texto se mezclaban con el título y la descripción generales del popup y resultaba confuso. El popup vuelve a ofrecer dos tipos de contenido: producto de WooCommerce o solo una imagen (ambos con botón opcional).
- Migración automática: las instalaciones que tenían activo ese modo pasan a "Solo una imagen" si había una imagen guardada; si no, vuelven al modo producto. Los campos
custom_titleycustom_textdejan de leerse, guardarse y renderizarse.