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
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.
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.
El cliente llama a appdetails y recupera los datos completos del juego; si hay caché en transient, reutiliza la respuesta.
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.
Pantalla de configuración con cron, AppIDs manuales, secciones destacadas, modo de importación y ejecución manual.
Ficha individual del juego con descripción, trailer Steam, portada externa y datos estructurados.
Detalle técnico con idiomas, plataformas, fecha, DLCs, tamaño y galerías generadas desde Steam.
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.