Caso real 08 · WordPress a medida · multiportal

Un solo WordPress para los blogs de varios portales, en varios mercados

Un tema a medida que detecta qué portal se está visitando y se integra visualmente con la aplicación principal de cada uno. Detrás, Cloudflare con Workers y caché de página completa complicando lo simple.

Caso real, cliente anonimizado. El nombre del cliente, las personas y los datos internos se omiten por confidencialidad. Las cifras salen de logs, Search Console, GA4 y del propio código. Si un dato de negocio no se midió, no aparece.
1instalación para todos los portales
3señales de detección de portal
1BreadcrumbList válido por página
0dependencias de assets externos
Contexto

El punto de partida.

Cada portal tiene su aplicación principal y necesitaba un blog que pareciera parte de ella, en su idioma y su mercado, sin mantener una instalación de WordPress por portal.

Todo va detrás de Cloudflare, con Workers que reescriben rutas y caché de página completa. Eso afecta a nonces, a la REST API y a las redirecciones.

Síntomas observados

  • ERR_TOO_MANY_REDIRECTS en uno de los portales.
  • «Updating failed» al guardar en Gutenberg.
  • «Missing field item» en los breadcrumbs, según Search Console.
  • /blog/page/2/ devolviendo 404.
Diagnóstico

Hipótesis descartadas antes de tocar nada.

Lo que parecía obvio y no era. Descartar bien ahorra días de trabajo en la dirección equivocada.

Una instalación por portal

Multiplica mantenimiento, actualizaciones y contenido duplicado.

Contador de visitas en PHP

Con caché de página completa, PHP no se ejecuta en cada visita.

Nonce en el endpoint de visitas

Un nonce cacheado caduca y rompe el conteo.

Implementación

Qué hice, paso a paso.

Detección de portal

Cabecera, prefijo de ruta y cookie, por ese orden. Adapta logo, cabecera, pie, idioma y contenido.

Integración visual

Réplica de la cabecera y el pie de la aplicación principal, con estilos, logos e iconos alojados en local.

SEO internacional

Hreflang por post, BreadcrumbList, relacionados con puntuación de relevancia acotados por portal y fechas y categorías localizadas.

Bucle de redirección

El Worker y WordPress no coincidían en la barra final. Un mu-plugin alinea la ruta del blog con la del Worker.

Fallos de caché

«Updating failed» era Cloudflare limitando wp-json. Las visitas se cuentan con un endpoint REST sin nonce y deduplicación en el cliente.

Schema duplicado

Convivían el BreadcrumbList del tema, correcto, y uno incompleto del plugin de SEO. Quité el del plugin con un filtro global.

Bajo el capó

El código que importa.

Fragmentos simplificados y sin datos del cliente, para que se vea el enfoque técnico real.

Detección de portalphp
function current_portal(): string {
    $header = $_SERVER['HTTP_X_PORTAL'] ?? '';
    if ( $header && isset( PORTALS[ $header ] ) ) return $header;

    $path = trim( parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), '/' );
    foreach ( PORTALS as $slug => $cfg ) {
        if ( str_starts_with( $path, $cfg['prefix'] ) ) return $slug;
    }
    return $_COOKIE['portal'] ?? DEFAULT_PORTAL;
}
Un solo BreadcrumbListphp
add_filter( 'wpseo_schema_graph_pieces', function ( $pieces ) {
    return array_filter( $pieces, fn( $p ) => ! $p instanceof \Yoast\WP\SEO\Generators\Schema\Breadcrumb );
}, 11 );
Decisiones

Por qué así y no de otra forma.

Una instalación compartida

Un tema, un flujo editorial y actualizaciones únicas.

Conteo en el cliente

Es la única forma fiable detrás de una caché de página completa.

Resultado

Qué cambió, con datos verificables.

IndicadorAntesDespuésContexto
Instalaciones WordPress1 por portal1 compartidadetección en el tema
Breadcrumbs en Search ConsoleMissing field itemUn BreadcrumbList válidofiltro global
Bucle de redireccionesERR_TOO_MANY_REDIRECTSResueltoruta alineada
Paginación/page/2/ en 404Numeradamu-plugin propio

Cómo lo validé

  • Rich Results Test: un único BreadcrumbList por página.
  • Recorrido de cada portal con y sin cabecera de portal.
  • Guardado en Gutenberg con reglas de Cloudflare ajustadas.
Lo que me llevo

Con Cloudflare delante, la mitad de los «bugs de WordPress» no son de WordPress. Lo primero que miro son las cabeceras y las reglas del edge.

  • WordPress
  • PHP
  • Cloudflare Workers
  • Plugin de SEO
  • Gutenberg
  • REST API
Para tu web

Checklist rápida: ¿te está pasando lo mismo?

  • ¿Tu WordPress y tu CDN coinciden en la barra final?
  • ¿Tu REST API está limitada por el CDN?
  • ¿Cuántos BreadcrumbList emite cada página?
  • ¿Cuentas visitas en PHP detrás de caché completa?
¿Te suena?

¿Tienes un problema parecido?

Preguntas frecuentes

Dudas habituales sobre este tipo de problema.

¿Se puede servir un blog a varias marcas con un WordPress?

Sí, si el tema detecta el contexto y el contenido está bien etiquetado por portal.

¿Por qué Cloudflare rompe cosas de WordPress?

Porque cachea y reescribe peticiones antes de que lleguen al servidor.

¿Dos fuentes pueden generar schema duplicado?

Sí, el tema y un plugin. Google valida cada bloque por separado.

WordPress · SEO técnico · IA

Cuéntame qué está frenando tu web.

Si ya tienes un WordPress en producción, reviso el contexto y te digo con honestidad si lo que necesitas es desarrollo, SEO técnico, rendimiento o automatización.