Dashboard unificado: roadmap de landings SEO long-tail + plan de proyecto del personalizador.
Decisiones tomadas, flujo de conversión y arquitectura del ecosistema SEO.
Google · ChatGPT · Perplexity · SGE · Bing Copilot. Usuario busca long-tail ("DTF para camisetas")
Llega a landing específica. Contenido único optimizado para su intención de búsqueda
Click en CTA → página de producto. Info completa, precios, FAQs. Autoridad se acumula aquí
"Hacer pedido" → calculadora con imposición visual. Precio al instante
Añadir al carrito → pago. Tracking del funnel completo con ?from=slug
Landings DTF/DTI/UV enlazan a /dtf-por-metros/ (no a la calculadora directamente). Esto construye autoridad interna sobre el producto, que ranquea mejor para keywords principales.
Cada producto tiene su ecosistema de landings long-tail bajo su URL: DTF tiene 5 landings hijas, DTI tiene 3, UV tiene 5, etc. Google reconoce el grupo temático y posiciona mejor toda la familia.
Organization global con @id + Product + HowTo + FAQPage + BreadcrumbList en cada landing. ChatGPT/Perplexity/SGE citan estas páginas en sus respuestas.
Cada CTA lleva ?from=slug-landing. Permite analizar en Google Analytics qué landings convierten mejor y dónde invertir más contenido.
Las landings no son posts de WP — son URLs virtuales generadas desde arrays PHP + rewrite rules. Añadir 50 landings más no crea overhead en el WP ni llena la base de datos.
43 landings son indexables (robots: index, follow, max-image-preview:large). Solo 2 URLs internas (/personalizer-docs/ y /personalizer-plan/) tienen noindex.
Cada página inyecta 6 schemas JSON-LD que los AI answer engines usan para construir respuestas. Esto nos posiciona como fuente autoritativa cuando alguien consulta un tema DTF/DTI/UV.
knowsAbout y makesOffer — AI mapea la empresa@id. Google construye knowledge panelSistema paralelo a camisetas. Cada producto tiene su propio long-tail SEO. Ya hay 21 landings activas — la expansión completa suma ~60-80 landings adicionales.
Pendientes long-tail:
Pendientes long-tail:
Pendientes long-tail:
Pendientes long-tail:
Pendientes long-tail:
Sistema activo en /polos-personalizados/{slug}/
Sistema activo en /sudaderas-personalizadas/{slug}/
El dashboard principal de /herramientas/ ya tiene el restyle aplicado (color indigo + SEO + nav estándar), pero las páginas internas/subpáginas de cada herramienta individual todavía tienen estilos inconsistentes y no están alineadas con la nueva identidad visual del sitio.
/calculadora-dtf-imposicion/ — Montar tu pedido (imposición visual)/herramientas-dorsales/ — Generador de dorsales deportivos/editor-escudos/ — Editor 3D de escudos UV🎯 Objetivo: unificar con el color identity indigo (#4f46e5) de Herramientas, nav estándar, tipografías Epilogue + Plus Jakarta Sans, y coherencia visual con el resto del sitio.
Referencia de los archivos PHP que manejan cada página del sitio. Se encuentran en wp-content/mu-plugins/ (mu-plugins) o wp-content/themes/hello-elementor/ (theme templates).
srdtf-landings-template.php → función srdtf_landings_data()srdtf-product-landings.php → función srdtf_product_landings_data()srdtf-seo-ai.phpwp rewrite flush vía SSH o visitar Ajustes → Enlaces permanentes → Guardarwp breeze purge --cache=all + purge VarnishEstado de la calculadora de imposición. Objetivo: llegar al nivel de Onyx/Caldera/Fiery en automatización y aprovechamiento del pliego.
Partiendo del 60-70% en auditoría inicial. v5.50.0 alcanza ~96-97% con polygon-aware nesting raster a 2.5mm + padding correcto del gap entre tintas + render limpio (sin outlines rojos cruzándose). Pieza ▽ encaja en el hueco entre dos ▲ cuando la geometría lo permite. Siguiente fase: módulo plotter/cutter con OPOS marks (semana que viene).
try/finally en autoOptimize para evitar estados colgados.freeRects (top 100 + bottom 50) — evita degradación O(n²).totalH empata.refreshSueltos para uploads masivos.w > PW && h ≤ PW (antes rotaba siempre que w > h).R.B · 3/5.GAP_MM.R rotar · D duplicar · Supr borrar pieza · Shift+clic seleccionar · Esc limpiar.Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y.100vw + margin-left: calc(50% - 50vw).Del 85-88% al 90-91% nivel Onyx en v5.36.0. Web Worker + Algoritmo Genético + Density Meter desplegados en producción.
Pack movido a pack-worker.js. Optimización 2^N rotaciones + tournament en hilo separado. UI nunca se bloquea. Barra de progreso con porcentaje en tiempo real, backdrop-blur overlay. Comandos optimize y optimize-genetic completan todo el loop en 1 round-trip.
Sustituye el greedy fallback cuando hay más de 10 archivos (donde 2^N explota a millones). Población 16-40 · Generaciones 10-25 adaptativo · Tournament selection · Uniform crossover · Mutación 12% · Elitismo 15%. Memoización por máscara de rotaciones. Seeds iniciales: todo-sin-rotar, todo-rotado, greedy narrower.
Badge flotante top-right con porcentaje de aprovechamiento del pliego (piezas / bbox total). 3 niveles de color: verde ≥85% · amber 70-85% · rojo <70%. Feedback visual instantáneo tipo Onyx/Caldera.
Al arrastrar una pieza volvía a su sitio original. Causa: el snap 5mm trataba la posición inicial como imán. Fix: el snap solo se activa tras moverse >5px y se excluye la posición de origen de los targets.
Tras ganar el tournament, el worker aplica gravedad en 2 ejes (hacia arriba + hacia izquierda) hasta estabilizar (máx 4 iteraciones). Cierra los huecos típicos que dejan MaxRects/Skyline tras colocar piezas grandes. Espejo exacto del compactManualLayout() del botón "Compactar" → ahora manual y auto coinciden.
El gran salto. Cada PNG genera una máscara binaria coarse (≤32 celdas/lado) durante el auto-trim. El worker rasteriza cada pieza a una rejilla de 5mm y comprueba colisión a nivel celda — no a nivel bbox. Resultado: dos escudos pueden solapar sus bounding boxes mientras sus partes opacas no se toquen. Bottom-Left scan + sort por área desc. Compite contra los 21 packers rectangulares y se queda el mejor.
La evolución real del v5.38. Nesting raster a resolución 2.5mm con máscaras coarse de 128×? celdas. Tournament multi-estrategia con semillas de rotación forzadas (0°/90°/180°/270° × 3 sorts = 12 layouts) para evitar el bias de "primera pieza siempre horizontal" que impedía el interlock vertical. El gap entre tintas se enforce con padding + Chebyshev dilation — antes la dilatación se clipeaba al borde del bbox y el gap real era 0. Render sin outlines rojos cruzándose: las piezas de raster ocultan borde y label (sólo tinta limpia), outline temporal al hover.
Segundo modo de producción que convive con el de tijera actual. El cliente elige en el checkout si corta con tijera (como ahora) o con plotter/cutter (gap 2mm + OPOS marks + SVG de corte). Estimado: 3-4 días.
Ampliar las 4 rotaciones del raster a 8-12 ángulos. Permite encajar piezas diagonales/irregulares (ej. letras cursivas, logos esquinados). Cuidado: explosión combinatoria × 4 de tiempo.
Bounding box rotado por cada ángulo + tournament extendido. Encaja piezas diagonales/irregulares.
Detectar huecos internos con connected-components, priorizar piezas pequeñas para rellenarlos antes de apilar en altura.
Cuando totalH > PH × 1.5, repartir en N hojas. FFDH + rebalanceo. Preparado para máquinas de tamaño fijo.
Durante el genético, mostrar carrusel de las 3 mejores soluciones candidatas. El usuario elige cuál prefiere (no siempre la más compacta es la óptima para producción).
Solo si la competencia directa lo tiene. Objetivo: 92-95%. Estimación: ~1 semana.
Nesting por contorno real del diseño (no bbox). Con PNGs llenos de transparencia (logos, letras sueltas) es la diferencia entre 88% y 95%. Basado en deepnest (open-source) o port propio de Minkowski sums.
background-size: contain en PHP (letterbox centrado) · fin de piezas aplanadas en columna derecha_srcRotate canónico propagado por BL / raster / manual snapshot / duplicate / rotateManualPiecemax(y+h))Registro de diagnóstico y correcciones SEO técnico. Orden cronológico inverso.
@graph completo (Organization + WebSite + LocalBusiness + ItemList + WebPage) con meta robots, hreflang, GeoCoordinates, paymentAccepted, hasMap, Speakable./servicio-de-planchado/ corregido (apuntaba a sublimación)./tienda/ corregido + página 42 publicada (estaba en draft).<title> / <canonical> eliminados en 12+ templates.sitemap-landings.xml reparado (devolvía HTML, ahora XML válido).X-Robots-Tag: noindex, follow eliminado de sitemaps XML.FAQPage duplicado en /calculadora-dtf/ eliminado.Organization + WebSite globales via srdtf_emit_global_organization_graph().email, address, contactPoint × 2 (customer service + sales)./herramientas/ corregido (H1 → H2 en plugin)./tienda/ (vacía por ser archive Woo).Speakable schema añadido a 12 páginas clave para voice search / IA.SrDTF asignado a posts huérfanos (post_author=0).og_image específico en páginas institucionales.decoding="async" + loading="lazy" al 95 % de imágenes (preservando LCP).Impacto esperado en 3 meses: +25 % a +60 % tráfico orgánico. Mejora CWV por performance hints. CTR rich results en SERP. 10 posts indexables con E-E-A-T reforzado (outbound links a Wikipedia, OEKO-TEX, AATCC, ISO). Topic authority creciente en DTF. AggregateRating 5.0/5 visible en SERP (estrellas amarillas en snippet) cuando Google re-indexe la home tras el 21 abr.
Sesión de productos: 2 nuevos productos con calculadora interactiva, 1 categoría hub SEO, nav centralizado y plugin de tarifas multi-variante editable desde admin.
srdtf-pricing-tiers.php v2.0 — variants + admin editable de plazossrdtf-shared-nav.php — menú centralizado + Live Searchsrdtf-category-landings.php — sistema reutilizable de landings hubsrdtf-product-camisetas-tecnicas.php + srdtf-product-etiquetas-carton.php + srdtf-category-dtf-textil.php (3 templates en theme/)Tres capas trabajando en paralelo: recordatorios automáticos · reseñas de producto · reseñas Google en home.
processingprocessing#review_formholdpedidos@srdtf.com con enlace "aprobar en 1 clic"Ver en vivo: search.google.com/search-console
Product + BreadcrumbList hardcodeados del final de los 5 templates de producto (ya los emite srdtf-seo-ai.php).FAQPage (tienen HTML visible y seo-ai.php no los emite).GeoCoordinates al LocalBusiness de home.html (contacto ya lo tiene).hasMap con URL Google Maps.PaymentAccepted y currenciesAccepted.AggregateRating + Review a productos principales (requiere reviews reales de clientes — Google detecta ratings falsos).returnPolicy y warranty en Offer.Speakable schema a FAQs (Google Assistant, Alexa).QAPage donde aplique.Article / BlogPosting a posts del blog con author + datePublished.knowsAbout y knowsLanguage en Organization.width+height en todas las <img> para evitar CLS.<link rel="alternate" hreflang="..."> adicionales a home.html./camisetas-personalizadas-tecnicas/. Calculadora multi-atributo: cantidad (mín 10) × 2 plazos (Express 8-9d / Estándar 10-11d -5%) × tallas mezcla libre niños 4-12 + adultos XS-5XL × addons (diseño profesional +25€, numeración pecho +2€/ud, numeración espalda +2,5€/ud). Tabla jugadores estilo dorsales (importar CSV o añadir manual). Galería con 2 mockups (orange/grunge + RUN WILD). Guía de tallas con foto real + marcas A/B + tabs Unisex/Mujer interactivos. Descarga directa de patrones Hombre/Mujer (ZIPs 5,5+6,7 MB con 5 PDFs cada uno). Schema Product + AggregateOffer + tier pricing. SEO: "camisetas técnicas full print personalizadas"./etiquetas-carton-personalizadas/. Calculadora multi-variante: cantidad (mín 100) × 3 plazos (Express 2-3d / Estándar 4-5d / Económico 7-10d) × impresión (1 cara / 2 caras) × 7 acabados (Sin laminar / Brillo 1c-2c / Mate 1c-2c / Soft Touch 1c-2c agrupados visualmente). 11 variants × 504 tramos interpolados cada 50 uds desde 100→2500. Soft Touch corregido a Brillo × 1.20 (resuelve incongruencia detectada en CSV original). Diseño profesional +15€. Imagen producto: hangtag SR DTF blanco/negro con cuidados. Schema Product + AggregateOffer + Service. SEO: "etiquetas hangtag personalizadas marcas"./dtf-textil/. Landing premium agrupando los 2 servicios textiles (DTF + DTI) con: Hero, "¿Qué es DTF Textil?", 2 cards comparativas, tabla DTF vs DTI con 9 filas, regla simple de decisión, 12 casos de uso, CTA calculadora destacada, FAQ con 8 preguntas. Schema CollectionPage + Service + OfferCatalog + FAQPage + BreadcrumbList. Internal linking a 3 posts blog relacionados. Plantilla SEO para futuras categorías hub.<nav> hardcoded en 6 templates de producto + home.html. Una sola edición de array → cambio en TODAS las páginas. Mobile drawer con accordeons. Botón "Hacer pedido" eliminado por feedback usuario (ganamos espacio)./etiquetas-carton-personalizadas/ vs Srflyer /etiquetas-carton). Keywords no canibalizados: "etiquetas hangtag personalizadas marcas" vs Srflyer "etiquetas cartón colgantes ropa"./ 200 · checkout 302 (redirect WC normal) · todas páginas producto 200. Stripe checkout intacto. Backups creados (.bak-20260502-nav y .bak-20260502-reviews) por si rollback necesario.srdtf-review-reminder.php. Hook woocommerce_order_status_processing programa un wp_schedule_single_event a 7 días. Email HTML responsive con logo SR DTF blanco sobre pastilla naranja (logo subido como attachment 7048), CTA al #review_form del producto, firma pedidos@srdtf.com. SMTP via Gmail App Password.pre_comment_approved fuerza status=hold en reseñas tipo review. Hook comment_post dispara email de aviso a pedidos@srdtf.com con enlace directo a wp-admin/comment.php?c=ID&action=approve. Cliente, rating, texto y producto visibles en el email.srdtf_schedule_catchup_reminders($per_day=30, $days_to_spread=4, $dry_run=false, $start_today=false). Escanea pedidos antiguos en processing sin meta _srdtf_review_reminded, programa recordatorios escalonados. 113 emails programados 21-25 abr 2026. Marca meta para idempotencia.srdtf-reviews-display.php con función srdtf_render_reviews_block($product_id). Renderiza: avg rating 6xl, distribución por estrellas con barras, CTA "Escribir reseña", lista reviews con avatares color-coded, respuestas del vendedor con logo SR DTF, estado vacío elegante. Integrado en los 5 templates de producto principales (DTF · DTI · DTF UV · Sublimación · Escudos UV 3D) + en srdtf-escudos-restyle.php.srdtf-gbp-reviews-widget.php. Llama a Places API (New) una vez al día (cron 06:00 Europe/Madrid), cachea en wp_option srdtf_gbp_cache. Fallback robusto: si la API falla, el widget mantiene la última caché válida. API key restringida por IP al servidor Cloudways (165.232.121.151). Free tier (10.000 req/mes) → consumo real ~30/mes.<head> de home con datos reales. Resuelve el "info 12 · Product sin AggregateRating pendiente de reviews reales" que arrastrábamos del Ciclo C. 5 reseñas reales · rating 5.0/5 emitidos como JSON-LD Organization → aggregateRating.Ajustes → Reseñas Google en wp-admin: estado (rating, count, última sync, próximo cron, log), botones "Sincronizar ahora" y "Limpiar caché", formulario config API key + Place ID (password field + ocultos en BBDD con autoload=no), tabla con las reseñas cacheadas. Zero SSH necesario para mantenerlo.front-page.php del tema reescrito para: (a) str_replace del placeholder <!-- SRDTF_GBP_REVIEWS --> con el output del widget; (b) inyección del JSON-LD Review antes de </head>. Si el widget devuelve vacío, el placeholder se queda como comentario invisible (no rompe layout)./ 200 · /finalizar-compra/ 302 (redirect WC estándar) · /carrito/ 200 · /mi-cuenta/ 200. Stripe checkout intacto. Primera sync manual OK: "Sync OK — 5 reseñas (avg 5)". Próximo cron: 22 abr 08:00.@srdtf.com (Workspace policy) e imprentasrflyer@gmail.com (resourcemanager.projects.create denied) fallaron. Solución: proyecto creado bajo organización Grupo Titaco S.L. en Google Cloud, con 300 USD de crédito + 10k req/mes gratis en Places API. Cero coste real esperado.DTF UV 3D, DTF vs Vinilo, Preparar archivo DTF, Precio 50 camisetas, Equipaciones deportivas clubs.fetchpriority="high" + decoding="async" a la imagen LCP de 6 templates de producto (dtf, dti, dtf-uv, sublimación, escudos-product, escudos-restyle). <link rel="preload" as="image"> para la imagen hero. <link rel="preconnect"> a cdn.tailwindcss.com. LCP esperado −300/−600 ms.seo-validator.py y faq-validator.py en la raíz del proyecto local para auditorías recurrentes./tmp/seo-validator.py): descarga 16 URLs clave, extrae todos los JSON-LD blocks, aplica reglas de Google Rich Results por @type (Product requiere image+price+availability, Article requiere headline+author, FAQPage requiere HTML visible, etc.).srdtf-product-landings.php ahora emite image + offers.price + priceValidUntil + shippingDetails completos (con fallbacks por familia). Offer → AggregateOffer para escudos.#website: nuevo parámetro $include_website en srdtf_emit_global_organization_graph(). En wp_head pasa false (Yoast ya lo emite). En landings virtuales pasa true (Yoast no corre). Elimina duplicación en 14 páginas.wpseo_schema_webpage filter: añade inLanguage="es-ES" al WebPage de Yoast cuando falta.faq-validator.py) aplica tolerancia a parafraseo, acentos, normalización. Resultado real sobre las 37 preguntas totales: 18 literales + 17 parafraseadas + 2 marginales + 0 inválidas. Google Rich Results ACEPTA las FAQs actuales.srdtf-seo-extras.php que emite AggregateRating solo si hay reviews reales (silencioso si 0, evitando penalizaciones de ratings falsos). Activo para productos WC y páginas mapeadas al product_id.Article + BreadcrumbList redundantes removidos de srdtf-blog-restyle.php. Yoast emite versión completa con primaryImageOfPage, mainEntityOfPage, author, publisher con @id linkados.SrDTF. Autor ya no aparece vacío en schema.srdtf-related-links.php. Detecta topic por contenido y añade sección "También te puede interesar" al final de cada post del blog con 4 enlaces contextuales.og_image específico.srdtf-image-optim.php.ob_start() site-wide interfirió con el JSON de configuración de Stripe en checkout → Payment Element no inicializaba → clientes no podían pagar. Plugin eliminado. WP 6.9.4 ya añade loading="lazy" nativamente en contenido.ob_start() site-wide sin excluir is_checkout(), is_cart(), is_account_page() y is_wc_endpoint_url(). Preferir filtros específicos (the_content, wp_get_attachment_image_attributes) a output buffering global.dtf, dti, dtf-uv, sublimacion, escudos-uv-3d). Una sola fuente: srdtf-seo-ai.php.GeoCoordinates (40.5419, -3.6224), hasMap, paymentAccepted, currenciesAccepted, email, logo, areaServed.address completo, email, contactPoint × 2 (customer service + sales ES/PT/FR/IT).srdtf_emit_global_organization_graph() en srdtf-seo-ai.php reutilizable desde landings virtuales (que hacen exit antes del wp_head)./camisetas-personalizadas/*, /{producto}/{slug}/) ahora emiten Organization + WebSite globales.srdtf-landings-template.php (ya está vía helper global).srdtf-seo-extras.php: meta description para /tienda/, Speakable schema en 10 páginas, max-image-preview:large a nivel robots./herramientas/ corregido (h1 → h2 en plugin srdtf-calculator)./tienda/ limpio./calculadora-dtf/ resuelto: srdtf-calculator/includes/faq.php ahora sólo emite JSON-LD si [srdtf_faq] está en contenido. Bloque duplicado removido del mu-plugin restyle.srdtf_render_landing_not_found().00-srdtf-sitemap-headers.php: filtra wpseo_sitemap_http_headers para quitar X-Robots-Tag: noindex.srdtf_seo_override() en srdtf-product-templates.php: fuente única de verdad para title/description/canonical/og/robots usando filtros Yoast./servicio-de-planchado/ corregido (apuntaba a sublimación).home.html enriquecido con @graph completo (Organization + WebSite + LocalBusiness + WebPage + ItemList), hreflang, OG ampliado, Twitter Card.srdtf-seo-ai.php (añadidos sublimación y escudos UV 3D).sitemap-landings.xml reparado: interceptor parse_request + versión 1.1.0 de flush.home.html estático (via front-page.php) sin wp_head() → sin Yoast → schema minimalista.lastmod del sitemap desfasado (Yoast 2026-03-07 vs Last-Modified 2026-04-19) → Google no re-crawlea home.<title> y <canonical> duplicados por solapamiento template+Yoast.sitemap-landings.xml devolvía HTML en lugar de XML (rewrite rules no aplicadas).sitemap_index.xml cada vez que se publiquen nuevas landings masivas.Historial de cambios desplegados en producción. Orden cronológico inverso.
Refactor de la cadena de generación del pliego para garantizar que lo que el cliente monta en la herramienta es exactamente lo que paga y lo que se descarga. Resueltos 2 bugs de fidelidad: piezas deformadas en la columna derecha y altura del PNG mayor que la del pliego en pantalla.
total_h_cm usado por UI, cálculo de precio y canvas PHP derivan de la misma fuente (max(y+h) del packing real). Antes el pliego descargado podía ser más alto o más bajo que el que el cliente había aprobado._srcRotate — sustituye el XOR frágil de fileRotated ⊕ packRotated que se perdía al tomar snapshot manual, duplicar pieza o volver del modo raster. Ahora un solo booleano viaja por BL-packer, raster-cutter, snapshot manual y payload de descarga; rotateManualPiece lo togglea y duplicatePiece lo hereda.background-size: contain — la UI pintaba cada PNG con CSS contain mientras que PHP estiraba con imagecopyresampled. Las piezas de la derecha (que recibían una bbox con aspecto distinto al natural) salían aplanadas. Ahora PHP calcula dst_w/dst_h por letterbox dentro de la bbox y centra la imagen.autoRotated=true pre-swapeaba dimensiones y marcaba f.rotated=true, produciendo doble swap). PHP ignora los flags en modo rectángulo y decide rotación comparando diff_0 vs diff_90 sobre la bbox destino. Robusto ante cualquier combinación de flags upstream.total_h_cm mayor que el contenido real (caso 78.3cm UI vs 83.2cm PNG). Ahora PHP recalcula el alto efectivo iterando las piezas colocadas: si real_max_y < total_h_cm, el canvas se recorta al contenido real. El PNG queda idéntico al pliego en pantalla.assets/js/calculator.js · includes/pliego-download.php · srdtf-calculator.php (SRDTF_CALC_VERSION).localStorage — al refrescar la página ahora se pierde el layout y el cliente tiene que volver a montar el pliego.pliego-composer.php hardcodeaba el canvas a 100 cm ignorando el alto real del packing. Cualquier imposición que superase 100 cm se cortaba al subir a Dropbox.imagecolorallocatealpha(0,0,0,127) + imagesavealpha(true) en canvas y en cada PNG fuente + fondo transparente al rotar 90°.srdtf_team + capability srdtf_unlimited_downloads para equipo interno (descarga gratis). Log de descargas en Usuarios → SR DTF Downloads.dH = Math.max(20, totalH + 3) en lugar de forzar mínimo 100 cm: los pliegos cortos ya no arrastran scroll en blanco.Auditoría completa del editor en /editor-escudos/ a raíz del PDF de feedback. 5 fallos reportados, diagnóstico técnico con archivo+línea y fix propuesto.
editor.js:539 crea fabric.Path sin fillRule: 'evenodd'. Fix: aplicar even-odd al Path + tests con caracteres con hueco.fabric.Pattern cacheado, PDF regenera procedural en canvas nuevo. Fix: unificar pipeline.applyBleedToImage():634 fija alpha=255 pero el usuario espera preservar alpha original. Fix: alpha = src[idx*4+3].editor.js:1786-1789 pierde precisión en dimensiones no divisibles por 300 DPI. Fix: cálculo DPI-aware + clip exacto a [0,0,imgW,imgH]./assets/textures/ y extender textureRegistry para soportar PNG además de procedurales. Estimación total auditoría + integración: ~14 h.Producción: srdtf.com/editor-escudos/ · Cache-buster ?v=1.3.0
/editor-escudos/assets/textures/. Se arregla el bug de "la textura no se aplicaba" — causa raíz: el HTML usaba data-texture="efecto-agua" / "puntos-degradados" / "ladrillo" / "puntos-radiales" pero el JS buscaba agua / puntos-deg / puntos-rad / ladrillo → devolvía null y se caía al color plano. Ahora el registro está alineado HTML↔JS y precargado en paralelo al init.buildTintedTextureCanvas() con el editor: mismo canvas tintado via ctx.createPattern(tc, 'repeat') en las páginas de grosor, W-aislados, barniz y composición completa.fabric.Path recibía fillRule:'evenodd', ciertas versiones del runtime lo ignoraban y los ceros/ochos se rellenaban completos. Ahora se monkey-patcha fabric.Path.prototype._render para forzar ctx.fill('evenodd') en cualquier path marcado como zona SRDTF.alpha=255 de forma uniforme, destruyendo transparencias parciales del original. Ahora se preserva el alpha del píxel fuente → el bleed ya no "pincha" la opacidad ni dispara el error de exportación.pageW/pageH ahora se calculan DPI-aware, se redondean a 0.01 mm y se añade margen de seguridad de 2 mm; la trim-box queda centrada. Se añade clip estricto al bounds de imagen en cada render offscreen para que nada pinte sobre crop-marks ni título de página./editor-escudos/assets/textures/. Caché purgada.wc_print_notices() post-reload. Gallery corregida (imágenes reales, aspect-square). Nuclear dequeue eximido para ID 644./gracias-contacto/ tras envío.srdtf-cart-empty-restyle.php.srdtf-institutional-restyle.php cuando se tengan los IDs (AW-XXXXXXXXXX + label de conversión).Plan de lanzamiento de landings SEO para capturar búsquedas long-tail de camisetas personalizadas. Todas redirigen al wizard principal.
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas para Despedida de Soltera/Soltero | /camisetas-personalizadas/despedida-soltera/ ↗ | 4.000 | Publicada |
| Camisetas para Empresas | /camisetas-personalizadas/empresa/ ↗ | 2.500 | Publicada |
| Camisetas Fin de Curso / Graduación | /camisetas-personalizadas/fin-de-curso/ ↗ | 1.800 | Publicada |
| Camisetas Equipos Deportivos | /camisetas-personalizadas/equipos-deportivos/ ↗ | 1.600 | Publicada |
| Camisetas para Eventos | /camisetas-personalizadas/eventos/ ↗ | 1.200 | Publicada |
| Camisetas para Bodas | /camisetas-personalizadas/bodas/ | 900 | Pendiente |
| Camisetas para Cumpleaños | /camisetas-personalizadas/cumpleanos/ | 700 | Pendiente |
| Camisetas de Aniversario | /camisetas-personalizadas/aniversario/ | 400 | Pendiente |
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas de Algodón Personalizadas | /camisetas-personalizadas/algodon/ ↗ | 2.800 | Publicada |
| Camisetas Técnicas Deportivas | /camisetas-personalizadas/tecnicas-deportivas/ ↗ | 1.900 | Publicada |
| Camisetas Oversize Personalizadas | /camisetas-personalizadas/oversize/ ↗ | 1.400 | Publicada |
| Camisetas de Manga Larga | /camisetas-personalizadas/manga-larga/ ↗ | 1.100 | Publicada |
| Polos Personalizados Empresa | /camisetas-personalizadas/polos-empresa/ ↗ | 2.200 | Publicada |
| Sudaderas con Capucha Personalizadas | /camisetas-personalizadas/sudaderas-capucha/ ↗ | 1.800 | Publicada |
| Chaquetas Personalizadas | /camisetas-personalizadas/chaquetas/ ↗ | 900 | Publicada |
| Chándales Personalizados | /camisetas-personalizadas/chandales/ ↗ | 700 | Publicada |
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas Personalizadas al Por Mayor | /camisetas-personalizadas/al-por-mayor/ ↗ | 1.500 | Publicada |
| Camisetas Personalizadas desde 1 Unidad | /camisetas-personalizadas/desde-1-unidad/ ↗ | 1.100 | Publicada |
| Camisetas Personalizadas Baratas | /camisetas-personalizadas/baratas/ ↗ | 2.400 | Publicada |
| Camisetas Personalizadas 10 Unidades | /camisetas-personalizadas/10-unidades/ ↗ | 600 | Publicada |
| Pack 20 Camisetas Personalizadas | /camisetas-personalizadas/pack-20/ ↗ | 400 | Publicada |
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas para Bomberos / Policía | /camisetas-personalizadas/bomberos-policia/ ↗ | 350 | Publicada |
| Uniformes Hostelería | /camisetas-personalizadas/hosteleria/ ↗ | 600 | Publicada |
| Camisetas para Obra / Seguridad Laboral | /camisetas-personalizadas/obra-seguridad/ ↗ | 450 | Publicada |
| Uniformes Sanitarios / Clínicas | /camisetas-personalizadas/sanitarios/ ↗ | 280 | Publicada |
| Camisetas para Transporte / Logística | /camisetas-personalizadas/transporte/ ↗ | 220 | Publicada |
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas para Peñas / Cofradías | /camisetas-personalizadas/penas-cofradias/ ↗ | 500 | Publicada |
| Camisetas para Asociaciones / ONGs | /camisetas-personalizadas/asociaciones-ongs/ ↗ | 280 | Publicada |
| Camisetas para Clubes Deportivos | /camisetas-personalizadas/clubes-deportivos/ ↗ | 800 | Publicada |
| Camisetas para Academias / Colegios | /camisetas-personalizadas/academias-colegios/ ↗ | 450 | Publicada |
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas de Navidad para Empresa | /camisetas-personalizadas/navidad-empresa/ ↗ | 380 | Publicada |
| Camisetas San Valentín | /camisetas-personalizadas/san-valentin/ ↗ | 250 | Publicada |
| Camisetas Día del Padre / Madre | /camisetas-personalizadas/dia-padre-madre/ ↗ | 400 | Publicada |
| Camisetas Campañas Políticas | /camisetas-personalizadas/campanas-politicas/ ↗ | 180 | Publicada |
| Camisetas para Ferias / Stands | /camisetas-personalizadas/ferias-stands/ ↗ | 320 | Publicada |
| Keyword / Título | Slug URL | Volumen | Estado |
|---|---|---|---|
| Camisetas Personalizadas sin Mínimo | /camisetas-personalizadas/sin-minimo/ ↗ | 380 | Publicada |
| Camisetas Personalizadas con Foto | /camisetas-personalizadas/con-foto/ ↗ | 1.500 | Publicada |
| Camisetas con Dibujo Propio | /camisetas-personalizadas/dibujo-propio/ ↗ | 400 | Publicada |
| Camisetas Personalizadas con Nombre | /camisetas-personalizadas/con-nombre/ ↗ | 2.200 | Publicada |
| Camisetas Personalizadas con Logo | /camisetas-personalizadas/con-logo/ ↗ | 1.800 | Publicada |
Todas las landings comparten una sola estructura para escalar sin fricción.
srdtf_landing con campos: hero, badges, casos-uso, testimonios, FAQ/camisetas-personalizadas/{slug}/srdtf-landings-template.php. Color identity emerald (mismo que /personalizar-ropa/)/personalizar-ropa/?from={slug} para trackinglanding_view + source tag por slugsrdtf-landings-docs.php en el array srdtf_landings_roadmap(). Cambia 'status' => 'todo' por 'progress' o 'done' según avancemos. Los contadores y progress bar se actualizan solos.Estrategia de expansión SEO ejecutada en mayo 2026: 6 clusters temáticos, 47 landings publicadas, 3 productos WC con configurador inteligente, integración multitécnica + geo-targeting Madrid/Barcelona.
Hub /servicio-bordado/ con calculadora K-means + ΔE2000 sobre paleta Madeira (347 hilos). Add-to-cart real WC con producto virtual ID 15165. Cluster por uso: camisetas, polos empresa, gorras, sudaderas.
| URL | Tipo | Keyword principal |
|---|---|---|
| /servicio-bordado/ | hub producto WC 15165 | bordado personalizado precio |
| /bordado-camisetas/ | spoke | bordado camisetas |
| /bordado-polos-empresa/ | spoke | polos bordados empresa |
| /bordado-gorras/ | spoke | bordado gorras |
| /bordado-sudaderas/ | spoke | bordado sudaderas |
Hub /servicio-serigrafia/ con calculadora dinámica (mín 50 uds, claras 1 pasada / oscuras doble pasada con cama blanca). Add-to-cart real WC ID 15164. Cluster por uso: camisetas, sudaderas, polos, totebags. 55/55 tests passing.
| URL | Tipo | Keyword principal |
|---|---|---|
| /servicio-serigrafia/ | hub producto WC 15164 | serigrafía precio online |
| /serigrafia-camisetas/ | spoke | serigrafía camisetas |
| /serigrafia-sudaderas/ | spoke | serigrafía sudaderas |
| /serigrafia-polos-empresa/ | spoke | polos serigrafía empresa |
| /serigrafia-totebags/ | spoke | serigrafía totebags |
Hub /pegatinas-personalizadas/ con configurador completo (76 tramos CSV, 3 plazos, corte forma +15%, individuales +25%, mantener proporción al cambiar tamaños, scanner archivo PNG/JPG auto-rellena tamaño). Add-to-cart real WC ID 15190. Integrado en menú "Para tu marca" → sección Packaging.
| URL | Tipo | Keyword principal |
|---|---|---|
| /pegatinas-personalizadas/ | hub producto WC 15190 | pegatinas personalizadas |
| /pegatinas-troqueladas/ | spoke | pegatinas troqueladas |
| /pegatinas-eventos/ | spoke | pegatinas eventos festivales |
| /pegatinas-marca-packaging/ | spoke | pegatinas marca packaging B2B |
| /pegatinas-coches-moto/ | spoke | pegatinas coches moto vinilo |
| /pegatinas-circulares/ | spoke | pegatinas circulares redondas |
Estrategia geo-local con LocalBusiness schema + GeoCoordinates exactas (40.55412 / -3.61553) + NAP físico (Avda Somosierra 18, Sanse). Captura intención local: profesionales, clubes, empresas Madrid. Barrios estratégicos donde estamos físicamente o cerca.
| URL | Tipo | Foco |
|---|---|---|
| /imprenta-textil-madrid/ | geo | Paraguas Madrid (todas las técnicas) |
| /serigrafia-madrid/ | geo | Serigrafía Madrid |
| /bordado-madrid/ | geo | Bordado Madrid |
| /dtf-madrid/ | geo | DTF Madrid (contraataque dtfbarcelona.es) |
| /dtf-uv-madrid/ | geo | DTF UV objetos Madrid |
| /dti-madrid/ | geo | DTI premium Madrid |
| /escudos-uv-3d-madrid/ | geo | Escudos UV 3D Madrid (clubes) |
| /serigrafia-san-sebastian-de-los-reyes/ | Serigrafía Sanse (donde estamos) | |
| /dtf-san-sebastian-de-los-reyes/ | DTF Sanse (vs dtfbarcelona) | |
| /bordado-san-sebastian-de-los-reyes/ | Bordado Sanse | |
| /dtf-uv-san-sebastian-de-los-reyes/ | DTF UV Sanse | |
| /imprenta-textil-alcobendas/ | Imprenta Alcobendas (vecino) | |
| /imprenta-textil-madrid-centro/ | Imprenta Madrid centro |
Reciprocidad estratégica vs dtfbarcelona.es (que atacó Madrid el 26 abril 2026). NAP físico Madrid + areaServed Barcelona. Argumento diferencial: tarifa pública 7€/metro vs su modelo opaco "consultar precio". Estimación 150 visitas/mes en 6 meses.
| URL | Tipo | Foco |
|---|---|---|
| /imprenta-textil-barcelona/ | geo | Paraguas BCN (todas las técnicas) |
| /dtf-barcelona/ | geo | DTF Barcelona (vs dtfbarcelona) |
| /serigrafia-barcelona/ | geo | Serigrafía BCN (hueco competitivo) |
| /bordado-barcelona/ | geo | Bordado BCN (hueco competitivo) |
| /dtf-uv-barcelona/ | geo | DTF UV BCN |
| /escudos-uv-3d-barcelona/ | geo | Escudos UV 3D BCN (clubes Cataluña) |
Productos WooCommerce virtuales con precio dinámico vía hooks (woocommerce_add_cart_item_data, before_calculate_totals, get_item_data). Cada uno con calculadora propia, validación server-side y persistencia de metadata en order_items.
| Producto | WC ID | Calculadora | Min |
|---|---|---|---|
| Servicio Bordado | 15165 | K-means LAB + ΔE2000 sobre paleta Madeira (347 hilos) | 1 unidad |
| Servicio Serigrafía | 15164 | Tabla CSV claros 1-pasada · oscuros doble pasada + cama blanca · 4 tramos cantidad | 50 uds |
| Pegatinas Vinilo | 15190 | Tabla CSV 76 tramos · 3 plazos · recargos % · scanner archivo · mantener proporción | 20 uds |
Schema rich en todas las landings: LocalBusiness con @id reutilizable + GeoCoordinates + Service vinculado al @id + FAQPage + BreadcrumbList. NAP unificado via función helper (Avda Somosierra 18, 28703 SS Reyes, +34 678 688 235). Content depth ~2000-2500 palabras por landing con H2/H3 jerarquizados, datos concretos (precios, plazos, mínimos) → optimizado para citas en SearchGPT/Perplexity. Enlazado interno hub-spoke + lateral entre hermanas + cross-cluster a clusters de uso. Footer compartido con todas las landings del cluster. Helpers reutilizables en /wp-content/mu-plugins/: srdtf-bordado-landings.php · srdtf-serigrafia-landings.php · srdtf-pegatinas-landings.php · srdtf-madrid-landings.php · srdtf-barcelona-landings.php.
Última actualización: 3 mayo 2026 — Bloque añadido al dashboard original