Caso de estudio

Tema WordPress GamesDemos

GamesDemos es una plataforma de catálogo de videojuegos construida sobre WordPress mediante un tema personalizado, un plugin propio de widgets para Elementor y un plugin adicional de importación automática desde Steam llamado Juegos Scraper, con fichas avanzadas, búsqueda en vivo, filtros AJAX y una interfaz visual orientada a catálogo moderno.

El proyecto combina arquitectura modular del tema, integración con ACF, componentes reutilizables para Elementor, una capa visual personalizada, varios sistemas dinámicos en JavaScript y una capa de importación automatizada desde Steam. El resultado no es una simple web maquetada, sino un sistema de contenido flexible, mantenible y preparado para generar contenido estructurado de forma semi automática.

Catálogo dinámico Widgets reutilizables UX interactiva WordPress a medida Importación automática
Tema propio estructura visual y funcional personalizada
Plugins widgets reutilizables para Elementor y importador automático
AJAX búsqueda y filtros sin recarga completa
ACF fichas de juego estructuradas y reutilizables

Problema / reto

Construir una web de juegos que fuera visual, flexible y mantenible

El reto principal no era solo diseñar una web atractiva, sino construir una base técnica que permitiera crear distintas secciones visuales, fichas avanzadas y bloques reutilizables sin depender de código repetido o de plantillas rígidas.

  • Organizar el tema sin acumular toda la lógica en un único archivo.
  • Crear una home rica en secciones sin convertirla en código difícil de mantener.
  • Permitir búsquedas y filtros más rápidos mediante AJAX.
  • Diseñar fichas de juego complejas con mucha información visual y técnica.
  • Reutilizar bloques en Elementor sin copiar y pegar estructuras manualmente.
  • Adaptar la experiencia a móvil y escritorio con comportamientos diferentes.
  • Automatizar la generación de fichas de juego sin depender únicamente de carga manual en el panel.

Solución

Tema modular + plugins propios + capa dinámica en JS

La solución final se apoya en varias capas complementarias:

  • Tema personalizado para plantillas, estructura, ACF, AJAX y sistema visual global.
  • Plugin propio para Elementor para registrar widgets reutilizables orientados al catálogo.
  • Plugin de importación desde Steam para generar fichas de juego estructuradas y poblar automáticamente el catálogo.
  • JavaScript desacoplado para comportamientos concretos como parallax o sliders responsive.
  • Swiper para carruseles y layouts móviles deslizables.

Planteamiento

Separación entre estructura global y bloques reutilizables

Técnicamente, una de las decisiones más interesantes fue no concentrar toda la lógica ni toda la interfaz dentro del tema, sino dividir el proyecto entre capa visual, bloques reutilizables e importación automatizada de contenido.

  • El tema controla el sistema general del sitio.
  • Un plugin añade componentes configurables para Elementor.
  • Otro plugin se encarga de importar y transformar datos de Steam en contenido utilizable.
  • Cada widget encapsula su consulta, sus controles y su render.
  • La importación automatizada alimenta el catálogo sin depender solo de publicación manual.

Arquitectura

Tres capas claras: tema, widgets e importación automatizada

El proyecto se organiza en tres capas complementarias: un tema personalizado para la estructura general, un plugin de widgets para construir bloques reutilizables en Elementor y un plugin independiente de importación encargado de consultar Steam, transformar datos y generar fichas de juego estructuradas dentro del catálogo.

wp-content/
├── themes/tema/
│   ├── acf-json/                          → exportación local de grupos de campos ACF en JSON
│   │   ├── group_688f7eff1ef4f.json
│   │   └── group_682626c0655fe.json
│   │
│   ├── css/
│   │   ├── archive-filter.css            → estilos del sistema de filtros y listados
│   │   └── bootstrap.min.css             → base visual con Bootstrap 5
│   │
│   ├── img/                              → recursos gráficos del tema
│   │
│   ├── inc/
│   │   ├── ajax/
│   │   │   ├── archive-filters.php       → lógica AJAX para filtros por categoría, tag y búsqueda
│   │   │   └── live-search.php           → buscador en vivo por AJAX
│   │   ├── acf.php                       → integración con ACF y JSON local
│   │   ├── enqueue.php                   → carga centralizada de scripts y estilos
│   │   ├── helpers.php                   → utilidades reutilizables
│   │   ├── media.php                     → optimización de imágenes
│   │   ├── menus.php                     → registro de menús
│   │   ├── setup.php                     → configuración base del tema
│   │   ├── walkers.php                   → walker Bootstrap personalizado
│   │   └── widgets.php                   → sidebars y widgets
│   │
│   ├── js/
│   │   ├── archive-filter.js             → interacción de filtros en frontend
│   │   ├── gallery-modal.js              → galería y modal de imágenes
│   │   ├── live-search-ajax-handler.js   → lógica del buscador en vivo
│   │   └── search-animations.js          → animaciones del buscador
│   │
│   ├── template-parts/
│   │   ├── ajax/
│   │   │   └── content-archive-card.php  → tarjeta reutilizable para resultados AJAX
│   │   ├── header/
│   │   │   └── navbar.php                → navegación principal reutilizable
│   │   ├── archive-filter.php            → bloque principal del archivo filtrable
│   │   └── content-pagination.php        → componente reutilizable de paginación
│   │
│   ├── category.php                      → plantilla de categorías
│   ├── tag.php                           → plantilla de etiquetas
│   ├── search.php                        → resultados de búsqueda
│   ├── single.php                        → ficha individual del juego
│   ├── page.php                          → plantilla base de páginas
│   ├── page-contacto.php                 → plantilla personalizada de contacto
│   ├── page-categorias-bootstrap.php     → plantilla de catálogo de categorías
│   ├── index.php                         → fallback del tema
│   ├── header.php                        → cabecera global
│   ├── footer.php                        → pie global
│   ├── functions.php                     → cargador modular del tema
│   ├── style.css                         → estilos principales
│   └── revision_tema.txt                 → notas internas del desarrollo
│
└── plugins/
    ├── rodri-plugin/
    │   ├── my-elementor-widget.php       → registro y carga de widgets personalizados
    │   ├── assets/js/                     
    │   │   ├── catalogo-categorias.js    → slider responsive de categorías (Swiper)
    │   │   └── highlight-parallax.js     → efecto parallax dinámico
    │   └── widgets/                       
    │       ├── class-games-widget.php    → grid de juegos recientes
    │       ├── slider-games.php          → slider de juegos con Swiper
    │       ├── reviews-hero.php          → sección de reseñas destacadas
    │       ├── highlight-card.php        → tarjeta destacada con parallax
    │       ├── aventura-widget.php       → sección temática de aventura
    │       ├── catalogo-categorias-widget.php → catálogo visual de categorías
    │       ├── faq-widget.php            → acordeón FAQ dinámico
    │       ├── info-contacto.php         → bloque de información de contacto
    │       └── form-shortcode.php        → renderizado de formularios vía shortcode
    │
    └── juegos-scraper/
        ├── juegos-scraper.php            → arranque principal del plugin
        ├── assets/css/style.css          → estilos de trailers y contenido importado
        │
        ├── src/Application/
        │   └── ImportSteamGamesHandler.php → flujo principal de importación
        │
        ├── src/Domain/
        │   ├── Game.php                  → entidad principal del juego
        │   └── Contracts/
        │       ├── CategorySyncInterface.php   → contrato de sincronización de categorías
        │       ├── GameRepositoryInterface.php → contrato de guardado de juegos
        │       ├── LoggerInterface.php   → contrato de logging
        │       └── SteamClientInterface.php → contrato del cliente Steam
        │
        ├── src/Infrastructure/Steam/
        │   ├── SteamApiClient.php        → cliente HTTP de Steam
        │   ├── CachedSteamApiClient.php  → caché con transients
        │   ├── SteamGameMapper.php       → mapeo de datos a Game
        │   └── SteamDlcResolver.php      → resolución de nombres de DLC
        │
        ├── src/Infrastructure/WordPress/
        │   ├── Plugin.php                → composición y arranque de servicios
        │   ├── CptJuego.php              → registro del CPT juego
        │   ├── Cron.php                  → importación automática programada
        │   ├── Settings.php              → gestión de opciones del plugin
        │   │
        │   ├── Admin/
        │   │   └── SettingsPage.php      → panel de configuración e import manual
        │   │
        │   ├── WpGameRepository.php      → persistencia de juegos en WordPress
        │   ├── WpCategorySynchronizer.php → sincronización de categorías y tags
        │   ├── AcfGameMetaWriter.php     → guardado de metadatos y campos ACF
        │   │
        │   ├── QueryIntegration.php      → integración del CPT en queries
        │   ├── Shortcodes.php            → shortcodes de trailers y galerías
        │   ├── ExternalThumbnailSupport.php → soporte para thumbnails externas
        │   ├── SteamVideoHtmlPolicy.php  → política HTML para vídeo embebido
        │   ├── Assets.php                → carga de assets del plugin
        │   └── Logger.php                → sistema de logs del importador
        │
        ├── src/Support/
        │   ├── LanguageMapper.php        → normalización de idiomas
        │   ├── NsfwTitleFilter.php       → filtrado de títulos NSFW
        │   └── TrailerExtractor.php      → extracción de trailers y miniaturas
        │
        └── uninstall.php                 → limpieza de opciones y cron

Esta separación evita acoplar toda la lógica al tema. El tema gobierna la presentación global, rodri-plugin amplía la capa visual editable y juegos-scraper resuelve la importación, normalización y persistencia de datos externos.

A esta arquitectura se suma además un plugin independiente de importación que registra el CPT juego, consulta la API de Steam, filtra resultados, transforma los datos a un modelo interno, sincroniza categorías, guarda metadatos en WordPress y ACF, y programa importaciones automáticas mediante cron.

Plugin propios

Plugins propios para construir la interfaz y alimentar el catálogo

El plugin rodri-plugin registra varios widgets personalizados de Elementor. Cada uno resuelve una pieza concreta de la interfaz:

Junto a este plugin visual, el proyecto también incorpora juegos-scraper, un plugin independiente orientado a backend que automatiza la importación de juegos desde Steam, permitiendo poblar el catálogo con contenido estructurado, galerías, trailers, metadatos y taxonomías sin depender de una carga manual completa.

  • Reutilización real de bloques visuales.
  • Controles editables desde el panel de Elementor.
  • Consultas WP integradas dentro de widgets específicos.
  • Menor duplicación de código entre páginas.
  • Mejor separación entre layout editable y lógica del tema.
  • Automatización de entrada de contenido desde una fuente externa.
  • Integración entre modelo de datos importado y capa visual del sitio.

Esto demuestra que no usaste Elementor de forma pasiva, sino que lo ampliaste con componentes propios pensados específicamente para la lógica del proyecto.

Valor técnico

Qué aporta el plugin al proyecto

  • Reutilización real de bloques visuales.
  • Controles editables desde el panel de Elementor.
  • Consultas WP integradas dentro de widgets específicos.
  • Menor duplicación de código entre páginas.
  • Mejor separación entre layout editable y lógica del tema.

Assets del plugin

Scripts registrados por funcionalidad

El plugin no solo registra widgets, también registra scripts específicos para widgets concretos:

  • catalogo-categorias.js activa o destruye Swiper según breakpoint móvil.
  • highlight-parallax.js aplica un parallax progresivo a la highlight card.
  • Los assets se cargan solo cuando son necesarios a través de dependencias del widget.

Frontend y CSS

Una interfaz dark construida con Bootstrap, CSS propio y componentes visuales

El proyecto utiliza Bootstrap como base, pero la identidad visual y la mayor parte del acabado real nacen del CSS personalizado del tema y de los widgets.

  • El sitio mantiene una estética dark coherente con acentos verdes.
  • Las vistas de catálogo, categorías, single, contacto y FAQs tienen estilos propios.
  • Los widgets personalizados generan bloques reconocibles y consistentes en la home.
  • Swiper permite reutilizar el mismo lenguaje visual en sliders, galerías y layouts móviles.

Lo importante es que toda esta capa visual no vive aislada: consume contenido generado tanto manualmente como a través del importador, lo que conecta directamente el trabajo de frontend con una arquitectura backend pensada para escalar mejor el catálogo.

Interacción

JavaScript para interacción útil, no solo decoración

La interfaz incorpora comportamiento dinámico pensado para mejorar la navegación y la exploración del catálogo sin recargar la experiencia.

  • Buscador en vivo con AJAX para mostrar resultados sin recarga completa.
  • Filtros dinámicos de archivo con actualización parcial del listado.
  • Slider de categorías en móvil para adaptar mejor la navegación al espacio disponible.
  • Parallax progresivo en la highlight card como refuerzo visual.
  • Galerías, modales y sliders en las fichas individuales.

Modelado

Contenido estructurado en single y bloques configurables en home

El proyecto resuelve dos tipos de contenido al mismo tiempo:

  • contenido editorial estructurado en fichas de juego mediante ACF
  • contenido visual configurable mediante widgets de Elementor
  • contenido importado y transformado desde Steam mediante un plugin propio de automatización

Esa combinación permite que la parte editorial y la parte de marketing visual convivan sin mezclarse.

Proceso

Cómo se construyó el sistema

01

Definición del modelo de contenido

Se definió la estructura de los juegos, sus campos avanzados, la galería, los datos técnicos y las relaciones con categorías y bloques de contenido.

02

Construcción del tema base

Se desarrolló la arquitectura principal del sitio: plantillas, includes, carga de assets, helpers, AJAX, menús y tratamiento de medios.

03

Desarrollo del plugin de widgets

Se crearon widgets específicos para Elementor con consultas, controles y render personalizados para las secciones principales de la web, manteniendo separada la lógica visual reutilizable.

04

Desarrollo del importador desde Steam

Se construyó un plugin independiente para consultar la API de Steam, filtrar juegos válidos, transformar los datos a una estructura interna, sincronizar categorías y guardar metadatos avanzados en WordPress y ACF.

05

Integración de comportamiento dinámico

Se añadieron scripts específicos para sliders responsive, parallax, búsqueda en vivo, filtros y galerías.

06

Refuerzo visual y responsive

Se ajustaron layouts, breakpoints y estilos para que la experiencia cambiara correctamente entre móvil y escritorio.

Fortalezas

Qué enseña este proyecto

  • Desarrollo de temas WordPress personalizados.
  • Creación de plugins propios para ampliar Elementor.
  • Diseño de componentes reutilizables.
  • Uso práctico de ACF y AJAX.
  • Frontend dinámico con JavaScript y Swiper.
  • Buena separación entre sistema global y bloques editables.
  • Integración con APIs externas para poblar contenido.
  • Automatización de procesos con cron en WordPress.
  • Separación entre capa de importación, capa visual y capa editorial.

Mejoras futuras

Evolución natural

  • Refactorizar aún más el CSS para reducir duplicidades.
  • Extraer lógica repetida de cards a helpers reutilizables.
  • Unificar patrones de render entre widgets similares.
  • Mejorar carga condicional de assets según contexto real.
  • Añadir más estados de carga y accesibilidad en interfaces dinámicas.
  • Mejorar el sistema de logs y monitorización del importador.
  • Ampliar reglas de normalización y validación de datos importados.

Resultado

Un proyecto más completo de lo que parece a primera vista

Con los plugins incluidos, GamesDemos pasa de ser “una web bonita hecha con WordPress” a convertirse en un sistema bastante más sólido: tema a medida, arquitectura modular, fichas avanzadas, búsqueda dinámica, biblioteca propia de widgets para construir la interfaz y un importador personalizado capaz de generar contenido estructurado desde Steam.

A nivel de portfolio, esto enseña algo muy valioso: sabes trabajar WordPress no solo como usuario de temas y plugins, sino como desarrollador capaz de diseñar la estructura del sitio, construir herramientas editoriales, ampliar Elementor con componentes propios e integrar fuentes externas de datos dentro de un flujo mantenible.

Galería

Capturas del proyecto

Home, el catálogo, las categorías, la plantilla de contacto y la ficha individual para reforzar la explicación técnica con pruebas visuales.

Contacto

¿Quieres ver más proyectos o hablar de un desarrollo similar?

Puedo enseñarte más casos de WordPress, PrestaShop, automatización, scraping o integraciones a medida.