Caso de estudio

Plugin WordPress Juegos Scraper

Juegos Scraper es un plugin desarrollado para importar juegos desde Steam a WordPress y convertirlos en contenido estructurado dentro de un CPT propio. No se limita a traer un título y una imagen: consulta la API de Steam, filtra resultados, normaliza datos, guarda metadatos, sincroniza taxonomías, genera galerías, integra trailers y deja el contenido listo para ser consumido por el frontend del sitio.

El proyecto está planteado con una arquitectura orientada a servicios y responsabilidades separadas: cliente de Steam, caché, mapeo a entidad de dominio, persistencia en WordPress, escritura en ACF, sincronización de categorías, shortcodes y ejecución programada por cron. El resultado es una pieza de backend mucho más cercana a una pequeña aplicación que a un plugin improvisado con lógica mezclada.

Importación automatizada Steam → WordPress Modelo de dominio Cron programado
CPT propio registro del tipo de contenido juego para separar el catálogo del blog
Steam API consulta de appdetails, búsquedas, destacadas y resolución de DLC
WP-Cron importación manual o programada con varios modos y límites por ejecución
ACF + metas persistencia de campos avanzados, galería, idiomas, enlaces y trailer

Problema / reto

Convertir datos externos de Steam en contenido útil, limpio y reutilizable dentro de WordPress

El reto real no era consumir una API sin más, sino transformar datos heterogéneos de Steam en un modelo estable dentro de WordPress, evitando duplicados, descartando contenido no válido y conectando ese contenido con la parte visual de la web.

  • Traer información desde Steam y validar que realmente sea un juego importable.
  • Evitar duplicados comprobando los AppIDs ya existentes.
  • Filtrar títulos no deseados o NSFW antes de persistirlos.
  • Mapear idiomas, plataformas, capturas, DLCs y fechas a una estructura interna clara.
  • Guardar el contenido tanto en metas nativas como en campos ACF.
  • Sincronizar taxonomías a partir de géneros o tags populares reales de la store.
  • Hacer que imágenes externas y trailers funcionen en el frontend sin tener que subir todo a la biblioteca de medios.
  • Permitir ejecución manual y también automatización programada por cron.

Solución

Arquitectura por capas: cliente, mapper, repositorio, sincronización y cron

La solución se apoya en una cadena de importación bien separada:

  • Cliente Steam para consultar appdetails, destacadas y resultados de búsqueda.
  • Capa de caché con transients para evitar peticiones repetidas.
  • Mapper que transforma la respuesta de Steam en una entidad Game.
  • Repositorio WordPress que crea o actualiza el CPT juego.
  • Escritor ACF para poblar campos avanzados y metadatos auxiliares.
  • Sincronizador de categorías para conectar el contenido importado con taxonomías del sitio.
  • Cron y panel de ajustes para controlar frecuencia, origen y cantidad de importaciones.

Planteamiento

Un plugin que resuelve backend, datos y consumo frontend

Una parte interesante del proyecto es que no se queda solo en “importar datos”. También resuelve cómo deben quedar disponibles dentro del sitio para ser reutilizados después.

  • El plugin registra su propio post type.
  • Guarda portadas externas sin obligar a crear adjuntos locales.
  • Inyecta trailers HLS reproducibles en frontend mediante shortcode.
  • Genera galerías a partir de URLs externas o de galerías ACF.
  • Amplía queries para que los juegos entren en home, archivo, tags y búsquedas.

Arquitectura

Un flujo de importación modular y mantenible dentro de WordPress

El plugin está organizado con una estructura bastante limpia para WordPress: punto de entrada, autoload propio, capa de aplicación, contratos de dominio, infraestructura de Steam, infraestructura WordPress y utilidades de soporte. Eso permite que el flujo principal se lea con claridad y que cada pieza tenga una responsabilidad concreta.

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

El punto fuerte aquí es que ImportSteamGamesHandler no conoce detalles de WordPress ni de Steam más allá de sus contratos. Recibe un cliente, un mapper, un repositorio, un sincronizador y un logger. Eso mejora el orden interno del plugin y reduce el acoplamiento entre infraestructuras.

En la práctica, el flujo es: obtener datos crudos desde Steam, mapearlos a la entidad Game, decidir si el juego es importable, guardar el contenido en WordPress, sincronizar categorías y registrar logs de éxito o error. Esa cadena está bastante bien separada para un plugin de este tipo.

Módulos del plugin

Piezas clave que convierten una importación simple en un sistema completo

Juegos Scraper no es una sola clase grande haciendo de todo. Tiene varios módulos con roles distintos que trabajan juntos:

  • SteamApiClient consulta la API pública y también resultados HTML de búsqueda de Steam.
  • CachedSteamApiClient aplica caché con transients para reducir llamadas repetidas.
  • SteamGameMapper transforma la respuesta externa en una entidad lista para guardar.
  • SteamDlcResolver resuelve nombres de DLC a partir de sus AppIDs.
  • WpGameRepository inserta o actualiza el CPT y registra metadatos internos.
  • AcfGameMetaWriter rellena campos ACF, galerías, idiomas, updates y enlaces base.
  • WpCategorySynchronizer intenta enriquecer la taxonomía con tags populares de Steam.
  • Cron decide de dónde salen los AppIDs, cuáles ya existen y cuáles se importan.
  • Shortcodes expone el contenido importado al frontend.

Esto hace que el plugin cubra varios niveles: adquisición de datos, filtrado, normalización, almacenamiento, exposición visual y automatización.

Valor técnico

Qué aporta la arquitectura del plugin

  • Separación clara entre dominio, infraestructura y flujo de aplicación.
  • Menor dependencia de funciones globales fuera de la capa WordPress.
  • Posibilidad de cambiar piezas concretas sin romper todo el sistema.
  • Mejor legibilidad que un plugin construido solo con hooks sueltos.
  • Facilidad para ampliar modos de importación o nuevos normalizadores.

Panel de control

Ajustes de importación desde administración

El plugin incluye una página de ajustes dentro de WordPress para controlar cómo se importa el contenido.

  • Frecuencia del cron en horas.
  • AppIDs manuales.
  • Secciones destacadas de Steam: nuevos lanzamientos, top sellers, ofertas o coming soon.
  • Límite máximo de juegos por ejecución.
  • Modo de importación: manual, destacadas, mixto o búsqueda.

Frontend y shortcodes

El plugin no solo importa: también prepara el contenido para mostrarse bien

Una parte muy útil del proyecto es cómo resuelve el consumo frontend del contenido importado. No obliga a rehacer cada plantilla desde cero ni a depender de iframes externos.

  • [juegos_recientes] muestra los últimos juegos importados.
  • [juegos_top] reutiliza la consulta para listados tipo destacados.
  • [steam_trailer] reproduce trailers HLS de Steam con soporte nativo o hls.js.
  • [steam_galeria] monta galerías a partir de URLs Steam o galerías ACF.
  • ExternalThumbnailSupport permite usar portada externa como destacada sin adjunto local.
  • SteamVideoHtmlPolicy amplía etiquetas permitidas para conservar vídeo y HTML útil.

En otras palabras: el plugin no termina al guardar datos. También resuelve cómo deben vivir y renderizarse dentro del sitio.

Interacción

Automatización, filtrado y seguridad mínima del flujo

El comportamiento interno del plugin incluye varias decisiones prácticas para que la importación no sea ciega.

  • Descarta elementos cuyo type no sea game.
  • Evita juegos ya importados consultando _steam_appid.
  • Filtra títulos NSFW por nombre antes de guardarlos.
  • Comprueba que exista portada vertical antes de aceptar un juego.
  • Limita el número de items por ejecución.
  • Registra logs de información y error cuando WP_DEBUG está activo.

Modelado

Una entidad central que concentra todo lo importante del juego

La clase Game funciona como contenedor del modelo importado:

  • Steam AppID
  • Título, extracto y descripciones
  • URL de compra
  • Categorías y tags
  • Idiomas de texto y audio
  • Galería de capturas
  • DLCs
  • Plataformas
  • Fecha de lanzamiento, tamaño y trailer
  • Header image, portada vertical y estado de importabilidad

Este modelado evita trabajar todo el tiempo con arrays crudos de la API.

Proceso

Cómo funciona la importación de principio a fin

01

Selección de AppIDs

El plugin obtiene IDs de forma manual, desde secciones destacadas de Steam o mediante búsqueda, según la configuración elegida en el panel.

02

Filtrado previo

Antes de importar, comprueba qué AppIDs ya existen, elimina duplicados, limita el lote y valida que el elemento sea realmente un juego con portada vertical disponible.

03

Consulta a Steam

El cliente llama a appdetails y recupera los datos completos del juego; si hay caché en transient, reutiliza la respuesta.

04

Mapeo a dominio

El mapper convierte la respuesta de Steam a una entidad Game, resolviendo idiomas, capturas, plataformas, DLCs, fecha, tamaño y trailer.

05

Persistencia en WordPress

El repositorio crea o actualiza el CPT juego, guarda metas internas, registra imágenes externas y delega en el escritor ACF la parte editorial avanzada.

06

Sincronización y exposición

Finalmente se sincronizan categorías o tags, se guardan logs y el contenido queda listo para consumirse mediante consultas, plantillas y shortcodes del sitio.

Fortalezas

Qué demuestra este proyecto

  • Capacidad para desarrollar plugins WordPress más allá de hooks básicos.
  • Diseño de una arquitectura orientada a responsabilidades separadas.
  • Integración real con una fuente externa de datos.
  • Normalización y filtrado de contenido antes de persistirlo.
  • Uso coordinado de CPT, metas, ACF, shortcodes y cron.
  • Resolución de necesidades frontend desde backend, incluyendo HLS e imágenes externas.
  • Automatización de publicación y enriquecimiento de contenido.

Mejoras futuras

Evolución natural del plugin

  • Añadir colas o procesamiento por lotes más robusto para importaciones grandes.
  • Guardar históricos de logs en tabla propia o pantalla de administración.
  • Separar mejor las consultas HTML de Steam en servicios dedicados.
  • Introducir más validaciones de integridad de datos importados.
  • Ampliar soporte de precios, regiones o metadatos adicionales.
  • Mejorar internacionalización y configuración de idioma desde el panel.
  • Añadir tests sobre mapper, filtros y normalizadores.

Resultado

Un plugin que convierte WordPress en un catálogo automatizado de juegos

Juegos Scraper demuestra un nivel de trabajo bastante más profundo que el de un plugin pequeño de utilidades. Hay integración externa, arquitectura modular, automatización por cron, persistencia en CPT y ACF, enriquecimiento con taxonomías, soporte de medios externos y shortcodes específicos para consumo frontend.

A nivel de portfolio, este proyecto enseña que no solo sabes maquetar WordPress o tocar plantillas: también sabes diseñar una lógica de importación mantenible, conectar servicios externos, modelar datos, integrarlos con el ecosistema de WordPress y hacer que todo eso termine siendo usable dentro de una web real.

Galería

Capturas y vistas del plugin

Panel de ajustes, los listados de juegos importados, el single con trailer y galería, y el resultado final del contenido generado automáticamente dentro del tema.

Contacto

¿Quieres ver más plugins, automatizaciones o desarrollos a medida?

Puedo enseñarte más proyectos de WordPress, scraping, automatización, importadores personalizados e integraciones con APIs externas.