{"id":284,"date":"2026-05-03T10:44:18","date_gmt":"2026-05-03T14:44:18","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=284"},"modified":"2026-05-03T10:44:19","modified_gmt":"2026-05-03T14:44:19","slug":"arquitectura-hibrida-blog-con-hugo-y-wordpress","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/05\/arquitectura-hibrida-blog-con-hugo-y-wordpress\/","title":{"rendered":"Arquitectura H\u00edbrida: C\u00f3mo sistematic\u00e9 mi blog con Hugo y WordPress"},"content":{"rendered":"\n<p>Tengo m\u00e1s de 50 art\u00edculos t\u00e9cnicos publicados. Algunos son de los mejores que he escrito: an\u00e1lisis profundos sobre SQL, gu\u00edas reales de infraestructura Linux y arquitecturas PHP que me llevaron semanas entender. Durante mucho tiempo, todos estaban enterrados en las paginas finales del feed.<\/p>\n\n\n\n<p>Ese es el problema silencioso de cualquier blog que se organiza solo por fecha: el tiempo entierra el contenido bueno exactamente igual que el malo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El cementerio de art\u00edculos excelentes<\/h2>\n\n\n\n<p>WordPress es excelente para publicar contenido. Es una m\u00e1quina para eso. Pero su modelo de navegaci\u00f3n por defecto, categor\u00edas planas, feed cronol\u00f3gico y etiquetas que casi nadie usa, no ayuda a que un lector nuevo entienda de qu\u00e9 va realmente tu sitio. Est\u00e1 pensado para que veas lo \u00faltimo que publicaste, no para que explores el conocimiento que has acumulado.<\/p>\n\n\n\n<p>Yo quer\u00eda algo diferente: una capa de navegaci\u00f3n que organizara el contenido <strong>por tema<\/strong>, no por fecha. Una secci\u00f3n donde alguien que llegara por primera vez al sitio pudiera ver en segundos que aqu\u00ed hay material serio y profundo sobre PHP, Linux, SQL o despliegue, y acceder a \u00e9l sin tener que escarbar entre decenas de p\u00e1ginas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La idea: Hubs de conocimiento<\/h2>\n\n\n\n<p>La soluci\u00f3n que imagin\u00e9 fue crear una secci\u00f3n independiente en <code>juredev.com\/temas\/<\/code> con p\u00e1ginas dedicadas a cada tema importante. No simples categor\u00edas de WordPress, sino algo m\u00e1s intencionado: p\u00e1ginas que contextualicen el tema, expliquen su importancia y enlacen los art\u00edculos relevantes con criterio editorial.<\/p>\n\n\n\n<p>En SEO esto se conoce como modelo <strong>Hub &amp; Spoke<\/strong> (p\u00e1gina central + contenidos relacionados). Funciona muy bien para reforzar la autoridad tem\u00e1tica ante Google. Pero lo que realmente me importaba era la experiencia del lector: que pudiera descubrir la profundidad de lo que tengo escrito de forma natural.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 Hugo<\/h2>\n\n\n\n<p>No voy a hacerte aqu\u00ed una comparativa exhaustiva de generadores est\u00e1ticos. Te lo digo con sinceridad: eleg\u00ed <a href=\"https:\/\/gohugo.io\/\">Hugo<\/a> porque ya lo conoc\u00eda bien. Sab\u00eda lo que pod\u00eda darme y no necesitaba aprender otra herramienta para resolver este problema concreto.<\/p>\n\n\n\n<p>El resultado lo justifica completamente. Cada hub es un archivo est\u00e1tico puro. Carga de forma instant\u00e1nea, sin consultas a base de datos ni PHP ejecut\u00e1ndose en el servidor. Para p\u00e1ginas de autoridad que quiero que Google indexe bien y que los lectores encuentren r\u00e1pido, eso es exactamente lo que necesitaba.<\/p>\n\n\n\n<p>WordPress sigue siendo el motor del blog: la parte din\u00e1mica, los comentarios, el feed y la publicaci\u00f3n diaria. Hugo se encarga de la biblioteca organizada. Cada aplicaci\u00f3n hace lo que mejor sabe hacer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El pegamento: un plugin que conecta los dos mundos<\/h2>\n\n\n\n<p>El verdadero reto t\u00e9cnico no fue crear los hubs, sino hacer que WordPress y Hugo se comunicaran fluidamente. Para eso desarroll\u00e9 un plugin propio: <strong>Jure Hubs Connector<\/strong>.<\/p>\n\n\n\n<p>El plugin a\u00f1ade un selector en el editor de entradas de WordPress. Cuando publicas o editas un art\u00edculo, eliges a qu\u00e9 hub pertenece. Autom\u00e1ticamente, al final del post aparece un banner que lleva de vuelta al hub correspondiente.<\/p>\n\n\n\n<p>As\u00ed, el lector que llega a un art\u00edculo sobre <a href=\"https:\/\/juredev.com\/blog\/2026\/02\/frankenphp-no-es-magia-rendimiento-contexto-e-infraestructura\/\" data-type=\"link\" data-id=\"https:\/\/juredev.com\/blog\/2026\/02\/frankenphp-no-es-magia-rendimiento-contexto-e-infraestructura\/\">FrankenPHP<\/a> descubre que existe toda una secci\u00f3n de <a href=\"https:\/\/juredev.com\/temas\/backend-php\/\">Backend PHP<\/a> esper\u00e1ndolo. El enlace bidireccional fortalece la autoridad tem\u00e1tica en ambas direcciones.<\/p>\n\n\n\n<script type=\"module\">\n  import mermaid from 'https:\/\/cdn.jsdelivr.net\/npm\/mermaid@10\/dist\/mermaid.esm.min.mjs';\n  mermaid.initialize({ \n    startOnLoad: true, \n    theme: 'dark'\n  });\n<\/script>\n<div style=\"display: flex; justify-content: center; align-items: center; width: 100%; margin: 20px 0;\">\n    <pre class=\"mermaid\" style=\"background: transparent; border: none; color: transparent;\">\nflowchart TB\n    subgraph Local [\"\ud83d\udcbb Entorno Local\"]\n        H_Edit[\"Editar Hubs en Hugo\"] --> H_Build[\"hugo build (Compilaci\u00f3n)\"]\n        H_Build --> H_Deploy[\"deploy.sh (rsync)\"]\n    end\n    subgraph Server [\"\ud83c\udf10 Servidor VPS (juredev.com)\"]\n        direction TB\n        WP[\"WordPress Engine\"] -- Plugin inyecta --> WP_Post[\"Art\u00edculos \/blog\/\"]\n        Static[\"Hugo Hubs \/temas\/\"]\n    end\n    H_Deploy -->|Sincronizaci\u00f3n| Static\n    Static <==>|Estructura Hub & Spoke| WP_Post\n    \n    User((Lector)) -->|Descubrimiento| Static\n    Static -->|Lectura Profunda| WP_Post\n    <\/pre>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">El despliegue: un comando y listo<\/h2>\n\n\n\n<p>Actualizar la secci\u00f3n <code>\/temas\/ <\/code>es extremadamente sencillo. Un script se encarga de todo: Hugo compila el sitio completo en segundos, rsync solo transfiere los archivos que realmente cambiaron, y el servidor queda actualizado. Sin paneles de control, sin FTP y sin pasos manuales repetitivos.<\/p>\n\n\n\n<p>Es el tipo de automatizaci\u00f3n que parece un detalle menor\u2026 hasta que llevas meses us\u00e1ndola y te das cuenta de lo liberador que es no tener que pensar en ella.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lo que logr\u00e9 y lo que aprend\u00ed<\/h2>\n\n\n\n<p>La secci\u00f3n <code>\/temas\/<\/code> ya est\u00e1 en producci\u00f3n. Diez hubs activos, cada uno con su contexto editorial, enlaces internos bien pensados y SEO cuidado (JSON-LD, canonicals, Open Graph). El resultado es una parte del sitio que se siente realmente curada, no generada autom\u00e1ticamente.<\/p>\n\n\n\n<p>Lo mejor de todo es que no tuve que migrar nada. No eleg\u00ed entre WordPress y un generador est\u00e1tico. Simplemente entend\u00ed qu\u00e9 hac\u00eda bien cada herramienta y les asign\u00e9 la responsabilidad que mejor les correspond\u00eda.<\/p>\n\n\n\n<p>A veces la mejor arquitectura no es la m\u00e1s moderna ni la m\u00e1s sofisticada. Es la que separa claramente los problemas y deja que cada sistema brille en lo suyo.<\/p>\n\n\n\n<p>Esta aproximaci\u00f3n h\u00edbrida me ha permitido mantener la facilidad de publicaci\u00f3n de WordPress mientras construyo una capa de conocimiento organizado y duradera. Y lo m\u00e1s importante: ahora los lectores (y yo mismo) podemos encontrar y aprovechar realmente todo ese contenido que antes quedaba enterrado.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tengo m\u00e1s de 50 art\u00edculos t\u00e9cnicos publicados. Algunos son de los mejores que he escrito: an\u00e1lisis profundos sobre SQL, gu\u00edas reales de infraestructura Linux y arquitecturas PHP que me llevaron semanas entender. Durante mucho tiempo, todos estaban enterrados en las paginas finales del feed. Ese es el problema silencioso de cualquier blog que se organiza [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[15,19],"class_list":["post-284","post","type-post","status-publish","format-standard","hentry","category-nota","tag-php","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=284"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/284\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}