Telemetría de WordPress

·

Servicios de Terceros

Además de las APIs de WordPress.org, WordPress 6.9 se comunica o puede comunicarse con diversos servicios de terceros, dependiendo de la configuración y uso. Este documento los detalla exhaustivamente.

Browse Happy (Actualización de Navegadores)

Sitio Web

https://browsehappy.com/

Propósito

Proporcionar información y enlaces para actualizar navegadores desactualizados o inseguros.

Cuándo se Accede

  • El dashboard muestra un widget “Browser Update” si detecta navegador antiguo
  • Enlace directo desde widget de advertencia

Archivo Fuente

wp-admin/includes/dashboard.php línea 1744

Código

$browsehappy = 'https://browsehappy.com/';
$locale      = get_user_locale();
if ( 'en_US' !== $locale ) {
    $browsehappy = add_query_arg( 'locale', $locale, $browsehappy );
}

URL Generada

https://browsehappy.com/?locale=es_ES

Datos Enviados

  • Query parameterlocale (idioma del usuario)
  • Referrer: URL del dashboard de WordPress
  • User-Agent: Del navegador del administrador
  • IP: Del navegador del administrador

Tipo de Conexión

  • Directa desde el navegador del usuario (no proxied por el servidor)
  • Click en enlace HTML

Privacidad

  • Riesgo: MEDIO
  • browsehappy.com (operado por WordPress Foundation) recibirá:
    • IP del administrador
    • User-Agent completo
    • Sitio de origen (Referer)

GDPR

  • browsehappy.com tiene su propia política de privacidad
  • Datos enviados: IP y User-Agent son datos personales

Desactivación

// wp-config.php
// Desactivar widget de browser check
remove_action( 'admin_notices', 'wp_check_browser_version' );

WordPress News Feed (Noticias de la Comunidad)

Sitio Web

https://wordpress.org/news/
https://wordpress.org/news/feed/

Propósito

Widget del dashboard que muestra noticias del blog oficial de WordPress.

Cuándo se Accede

  • Automático: Al cargar el dashboard
  • Frecuencia: Cada 12 horas (caché)

Archivo Fuente

wp-admin/includes/dashboard.php líneas 1527-1613

Código

function wp_dashboard_primary() {
    $feeds = array(
        'news' => array(
            'link'         => apply_filters( 'dashboard_primary_link', __( 'https://wordpress.org/news/' ) ),
            'url'          => apply_filters( 'dashboard_primary_feed', __( 'https://wordpress.org/news/feed/' ) ),
            'title'        => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ),
            'items'        => 2,
            'show_summary' => 0,
            'show_author'  => 0,
            'show_date'    => 0,
        ),
    );
    wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds );
}

URLs Accedidas

https://wordpress.org/news/feed/

Datos Enviados

  • User-AgentWordPress/6.9; https://example.com/
  • Referer: Ninguno (petición del servidor)

Tipo de Conexión

  • Proxied por el servidor WordPress
  • wp_remote_get() desde el servidor

Formato

RSS/XML feed

Caché

  • Duración: 12 horas
  • Transientfeed_[md5_hash]

Privacidad

  • Riesgo: BAJO
  • La IP es del servidor, no del usuario final
  • No se envían datos personales del administrador
  • WordPress.org puede saber:
    • URL del sitio (User-Agent)
    • Versión de WordPress

Localización

Si el idioma no es inglés, puede intentar acceder:

https://es.wordpress.org/news/feed/

Filtro aplicable:

// Cambiar URL del feed
add_filter( 'dashboard_primary_feed', function() {
    return 'https://mi-blog.com/feed/';
});

Desactivación

// wp-config.php o functions.php
remove_meta_box( 'dashboard_primary', 'dashboard', 'side' );

PHP Update Information

Sitio Web

https://wordpress.org/support/update-php/

Propósito

Enlace informativo cuando WordPress detecta una versión antigua de PHP.

Cuándo se Muestra

  • Si la versión de PHP es menor que la recomendada
  • En admin notices y Site Health

Archivo Fuente

wp-includes/functions.php línea 8512

Código

function wp_get_default_update_php_url() {
    return _x( 'https://wordpress.org/support/update-php/', 'localized PHP upgrade information page' );
}

Variable de Entorno

// Puede ser sobrescrita con:
getenv( 'WP_UPDATE_PHP_URL' )

Tipo de Conexión

  • Enlace directo desde el navegador del administrador
  • No es una petición automática

Privacidad

  • Riesgo: BAJO
  • Solo si el administrador hace click
  • wordpress.org verá IP y User-Agent del administrador

Personalización

// wp-config.php
putenv( 'WP_UPDATE_PHP_URL=https://mi-host.com/actualizar-php/' );

Servicios de Ping (XML-RPC)

Servicio Principal: Ping-O-Matic

URL por defecto:

http://rpc.pingomatic.com/

Propósito

Notificar a servicios de búsqueda y agregadores cuando se publica contenido nuevo.

Cuándo se Envía

  • Automático: Al publicar o actualizar un post
  • Solo si está habilitado en Ajustes > Escritura

Archivo Fuente

wp-includes/comment.php líneas 3148-3364

Funciones Clave

function generic_ping( $post_id = 0 )  // línea 3148
function weblog_ping( $server = '', $path = '' )  // línea 3349

Protocolo

XML-RPC (Remote Procedure Call)

Método XML-RPC

weblogUpdates.extendedPing
weblogUpdates.ping (fallback)

Datos Enviados

// Parámetros del ping
$client->query(
    'weblogUpdates.extendedPing',
    get_option( 'blogname' ),      // Nombre del blog
    home_url(),                     // URL del blog
    get_bloginfo( 'rss2_url' )     // URL del feed RSS
);

// Si falla, intenta ping simple
$client->query(
    'weblogUpdates.ping',
    get_option( 'blogname' ),
    home_url()
);

Código Completo

// wp-includes/comment.php:3354-3363
$client             = new WP_HTTP_IXR_Client( $server, $path );
$client->timeout    = 3;
$client->useragent .= ' -- WordPress/' . get_bloginfo( 'version' );

$home = trailingslashit( home_url() );
if ( ! $client->query( 'weblogUpdates.extendedPing',
                       get_option( 'blogname' ),
                       $home,
                       get_bloginfo( 'rss2_url' ) ) ) {
    // Fallback a ping simple
    $client->query( 'weblogUpdates.ping', get_option( 'blogname' ), $home );
}

Servicios Configurables

Ubicación: Ajustes > Escritura > “Servicios de actualización”

Por defecto: Ping-O-Matic está preconfigurado

http://rpc.pingomatic.com/

Otros servicios populares:

http://rpc.technorati.com/rpc/ping
http://blogsearch.google.com/ping/RPC2
http://ping.feedburner.com/
http://blog.goo.ne.jp/XMLRPC

Privacidad

  • Riesgo: MEDIO-ALTO
  • Datos públicos enviados:
    • Nombre del blog
    • URL completa del blog
    • URL del RSS feed
  • IP: Del servidor WordPress
  • Propósito: Indexación pública del contenido

Implicaciones

  • Intencional: El objetivo es notificar públicamente
  • SEO: Mejora la indexación en buscadores
  • Privacidad: No envía datos personales, pero hace pública la existencia del contenido

Desactivación

Método 1: Desde la interfaz

  • Ajustes > Escritura > Servicios de actualización
  • Borrar todas las URLs

Método 2: Programático

// wp-config.php o functions.php
update_option( 'ping_sites', '' );  // Vaciar lista de servicios

Método 3: Desactivar XML-RPC completamente

// wp-config.php
add_filter( 'xmlrpc_enabled', '__return_false' );

Pingback (XML-RPC)

Propósito

Notificar a otros sitios cuando WordPress enlaza a su contenido.

Cuándo se Envía

  • Automático: Al publicar/actualizar un post con enlaces externos
  • Solo si el sitio destino soporta pingbacks

Archivo Fuente

wp-includes/comment.php línea 3173

Función

function pingback( $content, $post )

Protocolo

XML-RPC a URL encontrada en la meta <link rel="pingback">

Flujo

  1. WordPress extrae URLs del contenido del post
  2. Para cada URL, hace petición HTTP para buscar <link rel="pingback">
  3. Si existe, envía pingback XML-RPC a esa URL

Datos Enviados

sourceURI: URL de tu post
targetURI: URL del post enlazado

Timeout

// wp-includes/class-wp-http-ixr-client.php
$client->timeout = 3;  // 3 segundos

Privacidad

  • Riesgo: BAJO-MEDIO
  • Los sitios enlazados recibirán:
    • URL de tu post
    • IP del servidor
    • Notificación de que los enlazaste

Desactivación

Opción 1: Global (ajustes)

  • Ajustes > Comentarios > Desmarcar “Permitir notificaciones de enlaces…”

Opción 2: Por post

  • Editor de post > Pantallas de opciones > Discusión > Desmarcar pingbacks

Opción 3: Programático

// Deshabilitar pingbacks salientes
remove_action( 'do_pings', 'do_all_pings', 10 );

// Deshabilitar pingbacks entrantes
add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    return $methods;
});

oEmbed (Incrustación de Contenido Externo)

Propósito

Incrustar contenido de servicios externos (videos, tweets, etc.) automáticamente al pegar URLs.

Servicios Soportados (Lista Parcial)

Servicios de Video
  • YouTubehttps://www.youtube.com/oembed
  • Vimeohttps://vimeo.com/api/oembed.{format}
  • Dailymotionhttps://www.dailymotion.com/services/oembed
  • VideoPresshttps://public-api.wordpress.com/oembed/?for={host}
  • TikTokhttps://www.tiktok.com/oembed
Redes Sociales
  • Twitterhttps://publish.twitter.com/oembed
  • Reddithttps://www.reddit.com/oembed
  • Blueskyhttps://embed.bsky.app/oembed
Audio
  • Spotifyhttps://embed.spotify.com/oembed/
  • SoundCloudhttps://soundcloud.com/oembed
  • Mixcloudhttps://app.mixcloud.com/oembed/
Otros
  • Flickrhttps://www.flickr.com/services/oembed/
  • Instagram (Meta): https://graph.facebook.com/v10.0/instagram_oembed
  • WordPress.tvhttps://wordpress.tv/oembed/
  • Scribdhttps://www.scribd.com/services/oembed
  • Imgurhttps://api.imgur.com/oembed
  • Pinteresthttps://www.pinterest.com/oembed.json
  • Amazonhttps://read.amazon.com/kp/api/oembed
  • TEDhttps://www.ted.com/services/v1/oembed.{format}
  • Kickstarterhttps://www.kickstarter.com/services/oembed
  • Tumblrhttps://www.tumblr.com/oembed/1.0
  • Animotohttps://animoto.com/oembeds/create
  • Crowdsignalhttps://api.crowdsignal.com/oembed
  • ReverbNationhttps://www.reverbnation.com/oembed
  • Speaker Deckhttps://speakerdeck.com/oembed.{format}
  • Issuuhttps://issuu.com/oembed_wp
  • Clouduphttps://cloudup.com/oembed
  • Anghamihttps://api.anghami.com/rest/v1/oembed.view
  • Pocket Castshttps://pca.st/oembed.json
  • Wolfram Cloudhttps://www.wolframcloud.com/oembed
  • Canvahttps://canva.com/_oembed
  • SmugMughttps://api.smugmug.com/services/oembed/

Archivo Fuente

wp-includes/class-wp-oembed.php líneas 41-113

Cuándo se Accede

  • Editor de bloques: Al pegar URL de servicio soportado
  • Editor clásico: Con URL en línea propia
  • Frontend: Al renderizar contenido con oEmbed

Datos Enviados

  • URL: La URL del contenido a incrustar
  • Parámetros opcionales:
    • maxwidth: Ancho máximo
    • maxheight: Alto máximo
    • format: json o xml
    • for: (VideoPress) Hostname del sitio

Ejemplo de Petición

GET https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ&format=json&maxwidth=600

Respuesta Típica (JSON)

{
  "type": "video",
  "version": "1.0",
  "title": "Video Title",
  "author_name": "Author",
  "author_url": "https://...",
  "provider_name": "YouTube",
  "provider_url": "https://www.youtube.com/",
  "thumbnail_url": "https://i.ytimg.com/...",
  "thumbnail_width": 480,
  "thumbnail_height": 360,
  "html": "<iframe width='600' height='338' src='...'></iframe>"
}

Tipo de Conexión

  • Servidor WordPress hace la petición (proxied)
  • No expone directamente IP del usuario final
  • Caché: Las respuestas se almacenan en post meta

Privacidad

  • Riesgo: BAJO-MEDIO (servidor) / MEDIO-ALTO (usuario final)

Fase 1: Petición oEmbed (Servidor)

  • WordPress server hace petición al servicio oEmbed
  • Servicio recibe:
    • IP del servidor WordPress
    • URL solicitada
    • User-Agent del servidor
  • No expone datos del usuario final

Fase 2: Carga del Embed (Usuario Final)

  • El HTML devuelto incluye <iframe> o <script>
  • Se carga DIRECTAMENTE desde el servicio al navegador del usuario
  • Servicios externos (YouTube, Twitter, etc.) reciben:
    • IP del usuario final
    • User-Agent del usuario
    • Cookies del servicio (si existen)
    • Permite tracking del usuario

GDPR e Implicaciones

  • Crítico: Los embeds cargan recursos de terceros
  • YouTube, Twitter, etc. pueden hacer tracking de visitantes
  • Muchos servicios establecen cookies de tracking
  • Consentimiento: Puede requerirse antes de cargar embeds

Soluciones de Privacidad

Opción 1: Desactivar oEmbed

// wp-config.php
remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );

Opción 2: Lazy load con consentimiento (requiere plugin o código custom)

  • Mostrar placeholder
  • Cargar embed solo tras click/consentimiento

Opción 3: Proxy de privacidad

  • Usar servicios como youtube-nocookie.com
  • Bloquear tracking con configuraciones especiales

Opción 4: Embeds responsables

// Forzar YouTube a modo sin cookies
add_filter( 'oembed_result', function( $html ) {
    return str_replace( 'youtube.com/', 'youtube-nocookie.com/', $html );
}, 10, 1 );

oEmbed Discovery

WordPress también soporta “oEmbed discovery” para sitios no listados:

  • Busca <link rel="alternate" type="application/json+oembed">
  • Si existe, hace petición a ese endpoint

Desactivación de oEmbed Discovery

// wp-config.php
remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );

Gravatar (Avatares de Usuario)

Servicio

https://secure.gravatar.com/avatar/
https://gravatar.com/avatar/

Propósito

Mostrar avatares de usuarios en comentarios y perfiles.

Cuándo se Carga

  • Página de comentarios
  • Área de administración (perfil, autores)
  • Widgets de autores

Archivo Fuente

wp-includes/pluggable.php – Función get_avatar()

URL Generada

https://secure.gravatar.com/avatar/[MD5_EMAIL]?s=96&d=mm&r=g

Parámetros:

  • s: Tamaño (size)
  • d: Default (mm=mystery man, identicon, monsterid, etc.)
  • r: Rating (g, pg, r, x)

Datos Enviados

  • MD5 del email: Hash del email del usuario (NO el email en texto plano)
  • Referer: URL de la página que muestra el avatar
  • IP del visitante: (si carga desde navegador)

Tipo de Conexión

  • Directa desde navegador del visitante
  • Tag <img src="https://secure.gravatar.com/...">

Privacidad

  • Riesgo: MEDIO-ALTO
  • Gravatar (Automattic) recibe:
    • Hash MD5 del email (reversible con rainbow tables)
    • IP de cada visitante que ve la página
    • URL del sitio (Referer)
  • Permite tracking de visitantes

GDPR

  • Hash MD5 del email es considerado dato personal si es reversible
  • IPs de visitantes son definitivamente datos personales
  • Puede requerirse consentimiento

Desactivación

Opción 1: Usar avatares locales

  • Ajustes > Comentarios > Avatares > Avatar por defecto: “Blank”

Opción 2: Desactivar Gravatar completamente

// wp-config.php o functions.php
add_filter( 'get_avatar', function( $avatar, $id_or_email ) {
    return '';  // No mostrar avatares
}, 1, 2 );

// O deshabilitar Gravatar pero mantener avatares locales
update_option( 'show_avatars', 0 );

Opción 3: Plugin de avatares locales

  • “Simple Local Avatars”
  • “WP User Avatar”

Google Fonts (Temas de WordPress)

Nota Importante

WordPress core NO carga Google Fonts, pero muchos temas sí lo hacen.

Ubicación Típica

https://fonts.googleapis.com/css?family=Roboto:400,700
https://fonts.gstatic.com/s/roboto/v30/...

Cuándo se Carga

  • Frontend del sitio
  • Cada página vista

Privacidad

  • Riesgo: ALTO
  • Google recibe IP de cada visitante
  • Controversia legal en Europa (sentencias alemanas)
  • GDPR: Transmisión de IP a Google sin consentimiento es problemática

Verificación

# Buscar en tema activo
grep -r "fonts.googleapis.com" wp-content/themes/

Soluciones

Opción 1: Hospedar fuentes localmente

  • Plugin: “OMGF” (Optimize My Google Fonts)
  • Plugin: “Local Google Fonts”

Opción 2: Desactivar en el tema (vía functions.php)

// Ejemplo para Twenty Twenty-One
add_action( 'wp_enqueue_scripts', function() {
    wp_dequeue_style( 'twenty-twenty-one-google-fonts' );
}, 100 );

CDNs Externas (jQuery, etc.)

WordPress Core

Buenas noticias: WordPress NO usa CDNs externas por defecto.

  • jQuery está incluido localmente en wp-includes/js/jquery/
  • Todas las librerías JS/CSS están auto-hospedadas

Plugins y Temas

Atención: Plugins y temas pueden cargar desde CDNs:

  • cdnjs.cloudflare.com
  • cdn.jsdelivr.net
  • code.jquery.com
  • maxcdn.bootstrapcdn.com

Verificación

# Buscar CDNs en plugins
grep -r "cdn\." wp-content/plugins/

# Buscar en tema
grep -r "cdn\." wp-content/themes/

Privacidad

  • Riesgo: Variable según CDN
  • CDNs reciben IP de cada visitante
  • Potencial tracking

Akismet (Antispam)

Servicio

https://akismet.com/

Propósito

Filtrado de spam en comentarios.

Plugin

wp-content/plugins/akismet/ (incluido por defecto, pero requiere activación)

Cuándo se Activa

  • Solo si el plugin Akismet está activado Y configurado con API key
  • No activo por defecto en instalación fresca

Datos Enviados (si está activo)

  • Contenido del comentario
  • Email del comentarista
  • IP del comentarista
  • User-Agent
  • URL del sitio
  • Fecha/hora

Privacidad

  • Riesgo: ALTO (si está activo)
  • Automattic (Akismet) recibe datos personales de comentaristas
  • Requiere política de privacidad y potencialmente consentimiento GDPR

Estado por Defecto

  • Plugin incluido: Sí
  • Plugin activado: NO (requiere activación manual)
  • Configurado: NO (requiere API key de Akismet.com)

No es una llamada externa por defecto en WordPress “out of the box”.

Resumen de Servicios Terceros

ServicioActivo por DefectoTipo de ConexiónDatos PersonalesRiesgo GDPR
browsehappy.comSí (condicional)Navegador usuarioIP, User-AgentMedio
wordpress.org/newsServidor proxyURL sitioBajo
wordpress.org/supportNo (solo enlace)Navegador usuarioIP (si click)Bajo
Ping-O-MaticSí (si configurado)ServidorDatos públicosBajo
PingbackSí (si habilitado)ServidorURL postBajo
oEmbed APIsSí (al usar)Servidor + UsuarioIP usuario finalAlto
GravatarNavegador visitanteMD5 email, IPAlto
Google FontsNo (depende tema)Navegador visitanteIPAlto
CDNsNo (depende plugins)Navegador visitanteIPMedio
AkismetNo (desactivado)ServidorDatos comentariosAlto

Conclusiones

Servicios con Mayor Riesgo de Privacidad

  1. Gravatar – IP de visitantes, tracking
  2. oEmbed (YouTube, etc.) – Tracking de visitantes por terceros
  3. Google Fonts (temas) – IP de visitantes a Google
  4. Browse Happy – IP y User-Agent de administradores

Recomendaciones

  1. Auditar tema activo: Verificar Google Fonts y CDNs
  2. Considerar desactivar Gravatar: O usar avatares locales
  3. Revisar oEmbed: Implementar lazy load o consentimiento
  4. Documentar en política de privacidad: Todos los servicios activos
  5. Configurar XML-RPC: Desactivar si no se usa
  6. Revisar plugins: Pueden agregar servicios externos adicionales

Páginas: 1 2 3 4 5 6

Comments

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *