<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>Ayuda WordPress</title>
	<atom:link href="https://ayudawp.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://ayudawp.com</link>
	<description>Recursos, temas, plugins, tutoriales en español</description>
	<lastBuildDate>Mon, 27 Jul 2026 22:08:08 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://ayudawp.com/wp-content/uploads/2026/05/cropped-ayuda-wordpress-32x32.png</url>
	<title>Ayuda WordPress</title>
	<link>https://ayudawp.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
		<title>Tu currículum de WordPress ya está escrito</title>
		<link>https://ayudawp.com/curriculum-wordpress/</link>
					<comments>https://ayudawp.com/curriculum-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 28 Jul 2026 06:28:36 +0000</pubDate>
				<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[EEAT]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159996</guid>

					<description><![CDATA[A todos los que contribuís de alguna forma a WordPress os hago un regalo. Se llama Contributor Résumé, un plugin gratuito que muestra todas tus colaboraciones en un currículum, siempre actualizado, que puedes publicar en tu propia web]]></description>
										<content:encoded><![CDATA[<p>Escribo en Ayuda WordPress desde diciembre de 2007, tengo <a href="https://profiles.wordpress.org/fernandot/" target="_blank" rel="noopener">perfil de colaborador en WordPress.org</a> desde noviembre de 2008 y desde entonces he sido GTE de la traducción al español, parte del equipo de soporte en los foros, administrador de la web en español de WordPress.org y ponente en más WordCamps de las que me caben en la cabeza.</p>
<p>Todo eso se puede comprobar, sí, pero queda repartido en media docena de sitios que casi nadie visita (tu perfil de wordpress.org, translate.wordpress.org, los foros de soporte, la API de reconocimientos del núcleo, el directorio de fotos), y cada uno cuenta solo un trocito de tu historia, nunca la historia entera.</p>
<p>Así que <strong>me he hecho un regalo, y de paso os lo hago a todos los que contribuís de alguna forma a este proyecto</strong> llamado WordPress. Se llama <strong><a href="https://es.wordpress.org/plugins/contributor-resume/">Contributor Résumé</a></strong>, un plugin gratuito que coge todo ese trabajo disperso y lo convierte en un currículum bonito, siempre actualizado, que puedes publicar en tu propia web con un solo bloque.</p>
<p>Vamos a ver qué tiene dentro, cómo lo pones en marcha y por qué para mí <strong>esto no es un plugin más</strong>.</p>
<h2>Un currículum de verdad para quien nos regala su tiempo y conocimiento</h2>
<p>La idea es tan sencilla que casi da vergüenza no haberla hecho antes, pues escribes tu nombre de usuario de WordPress.org, compruebas lo que ha encontrado el plugin y publicas tu página. <strong>Nada de IDs numéricos, nada de tokens, nada de código.</strong> Esto vale igual si traduces, si respondes en el foro, si organizas meetups o si simplemente haces fotos para el directorio, no solo si publicas plugins.</p>
<p>Un único bloque, o el shortcode <code>[contributor_resume]</code> si trabajas con un tema clásico, agrupa decenas de secciones distintas, todas opcionales. Estas son algunas de las que más se van a usar:</p>
<ul>
<li><strong>Perfil destacado:</strong> tu avatar, tus distinciones reales de wordpress.org y los enlaces a tu web, GitHub y Slack.</li>
<li><strong>Impacto reciente:</strong> tus contribuciones de los últimos 30, 90 y 365 días, con puntuación incluida.</li>
<li><strong>Eventos:</strong> las WordCamps y meetups en las que hablas, organizas o asistes.</li>
<li><strong>Traducciones:</strong> tus idiomas, tus permisos y el número de proyectos en cada uno.</li>
<li><strong>Soporte:</strong> los hilos que has abierto y las respuestas que has dado en los foros.</li>
<li><strong>Reconocimientos del núcleo:</strong> las versiones de WordPress en cuyos créditos aparece tu nombre.</li>
<li><strong>Plugins y temas:</strong> los que has publicado, con sus estadísticas, y los que tienes marcados como favoritos.</li>
<li><strong>GitHub:</strong> tu perfil y tus repositorios con más estrellas, sin necesitar ningún token para verlo.</li>
</ul>
<p>Y quedan más, porque también incluye <strong>fotos del directorio</strong> de WordPress con su propia caja de luz, tu <strong>compromiso de horas</strong> semanales, la <strong>biografía</strong> con tu historia de origen, los <strong>equipos</strong> e <strong>idiomas</strong> de tu comunidad de contribución, y alguna sección más. Decenas de proyectos, cada uno reordenable arrastrando y soltando, y activable o no según lo que quieras enseñar. No está mal ¿no?</p>
<p>Además, que es <a href="https://ayudawp.com/por-que-no-hay-certificaciones-oficiales-de-wordpress/" target="_blank" rel="noopener">el único currículum de WordPress real que hay</a>.</p>
<h2>¡Es taaan mooonoooo!</h2>
<p><a href="https://ayudawp.com/?attachment_id=160032" rel="nofollow"><img fetchpriority="high" decoding="async" class="sombra alignnone wp-image-160032 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/07/contributor-resume-ajustes-1200x730.jpg" alt="" width="1200" height="730" srcset="https://ayudawp.com/wp-content/uploads/2026/07/contributor-resume-ajustes-1200x730.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/07/contributor-resume-ajustes-768x467.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/07/contributor-resume-ajustes-1536x934.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/07/contributor-resume-ajustes.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<p>Si es que encima es bonito y para (casi) todos los gustos. Tienes <strong>tres estilos</strong>, uno moderno, uno clásico con aspecto de currículum impreso de toda la vida y uno monoespaciado que parece sacado de una terminal, para quien quiera presumir de friki con estilo.</p>
<p>A eso le sumas <strong>claro, oscuro o automático</strong> según lo que prefiera quien visita tu web, color de realce propio o heredado del tema, radio de esquinas, sombra, columnas de la cuadrícula y un diseño compacto si prefieres ir al grano. Las estadísticas se animan con un contador que sube según entran en pantalla, y se paran en seco si el visitante tiene activada la reducción de movimiento.</p>
<p>Puedes arrastrar las secciones para reordenarlas, elegir cuántos elementos muestra cada cuadrícula, y probarlo todo con una vista previa en directo, en escritorio y en móvil, sin salir de los ajustes. Y si con eso no tienes bastante, cada plantilla se puede copiar a tu tema y editarla a mano, con variables CSS documentadas bajo el prefijo <code>--cvr-</code>.</p>
<h2>Solo tus datos, y ni uno de quien te visita</h2>
<p>El plugin lee <strong>tus datos públicos de contribución en las URLs oficiales de WordPress.org</strong> (y, si añades tu usuario, también en la API pública de GitHub), y nunca recoge ni envía nada de quien entra en tu página. Las páginas públicas no hacen ninguna petición externa, y los avatares y las fotos los carga el navegador de tu visitante directamente desde WordPress.org, Gravatar o GitHub, igual que hace WordPress toda la vida con los avatares de los comentarios.</p>
<p>El único dato que sale de tu servidor es tu nombre de usuario, y solo cuando generas o actualizas el currículum en segundo plano. Si añades un token de acceso de GitHub (opcional, solo para subir el límite de peticiones a su API), se queda guardado en tu web y no se muestra jamás en la parte pública.</p>
<h2>Cómo lo pones en marcha en un par de minutos</h2>
<ol>
<li>Instala y activa el plugin.</li>
<li>Abre «Contributor Résumé» desde el menú de tu cuenta en la barra de admin superior, o desde el enlace de ajustes que aparece junto al plugin en la pantalla de plugins.</li>
<li>Escribe tu nombre de usuario de WordPress.org (y, si quieres, el de GitHub) y pulsa «Comprobar y crear mi currículum».</li>
<li>Pulsa «Crea mi página de currículum», o añade el bloque (o el shortcode <code>[contributor_resume]</code>) a cualquier página que ya tengas.</li>
</ol>
<p><img decoding="async" class="alignnone size-full wp-image-160011" src="https://ayudawp.com/wp-content/uploads/2026/07/Activar-Contributor-Resume.jpg" alt="" width="1200" height="1184"></p>
<p>Funciona igual de bien con el editor de bloques que con un tema clásico, y si administras varias instalaciones o trabajas con entornos de prueba, <code>wp cresume refresh</code>, <code>wp cresume status</code> y <code>wp cresume clear-cache</code> te dejan gestionar la caché entera desde WP-CLI.</p>
<h2>¿Quieres verlo ya?</h2>
<p>Tengo mi propio currículum publicado en <a href="https://ayudawp.com/fernando-tellado-wordpress-org/">esta misma web</a>, con casi todas las secciones activadas, así que puedes verlo en marcha antes de instalar nada. Ahí aparecen mis 24 plugins publicados, mis traducciones a 23 idiomas repartidas en 3.416 proyectos, mis 134 hilos abiertos y 856 respuestas en los foros de soporte, y las WordCamps en las que he hablado solo en lo que llevamos de 2026.</p>
<p>Lo mejor es ver cómo suben solos los contadores de «Impacto reciente» mientras cargas la página, en vez de una foto de perfil de 2015 congelada para siempre. Los datos se actualizan sin que yo tenga que tocar nada.</p>
<p>Si lo prefieres, en la página del plugin <a href="https://es.wordpress.org/plugins/contributor-resume/?preview=1" target="_blank" rel="nofollow noopener">puedes lanzar una vista previa en directo</a> y WordPress.org te monta una web con el plugin activo para que pruebes con tu propio perfil.</p>
<h2>Por qué esto no es un plugin más, es un regalo</h2>
<p>Todos mis plugins resuelven un problema técnico, ya sea de seguridad, de rendimiento, de SEO o de cumplimiento normativo. Este no, este es diferente, este está dedicado a ti, que contribuyes a que todos podamos disfrutar de WordPress.</p>
<p>Es un plugin para quien traduce cadenas a las tres de la mañana, para quien modera un hilo de soporte enrevesado, quien organiza una WordCamp sin cobrar un euro, o quien hace fotos para el directorio de WordPress, porque todas esas personas, casi siempre anónimas, se merecen algo más que una insignia enterrada en un perfil que casi nadie mira. E</p>
<p>s gratis, sin letra pequeña ni versión de pago escondida detrás de las funciones buenas, porque la comunidad que me ha dado casi 20 años de carrera no me debe nada a mí, se lo debo yo a ella. Ya escribí en su día sobre <a href="https://ayudawp.com/tag/gpl/" target="_blank" rel="noopener">por qué es importante tanto el software libre</a>, así que no me voy a repetir aquí.</p>
<p>Si contribuyes de cualquier forma (código, traducciones, soporte, fotos, eventos, lo que sea), instálalo en tu web, crea tu página, y enséñale al mundo lo que llevas currado todo este tiempo. Y si todavía no contribuyes a nada, esto también vale como <strong>excusa estupenda para empezar a contribuir a WordPress</strong>, porque ya sabes dónde vas a poder enseñarlo después.</p>
<p>Puedes incluso <a href="https://translate.wordpress.org/projects/wp-plugins/contributor-resume">traducirlo tú mismo</a> a tu idioma, porque de momento solo está en español e inglés (dentro de nada en italiano), y a un plugin que celebra a quien traduce le vendría de perlas que también lo traduzcan.</p>
<p>Como dice el pie de página de wordpress.org, «<code><strong>el código es poesía</strong></code>». Pues ahora, además, tienes dónde publicar el tuyo. Si te lo instalas, cuéntame en los comentarios cómo te ha quedado o qué sección echas en falta.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/curriculum-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Qué tipos de Schema elijo entre todo esto?: Article, BlogPosting, NewsArticle, TechArticle, FAQ, WebPage…</title>
		<link>https://ayudawp.com/schemas-article-webpage/</link>
					<comments>https://ayudawp.com/schemas-article-webpage/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 06:28:09 +0000</pubDate>
				<category><![CDATA[SEO / AEO / GEO / AIO]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[JSON-LD]]></category>
		<category><![CDATA[schema.org]]></category>
		<category><![CDATA[Visibility]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159980</guid>

					<description><![CDATA[¿Te lías con los distintos tipos de Schema que puedes elegir para tus publicaciones? Te lo explico facilito…]]></description>
										<content:encoded><![CDATA[<p>Desde que <a href="https://es.wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="noopener">Visibility</a> estrenó el <strong>selector de tipo de schema</strong> me llega la misma pregunta por todas partes, en los comentarios, en el foro de soporte y hasta por correo. <strong>¿Qué elijo aquí?</strong></p>
<p>Te lo adelanto ya, pero en plan básico: para una entrada normal de blog, <code>BlogPosting</code> o el valor por defecto, para una página corriente, <code>WebPage</code>, y entre los subtipos de la familia <code>Article</code> la elección apenas cambia nada en los resultados de Google, aunque sí en cómo te leen los asistentes de IA.</p>
<p>Sí, para empezar vale, como resumen cojonudo, pero si quieres hacerlo bien no te puedes quedar ahí, que la cosa tiene su miga, y lo mejor de todo es que de paso te va a servir aunque uses Yoast, Rank Math, el mismo Visibilty o cualquier otro plugin SEO, porque la etiqueta final es la misma.</p>
<p>Vamos a verlo de a pasito que dirían en mi pueblo.</p>
<h2>Qué es eso del «tipo de schema»</h2>
<p>Cualquier plugin de SEO, Visibility, Yoast, Rank Math el que sea, añade al código de cada página que publicas un bloque de <strong>JSON-LD, que son datos estructurados</strong> en formato JSON, invisibles para el visitante pero que las máquinas leen sin problema.</p>
<p>Dentro de ese bloque JSON-LD hay <strong>una propiedad llamada <code>@type</code> que dice qué es esa página</strong>, si un artículo, una noticia, una página de contacto o un perfil.</p>
<p><strong>El tipo de schema es la etiqueta</strong> de una caja de mudanza, donde todas las cajas son iguales por fuera, y lo que cambia cómo las tratan los transportistas es que ponga libros o vajilla. Si marcas como vajilla una caja llena de libros no pasa nada grave, pero el que la abra esperando platos dejará de fiarse de tus etiquetas.</p>
<p>Con Google pasa lo mismo,<strong> una etiqueta que no se corresponde con el contenido no te penaliza de entrada, pero deja de servir para algo</strong>, y si encima es engañosa a propósito hay una <a href="https://support.google.com/webmasters/answer/9044175" target="_blank" rel="noopener nofollow">acción manual</a> esperándote en Search Console con el nombre de «marcado estructurado con spam».</p>
<h2>Dónde se elige el tipo de Schema en tu plugin SEO</h2>
<p>Cada plugin tiene sus manías, por ejemplo, en Visibility te deja <strong>fijarlo en dos niveles</strong>, por un lado, en los ajustes del módulo de descubrimiento <strong>eliges el tipo por defecto para cada tipo de contenido, uno para las entradas, otro para las páginas y así con cada tipo personalizado</strong> que tengas.</p>
<p>Luego, en la barra lateral del editor, entrada por entrada, puedes <strong>sustituir ese valor cuando una publicación concreta consideres que requiera otro Schema</strong>. Esto también lo tienen otros plugins, como Rank Math o Yoast.</p>
<p>La opción «Por defecto (<code>Article</code>)» del desplegable de Visibility y otros plugins significa justo eso, que se aplique lo que hayas configurado para ese tipo de contenido, así que <strong>si no tienes un motivo concreto para cambiarlo, déjalo en «Por defecto» y a otra cosa</strong>.</p>
<p><!-- CAPTURA: selector de tipo de schema en la barra lateral del editor, con el desplegable abierto --></p>
<p>Si vienes de otro plugin SEO la lógica es muy parecida, Yoast lo llama «Page type» y «Article type» en su pestaña de schema, Rank Math lo llama «Schema Type» y SEOPress tiene su equivalente en los datos estructurados.</p>
<p>Todo lo que cuento en este artículo te <strong>sirve igual con cualquier plugin de SEO</strong>. Si te pasas a Visibility el importador de un clic se trae también estos valores desde Yoast, Rank Math y All in One SEO, junto con el resto de tus metadatos, al contrario no te prometo lo mismo.</p>
<h2>La familia <code>Article</code>: seis etiquetas para casi lo mismo</h2>
<p>El primer grupo del selector lo forman los <strong>subtipos de artículo, pensados para contenido editorial con autor y fecha</strong>:</p>
<ul>
<li><code>Article</code>: el genérico, válido para cualquier contenido editorial y la elección segura cuando dudas.</li>
<li><code>BlogPosting</code>: la entrada de blog clásica, con voz y firma. Si tu web es un blog es tu etiqueta natural.</li>
<li><code>NewsArticle</code>: noticias y actualidad, contenido pegado a un hecho con fecha. Si cubres la actualidad de tu sector, este.</li>
<li><code>TechArticle</code>: tutoriales, guías paso a paso y documentación técnica. En un blog de tutoriales como este es el que más sentido tiene.</li>
<li><code>ScholarlyArticle</code>: estudios y trabajos con metodología, más propio de webs académicas o de investigación.</li>
<li><code>Report</code>: informes y análisis con datos, tipo estudio anual o comparativa documentada.</li>
</ul>
<p>Pues bien, <strong><a href="https://developers.google.com/search/docs/appearance/structured-data/article" target="_blank" rel="noopener nofollow">la documentación de Google</a> solo contempla tres de ellos</strong> para su función de artículo, <code>Article</code>, <code>NewsArticle</code> y <code>BlogPosting</code>, y los trata como intercambiables. Los otros tres son subtipos válidos de schema.org que Google ni siquiera menciona.</p>
<p>O sea, que <strong>elegir entre <code>BlogPosting</code> y <code>NewsArticle</code> no va a cambiar cómo te muestra Google, y elegir <code>TechArticle</code> no te da nada extra en sus resultados</strong>.</p>
<p>¿Entonces para qué molestarse?, pues porque <strong>Google no es el único que lee esa etiqueta, los asistentes de IA y los motores de respuesta leen el <code>@type</code></strong> tal cual, sin interpretarlo, igual que cualquier agente que rastree tu web.</p>
<p>Para un asistente de IA <strong>un <code>TechArticle</code> le dice que lo que tiene delante es un tutorial técnico</strong>, y que lo entregue cuando alguien pregunte cómo hacer algo, y <strong>de un <code>NewsArticle</code>  le dice que es una noticia, y que tenga muy en cuenta la fecha</strong>.</p>
<p>Ser preciso te cuesta un clic y aporta contexto a todo lo que no es Google.</p>
<blockquote><p>Para Google, BlogPosting y NewsArticle son la misma etiqueta con distinto nombre, pero para un asistente de IA son dos cosas distintas.</p></blockquote>
<p>Eso sí, sin venirte arriba, que <a href="https://developers.google.com/search/docs/appearance/ai-features" target="_blank" rel="noopener nofollow">Google ha dicho por escrito</a> que sus funciones de IA no requieren ningún schema especial. La etiqueta correcta evita que las máquinas tengan que adivinar qué es tu contenido, y ahí se acaba su potencial.</p>
<h2>La familia <code>WebPage</code>: sus apellidos</h2>
<p>El segundo grupo es para páginas, <strong>contenido sin la lógica de autor y fecha de un artículo</strong>. La estructura se repite, con un tipo genérico y varios subtipos que lo afinan:</p>
<ul>
<li><code>WebPage</code>: la página genérica, tu elección por defecto para páginas y la correcta en el 90% de los casos.</li>
<li><code>AboutPage</code>: la página «sobre mí» o «sobre nosotros». Refuerza la identidad del sitio, que es de lo que hablamos un poco más abajo.</li>
<li><code>ContactPage</code>: la página de contacto, una señal de transparencia que a las máquinas les viene de perlas para saber cómo localizarte.</li>
<li><code>ProfilePage</code>: el perfil de una persona o entidad. Es el único de este grupo con función propia <a href="https://developers.google.com/search/docs/appearance/structured-data/profile-page" target="_blank" rel="noopener">documentada por Google</a> desde noviembre de 2023, y el propio Google recomienda usarlo en las páginas de autor que enlaza el schema A<code>Tu código aquí</code>rticle, pura señal <a href="https://ayudawp.com/eeat-wordpress/" target="_blank" rel="noopener">E-E-A-T</a> (experiencia, conocimiento, autoridad y confianza, su mantra de calidad).</li>
<li><code>CollectionPage</code>: páginas que recopilan otras cosas, como un directorio de recursos o un listado de herramientas.</li>
<li><code>ItemPage</code>: una página dedicada a un único elemento concreto, la ficha de algo que no está a la venta.</li>
</ul>
<p>Ninguno de estos tipos te va a pintar estrellitas en Google, y no pasa nada. <strong>Su trabajo es de identidad, decirle a quien rastrea tu web qué es cada página dentro del conjunto</strong>, que es lo que un asistente necesita para citarte bien.</p>
<h2>Los que no suelen estar en el selector de Schema, y casi mejor</h2>
<p>Faltan los famosos <code>Product</code>, <code>Recipe</code>, <code>Event</code>, <code>VideoObject</code> y <code>LocalBusiness</code> y si no los he incluido en Visibility no ha sido por despiste, es una decisión que tiene sus motivos.</p>
<p>El motivo principal para no incluir en un plugin de SEO por defecto este montón de tipos de Schema es que todos esos tipos tienen <strong>propiedades obligatorias que tu contenido no lleva (normalmente) de serie</strong>.</p>
<p>Un <code>Product</code> exige precio, moneda y disponibilidad, un <code>Recipe</code> quiere ingredientes y tiempos, un <code>Event</code> pide fechas y lugar, para que nos entendamos rápido.</p>
<p>Generar esas etiquetas sin sus propiedades te genera errores en Search Console, y <strong>un schema con errores es peor que no tener schema</strong>, porque le estás enseñando a Google cajas que prometen un contenido pero que al abrirlas están vacías.</p>
<p>Hay una segunda razón de peso, y es que <strong>quien de verdad posee ese dato ya genera ese schema</strong>. Un ejemplo que conocerás de sobras es WooCommerce, que ya genera el <code>Product</code> con el precio y el inventario reales.</p>
<p>Plugins muy conocidos, como por ejemplo The Events Calendar, genera el <code>Event</code> con sus fechas, y los plugins de recetas tipo WP Recipe Maker hacen lo propio con el <code>Recipe</code>.</p>
<p>Si Visibility, u otro plugin de SEO, te dejase elegir <code>Product</code> en el desplegable de una entrada, estaría duplicando o, peor todavía, contradiciendo al plugin que tiene los datos buenos, y de serie.</p>
<p>También hay que decirlo, los plugins de SEO que ofrecen estos tipos mediante un <strong>constructor de campos manuales de datos estructurados</strong> lo hacen bien si te molestas en rellenarlos, y si es así al menos tienes la oportunidad de hacerlo bien.</p>
<p>El problema es el desplegable alegre que te deja marcar cualquier cosa sin pedirte los datos, que de esos también hay. Si algún día estos tipos decido meterlos en Visibility será con un constructor de campos en condiciones, que <strong>lo último que te hace falta es una casilla que te anime a mentirle a Google</strong>.</p>
<h2>El cementerio de los resultados enriquecidos</h2>
<p>Google lleva años haciendo poda de resultados enriquecidos, y ese recorte explica por qué tampoco verás <code>FAQ</code> ni <code>HowTo</code> en el selector de tipos de Schema.</p>
<p>La lista de bajas impresiona (que en paz descansen):</p>
<ul>
<li><code>HowTo</code>: limitado primero en móvil y <a href="https://developers.google.com/search/blog/2023/08/howto-faq-changes" target="_blank" rel="noopener">eliminado del todo en septiembre de 2023</a>. Los pasos con fotos en los resultados son historia.</li>
<li><code>FAQ</code>: restringido en agosto de 2023 a webs gubernamentales y de salud, y <a href="https://developers.google.com/search/docs/appearance/structured-data/faqpage" target="_blank" rel="noopener">rematado para todo el mundo el 7 de mayo de 2026</a>. Los desplegables de preguntas bajo tu resultado ya no existen para nadie, y en junio de 2026 desaparecieron también del informe de Search Console y de la prueba de resultados enriquecidos.</li>
<li>La masacre de junio de 2025: <code>Course Info</code>, <code>Claim Review</code>, <code>Estimated Salary</code>, <code>Learning Video</code>, <code>Special Announcement</code> y <code>Vehicle Listing</code>, <a href="https://developers.google.com/search/blog/2025/06/simplifying-search-results" target="_blank" rel="noopener nofollow">todos fuera por poco uso</a>.</li>
<li>La segunda tanda de noviembre de 2025: <a href="https://developers.google.com/search/blog/2025/11/update-on-our-efforts" target="_blank" rel="noopener nofollow">más funciones retiradas</a>, entre ellas los problemas de práctica (<em>practice problems</em>) desde enero de 2026.</li>
</ul>
<p>La razón, en el caso del <code>FAQ</code> es, para variar, el abuso por parte de los SEO y usuarios <em>demasiado comprometidos</em>, que se marcaron preguntas de relleno a mansalva para ocupar más sitio en los resultados hasta convertirlo en <strong>spam con acordeón</strong>. En el resto de casos Google simplifica su página de resultados para dejar hueco a sus propia funciones de IA.</p>
<p>Así que <strong>el marcado <code>FAQPage</code> sigue siendo schema.org válido y otros sistemas pueden leerlo, pero como truco para ganar espacio en Google está muerto</strong>, y si un tutorial de 2022 te anima a marcar <code>FAQ</code> para conseguir los desplegables, ya sabes de qué año es esa información.</p>
<h2>La identidad del sitio: <code>Organization</code>, <code>Person</code> y el baile de los <code>@id</code></h2>
<p>Queda un tipo de schema que no aparece en los desplegables, y es debido a que no es de página, es de sitio. Tu web entera tiene una identidad, una <strong><code>Organization</code> si eres una empresa o un proyecto, una <code>Person</code> si eres tú a título personal</strong>, y esa identidad debe declararse una sola vez, en la portada, con todos sus datos.</p>
<p>Aquí entra el baile de los <code>@id</code>, porque cada nodo de schema puede llevar un <code>@id</code>, que viene a ser su DNI, <strong>una URL única que permite que otros schemas lo referencien en vez de repetirlo</strong>.</p>
<p>Si usas <a href="https://es.wordpress.org/plugins/vigia/" target="_blank" rel="noopener">VigIA</a>, que emite el JSON-LD de identidad del sitio en la portada, Visibility detecta ese nodo y hace que el <code>publisher</code> de cada artículo apunte al mismo <code>@id</code> en lugar de crear una Organization duplicada.</p>
<p>Dos fichas de la misma entidad con datos distintos confunden a cualquier máquina, y <strong>la gracia de coordinar los <code>@id</code> es que todo tu sitio dice lo mismo sobre quién eres, lo mire quien lo mire</strong>.</p>
<p>Lo bueno de usar este conjunto es que <strong>se complementan sin pisarse</strong>, la ventaja de coordinar plugins, en principio para usos diferentes, pero al final todo tiene algo de relación, como es el caso.</p>
<h2>Cómo comprobar si lo has hecho bien</h2>
<p>Tres pruebas rápidas y gratis:</p>
<ol>
<li>Abre el código fuente de una entrada (clic derecho en la página) y busca <code>application/ld+json</code>. Ahí verás el bloque con el <code>@type</code> que has elegido, junto al <code>BreadcrumbList</code> (las migas de pan) que Visibility añade por su cuenta.</li>
<li>Pasa la URL por la <a href="https://search.google.com/test/rich-results" target="_blank" rel="noopener nofollow">prueba de resultados enriquecidos de Google</a> para ver qué funciones detecta. Ojo, solo te enseñará las que Google mantiene vivas.</li>
<li>Pasa la misma URL por el <a href="https://validator.schema.org/" target="_blank" rel="noopener nofollow">validador de schema.org</a>, que comprueba si el marcado es válido aunque Google no pinte nada con él. Para los tipos que Google ignora, este es tu árbitro.</li>
</ol>
<h2>Chuleta rápida para casi ni pensar</h2>
<table>
<thead>
<tr>
<th>Contenido</th>
<th>Tipo recomendado</th>
</tr>
</thead>
<tbody>
<tr>
<td>Entrada de blog</td>
<td><code>BlogPosting</code> (o «Por defecto»)</td>
</tr>
<tr>
<td>Noticia o actualidad del sector</td>
<td><code>NewsArticle</code></td>
</tr>
<tr>
<td>Tutorial, guía o documentación</td>
<td><code>TechArticle</code></td>
</tr>
<tr>
<td>Estudio con metodología</td>
<td><code>ScholarlyArticle</code></td>
</tr>
<tr>
<td>Informe o análisis con datos</td>
<td><code>Report</code></td>
</tr>
<tr>
<td>Página corriente</td>
<td><code>WebPage</code></td>
</tr>
<tr>
<td>Página «sobre mí» o «sobre nosotros»</td>
<td><code>AboutPage</code></td>
</tr>
<tr>
<td>Página de contacto</td>
<td><code>ContactPage</code></td>
</tr>
<tr>
<td>Recopilación, directorio o listado</td>
<td><code>CollectionPage</code></td>
</tr>
<tr>
<td>Página de autor o perfil</td>
<td><code>ProfilePage</code></td>
</tr>
<tr>
<td>Ficha de un elemento único (sin venta)</td>
<td><code>ItemPage</code></td>
</tr>
</tbody>
</table>
<p>Si después de la tabla sigues con dudas, déjalo en «Por defecto», que para eso está y no te vas a equivocar. <strong>Lo importante es no mentir con la etiqueta, el subtipo perfecto es secundario</strong>.</p>
<p>Si quieres seguir tirando del hilo de cómo leen tu web los asistentes de IA, tengo <a href="https://ayudawp.com/categoria/seo/" target="_blank" rel="noopener">unas cuantas guías publicadas sobre el tema de visibilidad en IAs</a>.</p>
<p>Para dudas concretas sobre tu caso, que seguro que las hay porque este tema las genera solas, me tienes ahí abajo, en la sección de comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/schemas-article-webpage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Por qué el robots.txt es un problema gordo en WordPress multisitio … pero afortunadamente tiene solución</title>
		<link>https://ayudawp.com/robots-txt-wordpress-multisitio/</link>
					<comments>https://ayudawp.com/robots-txt-wordpress-multisitio/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 23 Jul 2026 06:28:23 +0000</pubDate>
				<category><![CDATA[SEO / AEO / GEO / AIO]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Content Signals]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[llms.txt]]></category>
		<category><![CDATA[robots.txt]]></category>
		<category><![CDATA[Visibility]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159867</guid>

					<description><![CDATA[Quieres que un sitio tenga unas reglas en el robots.txt y otro las suyas, porque no todos necesitan lo mismo, y resulta que WordPress te sirve el mismo robots.txt para todos]]></description>
										<content:encoded><![CDATA[<p>Si gestionas una <strong>red de WordPress con varios sitios</strong> esto te va a sonar…</p>
<p><strong>Quieres que un sitio tenga unas reglas en el <code>robots.txt</code> y otro las suyas</strong>, normal ¿no?, porque no todos necesitan lo mismo, y resulta que <strong>WordPress te sirve el mismo <code>robots.txt</code> para todos</strong>. Y encima, si abres el de cualquiera de los dominios, ves uno que no has puesto tú.</p>
<p>Me lo trajo hace poco un cliente <a href="https://mantenimiento.ayudawp.com/" target="_blank" rel="noopener">del servicio de mantenimiento</a>, con un multisitio de varios dominios, que me pidió <strong>tocarle los <code>robots.txt</code> de cada web</strong>.</p>
<p>Cuando me puse a mirarlo <strong>resulta que el problema no era suyo ni de su configuración, era de cómo funciona WordPress por dentro con los ficheros en una red multisitio</strong>.</p>
<p>Así que aprovecho para contártelo con calma, porque tiene más miga de la que parece. Y sí, ya te lo adelanto, <strong>se puede tener un robots.txt distinto por sitio en una red multisitio de WordPress</strong>, pero antes hay que darle una pensada, porque todo tiene sus matices.</p>
<h2>¿Por qué en cada dominio de WordPress multisitio hay dos archivos para robots?</h2>
<p>Primero, un apunte rápido para quien llegue nuevo. WordPress no crea un fichero <code>robots.txt</code> de verdad en el disco, lo genera dinámicamente cada vez que alguien lo pide, lo que se llama un <code>robots.txt</code> virtual. Puedes verlo y modificarlo, pero eso ya te lo conté al detalle en <a href="https://ayudawp.com/robots-txt-virtual-wordpress/" target="_blank" rel="ugc noopener">el post sobre el robots.txt virtual de WordPress</a>, con el truco de verlo tecleando <code>?robots=1</code> y el filtro para cambiarlo.</p>
<p>El caso de mi cliente era que en su multisitio hay un <code>robots.txt</code> físico, un fichero de verdad, en la raíz del dominio principal, el que aloja la red y desde el que se instalan los plugins y el tema.</p>
<p>Y <strong>como toda la red comparte esa misma carpeta raíz, ese fichero se sirve igual para todos los dominios</strong>, así que tecleas <code>otro-dominio.com/robots.txt</code> y <strong>sale el del principal, no el del subsitio, porque no tiene un <code>robots.txt</code> físico</strong>, no es posible.</p>
<p><strong>¿Y el virtual de cada sitio, el que tú crees que estás editando con tu plugin de SEO?</strong> Ahí sigue, pero solo aparece si lo fuerzas a mano con <code>otro-dominio.com/?robots=1</code>.</p>
<p><strong>Los rastreadores piden siempre <code>/robots.txt</code>, así que se meriendan el físico compartido y nunca ven las reglas propias de cada web</strong>. De ahí la sensación de tener dos, el que sirven los bots y el que gestiona el plugin, cada uno con sus reglas y sin enterarse el uno del otro.</p>
<p><strong>¿Y por qué gana el físico?</strong> Pues porque cuando existe uno en la raíz, <strong>lo entrega el servidor web antes de que WordPress ni siquiera arranque</strong>, así que el virtual y el filtro se quedan sin pintar nada para esa dirección.</p>
<h2>Subdominios, dominios mapeados y subcarpetas</h2>
<p>El estándar del <code>robots.txt</code>, recogido en el RFC 9309 que es la norma oficial, dice que <strong>el archivo vive en la raíz de cada host, o sea de cada dominio o subdominio</strong>, y de ahí salen tres escenarios muy distintos según cómo tengas montada la red.</p>
<ul>
<li><strong>Red por subdominios</strong> (<code>es.tudominio.com</code>, <code>en.tudominio.com</code>): cada sitio es un host distinto, así que cada uno puede y debe tener su propio <code>robots.txt</code>. Aquí lo de «uno por sitio» tiene todo el sentido.</li>
<li><strong>Red por dominios mapeados</strong> (<code>dominio.com</code>, <code>domain.com</code>): igual que el anterior, cada dominio es un host, así que cada uno lleva el suyo.</li>
<li><strong>Red por subcarpetas</strong> (<code>dominio.com/es</code>, <code>dominio.com/en</code>): todos comparten el mismo host, así que solo hay un <code>robots.txt</code> que cuente, el de la raíz del dominio, y manda el sitio principal. Un subsitio en subcarpeta no puede servir el suyo a los rastreadores por mucho plugin que le pongas.</li>
</ul>
<p><strong>Y ojo, que lo de las subcarpetas no es una carencia de WordPress, es el propio estándar.</strong></p>
<p>El <code>robots.txt</code> va en la raíz del host y punto, así que si tu red es por subcarpetas, lo máximo que puedes hacer es meter todas las reglas que necesites, conjuntas, en el <code>robots.txt</code> del dominio principal, teniendo cuidado de no meter reglas que solo sirvan para el dominio o una carpeta concreta, todas generales.</p>
<h2>¿Qué hago con el robots.txt del sitio principal?</h2>
<p>Da igual la vía que elijas luego, con código o con plugin, s<strong>i hay un <code>robots.txt</code> físico en la raíz y quieres reglas por subsitio quítalo, porque carga antes que WordPress y ningún plugin o PHP se lo puede saltar.</strong></p>
<p>Mientras ese fichero siga ahí los bots seguirán leyéndolo a él y las reglas por sitio no llegarán a ninguna parte.</p>
<p>Pero, si es el caso, <strong>con quitarlo no basta, además tienes que asegurarte de que ningún plugin te lo vuelve a crear</strong>. El editor de ficheros de Yoast, por ejemplo, escribe un <code>robots.txt</code> físico si le das al botón, y en una red ese fichero se te cuela para todos. Así que bórralo, comprueba por FTP que no reaparece, <a href="https://ayudawp.com/desactivar-el-editor-de-plugins-y-temas-en-wordpress-3-0/" target="_blank" rel="noopener">desactiva la edición de archivos dentro de WordPress</a>, y solo entonces pasamos al siguiente paso.</p>
<p>Una vez fuera  el archivo físico <strong>WordPress ya sirve el virtual de cada sitio</strong> por su cuenta, y <strong>ahí sí puedes empezar a configurar en cada web el suyo</strong>. En subdominios y dominios mapeados esto funciona tal cual, cada host sirve el suyo. En subcarpetas no hay manera, se siente, solo cuenta el del dominio principal.</p>
<h2>Cómo darle reglas propias de robots a cada subsitio de una red multisitio (con código)</h2>
<p>Si no quieres depender de ningún plugin de SEO para esto, WordPress trae un filtro, <code>robots_txt</code>, que te deja modificar el robots.txt virtual, y combinándolo con <code>get_current_blog_id()</code> (la función que te dice en qué sitio de la red estás) puedes dar reglas distintas según la web. La idea, que he ido ampliando y actualizando, me la dio <a href="https://florianbrinkmann.com/en/modifying-robots-txt-for-individual-sites-of-a-multisite-install-3364/" target="_blank" rel="nofollow noopener">Florian Brinkmann</a>, en un post de hace ya unos pocos años.</p>
<p>Lo que hay que hacer es meter el siguiente código en un <code>mu-plugin</code> que se activa en toda la red. Lo subes por FTP a la carpeta <code>wp-content/mu-plugins</code> y listo:</p>
<pre>/**
 * Plugin Name: Archivo robots.txt por sitio en WordPress Multisitio
 * Plugin URI: https://ayudawp.com/
 * Description: Permite definir reglas de robots.txt diferentes para cada sitio en una red multisitio de WordPress.
 * Version: 1.0
 * Author: Fernando Tellado
 * Author URI: https://tellado.es
 */

// Añade reglas por sitio al archivo robots.txt virtual de cada sitio a través de la red
add_filter( 'robots_txt', 'ayudawp_multisite_robots_txt', 20, 2 );

function ayudawp_multisite_robots_txt( $output, $public ) {

// Solo funciona si es multisitio
if ( ! is_multisite() ) {
return $output;
}

// Reglas por sitio asignadas por ID de blog (tienes el ID en Administrador de la red &amp;gt; Sitios)
switch ( get_current_blog_id() ) {

// Sitio con ID 2: tienda online
case 2:
$output .= "Disallow: /carrito/\n";
$output .= "Disallow: /finalizar-compra/\n";
$output .= "Disallow: /mi-cuenta/\n";
break;

// Sitio con ID 3: blog
case 3:
$output .= "Disallow: /?s=\n";
$output .= "Disallow: /descargas/\n";
$output .= "Disallow: /gracias/\n";
break;
}

return $output;
}</pre>
<p>Cambias los ID (<code>case x</code>)  y las reglas por las tuyas, y cada web servirá las suyas.</p>
<p>El código tiene sus límites, como que es obvio que lo mantienes tú a mano cada vez que cambien las necesidades, y luego claro está, no se puede aplicar a otros archivos, como el <code>llms.txt</code>, que arrastra el mismo problema. Y por supuesto, te recuerdo de nuevo que en una red en subcarpetas no hay milagro que valga.</p>
<h2>¿Afecta esto también al llms.txt?</h2>
<p>Ya que estás con el <code>robots.txt</code>, los archivos <code>llms.txt</code> sufren del mismo problema.</p>
<p>Es un fichero que <strong>sirve de índice en Markdown</strong> de tu web para los agentes de IA, y <strong>en una red cada sitio querría el suyo</strong>. Mismo patrón que el <code>robots.txt</code>, por sitio si lo sirves dinámico, y compartido y roto si escribes un físico en la raíz. La diferencia con el <code>robots.txt</code> es que aquí ni el filtro tienes.</p>
<p>WordPress no genera archivos <code>llms.txt</code> ni trae ninguna función para tocarlo, así que el <code>mu-plugin</code> de arriba no sirve y por código te quedas sin un atajo como el del <code>robots.txt</code>. Para tenerlo por sitio en una red la vía práctica es un plugin que lo genere dinámico por sitio, y de eso va lo que viene ahora.</p>
<h2>Cómo darle reglas propias de robots a cada sitio (con plugins)</h2>
<p>Si lo de mantener un mu-plugin no te apetece, o también quieres que el <code>llms.txt</code> sea configurable en cada sitio, esto <strong>lo resuelven algunos plugins</strong>.</p>
<p>De pago te lo ofrece AIOSEO, que tiene un editor de <code>robots.txt</code> de red que te deja tocar el de cada subsitio, pero solo en redes por subdominios, no por subcarpetas (lo dicen ellos en su documentación), y en su versión Pro. SEOPress anuncia edición de <code>robots.txt</code> para multisitio y multidominio, y luego hay plugins dedicados solo a esto, como Multisite Robots.txt Manager. De las subcarpetas nos seguimos olvidando, porque ya sabes que ahí manda el estándar.</p>
<p>Y luego está <strong><a href="https://wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="nofollow noopener">Visibility</a></strong>, <strong>plugin gratuito de SEO que sirve el <code>robots.txt</code> y también el <code>llms.txt</code> de cada sitio de la red</strong> por su cuenta, sin que tengas que tocar nada.</p>
<p><strong>Entrega por una única URL, la de siempre</strong>, <code>/robots.txt</code>, y de paso arregla ese lío del <code>?robots=1</code> y los 404 en instalaciones en subcarpeta. Además, está pensado para no repetir el problema, porque en una red no escribe un físico compartido, solo lo escribe donde de verdad es del sitio, en una instalación normal o en el sitio principal de una red por subcarpetas.</p>
<p>Visibility <strong>sustituye a tu plugin de SEO, no convive con él</strong>, así que si vienes de Yoast u otro plugin, esto supone cambiar el que tuvieses por Visibility, no añadir uno más, que siempre es mala idea. Pero no es algo preocupante, no pierdes nada importante, tiene lo que los demás, y algunas cosas (casi todas) las hace mejor.</p>
<p>Ah, y da igual la elección, aunque uses Visibility <strong>el <code>robots.txt</code> físico de la raíz hay que quitarlo igual</strong>, porque un fichero que sirve el servidor no lo salta nadie. Eso sí, si Visibility detecta un físico compartido tapando el virtual, te avisa en su pestaña de descubrimiento para que sepas que está ahí y lo quites.</p>
<p>Y, por si no lo sabías Visibility, además de hacer lo que todos los demás plugins de SEO, redirecciones incluidas, también emite las señales por sitio (<code>robots.txt</code>, <code>llms.txt</code> y el schema), y si además quieres medir, tienes <a href="https://wordpress.org/plugins/vigia/" target="_blank" rel="nofollow noopener">VigIA</a>, que ofrece analítica de qué rastreadores de IA entran de verdad en cada web y puede bloquearlos, y puedes complementar el pack IA con <a href="https://es.wordpress.org/plugins/ai-content-signals/" target="_blank" rel="noopener">AI Content Signals</a>, que añade las directivas de IA de Cloudflare.</p>
<h2>Resumiendo: Qué hacer con los ficheros robots.txt en multisitio según el tipo de red</h2>
<p>En un par de líneas, por si ya estás con algo de lío:</p>
<ul>
<li><strong>Si tu red es por subdominios o por dominios mapeados</strong>: quita el físico de la raíz y luego das las reglas por sitio con el mu-plugin del filtro <code>robots_txt</code>, o dejas que lo haga tu plugin de SEO (o Visibility) por ti. Cada dominio servirá el suyo.</li>
<li><strong>Si tu red es por subcarpetas</strong>: solo hay un <code>robots.txt</code>, el del dominio principal, así que mete ahí todas las reglas que necesites para los distintos subsitios. Es el único sitio donde los bots las van a leer.</li>
</ul>
<h2>¡Te toca decidir!</h2>
<p>Antes de tocar nada, échale un vistazo a tu red y mira si tienes el problema. Pide el <code>robots.txt</code> de cada dominio y compáralos, y si todos te devuelven exactamente el mismo, tienes un físico compartido mandando sobre todos.</p>
<p>Desde el terminal es tan fácil como teclear la URL tipo <code>https://dominio.com/robots.txt</code> cambiando el dominio o subdominio, y comparar lo que sale. Y si quieres ver el virtual la URL es añadir <code>?robots=1</code> al dominio o subdominio.</p>
<p>Con eso claro <strong>decides si quitar el físico y tirar de código, o quitar el físico y dejar que un plugin te sirva el de cada sitio</strong>. Lo que no funciona es dejar el <code>robots.txt</code> físico compartido ahí, porque se antepone en toda la red y, salvo que uses las mismas reglas para todos los subsitios, puedes estar creándote un problema de rastreo.</p>
<p>Si tienes una red montada de una forma rara, o te topas con algún caso que no encaja con esto, me tienes en los comentarios aquí abajo, que estos temas de multisitio siempre traen su cosilla, y no lo usa muchísima gente.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/robots-txt-wordpress-multisitio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿En qué te afecta el reglamento europeo sobre inteligencia artificial AI Act si tienes una web WordPress?</title>
		<link>https://ayudawp.com/ai-act/</link>
					<comments>https://ayudawp.com/ai-act/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 22 Jul 2026 06:28:59 +0000</pubDate>
				<category><![CDATA[IA + WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[AESIA]]></category>
		<category><![CDATA[AI Act]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Principiante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159915</guid>

					<description><![CDATA[El reglamento europeo de inteligencia artificial obliga a avisar cuando cierto contenido está hecho o tocado por IA, pero no todo, ni mucho menos, así que la primera buena noticia es que la mayoría de lo que publicas en tu WordPress no va a necesitar ningún cartel.]]></description>
										<content:encoded><![CDATA[<p>Desde el 2 de agosto de 2026 <strong>el reglamento europeo de inteligencia artificial obliga a avisar cuando cierto contenido está hecho o tocado por IA</strong>, pero no todo, ni mucho menos, así que la primera buena noticia es que la mayoría de lo que publicas en tu WordPress no va a necesitar ningún cartel de aviso. La obligación legal se centra en tres casos concretos, un chatbot que no se identifica como tal, un <em>deepfake</em> (vídeo, imagen o voz que ha sido manipulado utilizando IA) y un texto sobre un asunto serio sin revisión humana.</p>
<p>Y el problema es que la mayoría de la información disponible sobre el tema está mezclada, sin querer, entre el aplazamiento de las obligaciones de alto riesgo y lo que de verdad te toca a ti con un sitio WordPress. Vamos a separarlo con calma, caso por caso, sin dar nada por hecho, a ver si soy capaz de explicártelo como yo lo he entendido, y como lo aplico.</p>
<h2>Quién es quién ante la norma: proveedor y responsable del despliegue</h2>
<p>El reglamento reparte las obligaciones entre dos papeles distintos, y confundirlos es la fuente de la mitad de los problemas que te puedes buscar sin ayuda de nadie.</p>
<ul>
<li>El <strong>proveedor</strong> es quien construye y comercializa el sistema de IA, Anthropic con Claude, OpenAI con ChatGPT, Google con Gemini.</li>
<li>El <strong>responsable del despliegue</strong> es quien usa esa herramienta ya hecha para su propio contenido, o sea, tú con tu WordPress.</li>
</ul>
<p>Piénsalo como la diferencia entre quien fabrica un coche y quien lo conduce. Al fabricante le tocan las revisiones técnicas del motor, la homologación, que las piezas cumplan norma, al conductor le toca circular con las luces encendidas de noche y llevar el cinturón puesto. Son obligaciones distintas sobre el mismo vehículo, y confundir una con otra no libra a nadie de la suya.</p>
<p>En la práctica <strong>casi todo lo que te afecta a ti como propietario de un WordPress cae del lado del responsable del despliegue</strong>. El marcado técnico invisible del contenido, ese que debe ser legible por una máquina, corresponde al proveedor del modelo, no a ti. Lo que sí te toca es el aviso visible al usuario, y ahí es donde vamos a entrar ahora.</p>
<h2>¿Y si no estás en España, o ni siquiera en la Unión Europea?</h2>
<p>Aquí conviene hacerse una pregunta que va más allá de dónde vive tu empresa o dónde tienes contratado el hosting. El reglamento europeo tiene alcance extraterritorial, igual que el RGPD con el que ya convives si tienes un formulario de contacto en tu web. Se aplica también a proveedores y responsables del despliegue establecidos en un tercer país cuando el resultado que produce el sistema de IA se usa dentro de la Unión Europea.</p>
<p>Vamos, en lo que nos afecta, <strong>si tu web la lee gente en algún país de la Unión Europea, algo que le pasa a prácticamente cualquier blog público con un mínimo de tráfico, el reglamento entra en juego</strong> aunque tú estés en México, Argentina o al otro lado del mundo. No hace falta que factures en euros ni que tengas oficina en Europa.</p>
<p>Dicho esto, y como pasa siempre que se habla de normativa, esto es información general para que entiendas el criterio, no una sentencia sobre tu caso concreto. Si tienes dudas serias porque tu negocio tiene peso real en la Unión Europea, consulta con un abogado especializado, que para eso están.</p>
<h2>Los tres casos que de verdad te afectan en un WordPress</h2>
<p><img decoding="async" class="alignnone size-full wp-image-159977" src="https://ayudawp.com/wp-content/uploads/2026/07/AI-Act.jpg" alt="" width="1200" height="800"></p>
<p>El artículo 50 del reglamento, que es el que regula la transparencia, cubre varios supuestos, pero solo tres tienen encaje real en un sitio WordPress «normal».</p>
<h3>Un chatbot o asistente que habla con tus visitantes</h3>
<p>Si tienes un <a href="https://ayudawp.com/crear-chatbot-ia/" target="_blank" rel="ugc noopener">chatbot de atención al cliente</a>, la norma exige que quien interactúa con él sepa que está hablando con una máquina, salvo que sea tan obvio que no haga falta decirlo, un bot con nombre «Asistente IA» y avatar de robot no necesita cartel adicional. La excepción de la obviedad no es una puerta trasera para no avisar, es sentido común aplicado a los casos donde nadie en su sano juicio pensaría que habla con una persona.</p>
<h3>Una imagen, audio o vídeo que sea un deepfake</h3>
<p>Aquí está el mito más extendido de todos, la idea de que toda imagen generada con IA necesita aviso, y no es así. La obligación solo se activa con deepfakes, y la propia norma define el término con precisión, pues <strong>se refiere únicamente a contenido de imagen, audio o vídeo creado o modificado por IA que imita</strong> a personas, objetos, lugares, entidades o hechos reales de forma que pudiera hacer creer a alguien que es genuino.</p>
<p>Una ilustración abstracta para acompañar un artículo de seguridad, un fondo decorativo, una infografía inventada, nada de eso es deepfake, porque no simula que algo real haya ocurrido. <strong>Donde sí entras en el supuesto es si generas una imagen que aparenta ser una captura real de un evento que nunca pasó</strong>, o que hace pasar por auténtica la imagen de una persona real en una situación inventada.</p>
<h3>Un texto sobre un asunto de interés público</h3>
<p>Este es el que caso que tiene más matices de los tres. De lo que se trata es que <strong>si usas IA para generar o manipular texto que se publica con el fin de informar sobre asuntos de interés público</strong>, tienes que avisar de que es artificial, salvo que ese texto haya pasado por una revisión editorial sustantiva y haya una persona, física o jurídica, que asuma la responsabilidad editorial de lo publicado.</p>
<p>El matiz más relevante es que las directrices de la Comisión Europea interpretan esa excepción de forma estricta. <strong>No vale una revisión superficial ni un visto bueno de trámite</strong>, tiene que haber un examen deliberado del fondo del contenido por alguien con criterio suficiente para hacerlo. Corregir la ortografía o dar el visto bueno sin leerte el texto entero no cuenta.</p>
<p>Para la inmensa mayoría de tutoriales técnicos, el supuesto ni siquiera se activa, porque explicar cómo desactivar un widget no es informar de un asunto de interés público en el sentido que persigue la norma. Pero un artículo sobre una vulnerabilidad que afecta a un millón de webs, o sobre este mismo reglamento, empieza a acercarse a esa categoría, así que conviene tenerlo presente cuando el tema es importante.</p>
<table>
<thead>
<tr>
<th>Caso</th>
<th>¿Hay que avisar?</th>
<th>Por qué</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chatbot que interactúa con visitantes</td>
<td>Sí, salvo que sea obvio</td>
<td>Artículo 50.1: evita que alguien crea hablar con una persona</td>
</tr>
<tr>
<td>Imagen, audio o vídeo que es deepfake</td>
<td>Sí</td>
<td>Artículo 50.4: simula algo real que no ha ocurrido</td>
</tr>
<tr>
<td>Ilustración o imagen decorativa sin pretensión de realismo</td>
<td>No</td>
<td>No cumple la definición de deepfake</td>
</tr>
<tr>
<td>Texto sobre un asunto de interés público, sin revisión editorial sustantiva</td>
<td>Sí</td>
<td>Artículo 50.4, párrafo dedicado al texto</td>
</tr>
<tr>
<td>Texto sobre un asunto de interés público, con revisión tuya a fondo</td>
<td>No</td>
<td>Aplica la excepción de responsabilidad editorial</td>
</tr>
<tr>
<td>Tutorial técnico habitual, sin relación con asuntos de interés público</td>
<td>No</td>
<td>Queda fuera del supuesto por la propia naturaleza del contenido</td>
</tr>
</tbody>
</table>
<p>Cuando lo ves así, en una tabla, el titular de «hay que etiquetar todo lo que hagas con IA» se cae solo.</p>
<h2>Mitos sobre AI Act</h2>
<p>Antes de seguir, cinco ideas que circulan por ahí y que no ayudan nada.</p>
<ul>
<li><strong>«Se ha retrasado el AI Act»:</strong> Cierto a medias, y la parte cierta es justo la que no te afecta. La Unión Europea sí ha aplazado las obligaciones de los sistemas de alto riesgo, empleo, biometría, infraestructuras críticas, hasta diciembre de 2027 y agosto de 2028. Pero las obligaciones de transparencia del artículo 50, las que trata este artículo, no se han tocado y siguen entrando en vigor el 2 de agosto de 2026. Quien lea «se retrasa el AI Act» y deje de prepararse por completo se va a llevar un disgusto.</li>
<li><strong>«Tengo que etiquetar cada imagen que hago con IA»:</strong> Ya lo hemos visto arriba, y solo los deepfakes necesitan aviso, y la mayoría de las imágenes ilustrativas de un blog no lo son ni de lejos.</li>
<li><strong>«Como la ley española no está en el BOE, tengo tiempo»:</strong> El proyecto de ley española, que ya está en el Congreso, no inaugura estas obligaciones, las adapta con maquinaria propia de sanción en España. El reglamento europeo es de aplicación directa, con ley española o sin ella, así que el reloj corre igual.</li>
<li><strong>«Me pueden caer 35 millones de euros por no avisar»:</strong> Esa cifra corresponde a las prácticas prohibidas del artículo 5, cosas como la manipulación subliminal o la valoración social, no al incumplimiento del artículo 50. Lo que arriesgas aquí son multas de hasta 15 millones de euros o el 3 % de la facturación mundial, según lo que sea mayor, que tampoco es una broma, pero conviene tener la cifra correcta.</li>
<li><strong>«Tengo que revisar y etiquetar todo lo que ya he publicado»:</strong> No. La obligación se aplica a partir del 2 de agosto de 2026, el contenido que ya llevaba tiempo circulando antes de esa fecha no necesita marcado retroactivo. Lo que sí entra en juego es todo lo que generes o publiques a partir de ese día.</li>
</ul>
<h2>El caso de los resúmenes generados con IA</h2>
<p>Vamos a bajarlo a un ejemplo real, que es más útil que quedarse en la teoría. Cada vez hay más plugins, el mío incluido con <a href="https://wordpress.org/plugins/ai-share-summarize/" target="_blank" rel="ugc noopener">Share Buttons &amp; AI-powered Summaries</a>, que generan un <a href="https://ayudawp.com/resumenes-ia-integrados/" target="_blank" rel="ugc noopener">resumen automático de la entrada</a> con un proveedor de IA externo. ¿Ese resumen necesita aviso?</p>
<p>Pues bien, las directrices de la Comisión, al desarrollar el artículo 50.2, ponen a los resúmenes generados por IA en la lista de <strong>cambios sustantivos, junto a las traducciones o la eliminación de objetos</strong> de una imagen, frente a la edición estándar que sí queda exenta, como corregir ortografía o ajustar el color.</p>
<p>Esa parte concreta de la norma habla del marcado técnico que corresponde al proveedor del modelo, no directamente de tu aviso al lector, pero deja clara una cosa, que <strong>un resumen no es una tontería formal, es contenido nuevo con entidad propia</strong>.</p>
<p>La pregunta que de verdad te afecta como responsable del despliegue es si ese resumen entra en el supuesto de texto sobre un asunto de interés público y si ha pasado por esa revisión editorial de la que hablábamos antes. Y ojo, <strong>revisar el artículo del que sale el resumen no es lo mismo que revisar el resumen</strong> en sí, que suele generarse solo, en cada visita o en cada publicación, sin que nadie le eche un vistazo concreto a esa pieza de texto en particular.</p>
<p>Por suerte la salida práctica no depende de resolver ese debate. <strong>Share Buttons &amp; AI-powered Summaries ya muestra por defecto la etiqueta «Resumen generado con IA» encima de cada resumen</strong>, así que si usas el plugin sin tocar ese ajuste, este supuesto no te da ningún quebradero de cabeza.</p>
<p>El matiz es que el texto de la etiqueta es configurable, y si lo cambias por algo que no mencione la IA, o lo quitas directamente, la responsabilidad de que el aviso siga ahí es tuya, no del plugin. La herramienta te pone el camino fácil, no te lo puede recorrer por ti.</p>
<p>Esto vale igual si generas el resumen con cualquier otro plugin o a mano con tu proveedor de IA favorito.  La etiqueta de una línea, «resumen generado con inteligencia artificial» o similar, resuelve el debate entero sin necesidad de elucubrare si tu web informa o no de un asunto de interés público.</p>
<h2>Textos alternativos e imágenes generadas con IA</h2>
<p>WordPress 7 trae de serie una <a href="https://ayudawp.com/seguridad-conectores-ia-wordpress/" target="_blank" rel="ugc noopener">pantalla de conectores de IA</a> donde guardas tu clave de Anthropic, OpenAI o Gemini para que cualquier plugin compatible la use. Si la usas para generar texto alternativo de tus imágenes o para crear una ilustración con la que acompañar un artículo, ¿entras en el supuesto de aviso?</p>
<p>Con el <strong>texto alternativo la respuesta corta es que no</strong>, y aquí no hay una directriz de la Comisión que lo diga con esas palabras exactas, así que es mi lectura razonada del propósito de la norma, no una cita textual de nadie. El <code>alt</code> describe una imagen para quien usa lector de pantalla, no informa al público de ningún asunto, ni siquiera lo ve quien navega con la vista, así que se queda fuera del espíritu del artículo 50.4 igual que se quedaría fuera un pie de foto meramente descriptivo.</p>
<p>Con las <strong>imágenes ilustrativas</strong> aplica exactamente lo que vimos antes, pues si no simula un hecho, una persona o un lugar real de forma creíble, no es deepfake y no necesita aviso.</p>
<p>Y para quien se pregunte quién marca técnicamente qué cuando usa el conector, el proveedor del modelo que hayas conectado, Anthropic, OpenAI o Google, es quien responde del marcado legible por máquina del artículo 50.2. Tú, como responsable del despliegue, respondes de lo que ya hemos visto, el aviso visible cuando el contenido lo requiere. Usar el conector nativo no te añade ninguna obligación nueva que no tuvieras ya generando el mismo contenido por otra vía.</p>
<h2>Qué deberías tener listo desde ya</h2>
<p>Con todo lo anterior ya tienes el criterio. Esto es lo concreto que conviene dejar hecho:</p>
<ul>
<li>Revisa si tienes chatbot o asistente de IA en la web, y confirma que el visitante sabe que habla con una máquina.</li>
<li>Si generas imágenes con IA plantéate en cada caso si podría confundirse con algo real, no solo si «se ve muy realista».</li>
<li>Si usas resúmenes generados con IA mejor con la etiqueta visible que sin ella, cuesta una línea de HTML y te ahorra la inquietud y un posible susto.</li>
<li>No toques lo ya publicado antes del 2 de agosto de 2026 solo por esto, la obligación mira hacia delante.</li>
<li>Si tu contenido tiene peso en asuntos de interés público, documenta que lo revisas tú antes de publicar, no hace falta un proceso complicado, basta con que sea real y puedas explicarlo si alguien pregunta.</li>
</ul>
<p>Con la tabla de más arriba ya tienes el criterio completo caso por caso. Y si quieres el aviso de una línea listo para pegar en cualquier resumen o texto generado con IA, aquí lo tienes:</p>
<pre>&lt;div style="border-left: 4px solid #8a8a8a; background: #f5f5f5; padding: 10px 16px; margin: 16px 0; font-size: 0.9em; line-height: 1.5;"&gt;
  &lt;strong&gt;Aviso:&lt;/strong&gt; este resumen ha sido generado con inteligencia artificial.
&lt;/div&gt;</pre>
<p>La Unión Europea también ha publicado un <a href="https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content" target="_blank" rel="nofollow noopener">conjunto de iconos oficiales</a> pensado para este etiquetado, por si prefieres un icono en vez de texto.</p>
<h2>España y la capa nacional: AESIA</h2>
<p>Todo lo anterior aplica ya, por el reglamento europeo, tengas o no ley española, pero si estás en España tenemos espía nuevo, gracias a esos políticos que siempre están pensando en nosotros.</p>
<p>El <a href="https://digital.gob.es/comunicacion/notas-prensa/mtdfp/2026/05/el-gobierno-aprueba-el-proyecto-de-ley-que-garantizara-una-super" target="_blank" rel="nofollow noopener">Gobierno español aprobó el proyecto de ley orgánica</a> para el buen uso y la gobernanza de la inteligencia artificial el 26 de mayo de 2026 y lo envió al Congreso, donde sigue su trámite parlamentario con paso por el Senado antes de publicarse en el BOE.</p>
<p>Esa ley no inventa las obligaciones que has leído en este artículo, las aplica con maquinaria sancionadora propia y designa a la Agencia Española de Supervisión de la Inteligencia Artificial, la AESIA, como autoridad principal para vigilar y sancionar. <strong>Mientras el texto sigue su trámite, este artículo se actualiza en cuanto haya novedad publicada en el BOE</strong>, así que no hace falta que vayas comprobándolo tú.</p>
<h2>Resumen rápido</h2>
<p>Si te quedas con una sola idea de todo esto, que sea esta: <strong>la norma no castiga usar IA, castiga hacerlo pasar por algo que no es</strong>.</p>
<p>Un chatbot que se presenta como humano, una imagen que finge ser una foto real, un texto que informa de algo serio sin que nadie se haya hecho responsable de su contenido, eso es lo que persigue el reglamento. Un resumen con su etiqueta, una ilustración decorativa, un texto alternativo bien escrito, ninguno de esos tres necesita que te compliques la vida.</p>
<p>Este artículo es información general para que entiendas el criterio y actúes con cabeza, no asesoría legal sobre tu caso concreto, así que si tu situación tiene matices importantes, consulta con un profesional. Y si detectas algo que ha cambiado, ley española publicada, directrices finales de la Comisión distintas de lo que cuento aquí, dímelo en los comentarios y actualizo el artículo.</p>
<p>Si quieres profundizar en la parte legal más amplia, tengo también la guía de <a href="https://ayudawp.com/registro-consentimiento-cookies-formularios-pedidos/" target="_blank" rel="ugc noopener">registro de consentimientos</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/ai-act/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Por qué WordPress no acierta a optimizar el LCP … aún?</title>
		<link>https://ayudawp.com/image-prioritizer/</link>
					<comments>https://ayudawp.com/image-prioritizer/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 21 Jul 2026 06:28:32 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[WPO - Optimizar WordPress]]></category>
		<category><![CDATA[DietPress]]></category>
		<category><![CDATA[fetchpriority]]></category>
		<category><![CDATA[LCP]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159925</guid>

					<description><![CDATA[Existe una forma de que WordPress deje de adivinar el elemento inicial más pesado de tu página y lo sepa de verdad, a partir de datos reales de tus propios visitantes.]]></description>
										<content:encoded><![CDATA[<p>Hay un elemento en cada página, casi siempre una imagen, que <strong>pesa más que ningún otro en si tu web se siente rápida o lenta nada más entrar</strong>.</p>
<p>Me refiero a lo que Google mide como <a href="https://ayudawp.com/google-core-web-vitals-wordpress/" target="_blank" rel="noopener"><strong>LCP</strong></a> (el <strong>tiempo que tarda en aparecer el bloque más grande de tu pantalla</strong>), y cuanto antes aparezca, mejor.</p>
<p>El problema es que <strong>WordPress tiene que adivinar cuál es esa imagen</strong> sin haberte visto navegar, y esa adivinanza falla más de lo que te gustaría.</p>
<p>La buena noticia es que <strong>ya existe una forma de que WordPress deje de adivinar el elemento inicial más pesado de tu página y lo sepa de verdad</strong>, a partir de datos reales de tus propios visitantes.</p>
<p>En este artículo te cuento <strong>qué es, qué gana tu web con ello, qué pegas tiene todavía, y qué hacer</strong> si prefieres quedarte con algo más probado mientras tanto.</p>
<h2>Optimization Detective e Image Prioritizer</h2>
<p>El núcleo de WordPress lleva desde la versión 6.3 <a href="https://ayudawp.com/fetchpriority-wordpress/" target="_blank" rel="noopener">detectando de forma automática cuál es probablemente la imagen del LCP</a>, casi siempre la destacada, y le añade el atributo <code>fetchpriority="high"</code> sin que hagas nada.</p>
<p>El límite de esa detección automática es que <strong>se basa en heurísticas desde el servidor, reglas fijas que no saben cómo se ve realmente tu web</strong> en un móvil, en una tablet o con una ventana pequeña de escritorio.</p>
<p>Esas heurísticas aciertan la imagen correcta en torno a la mitad de las veces, mientras que la otra mitad, el navegador, recibe la orden de prioridad equivocada. <strong>Optimization Detective</strong> nace para resolver justo eso.</p>
<p>Es un plugin del equipo de rendimiento de WordPress que <strong>no optimiza nada por sí solo, es un framework que recoge datos reales de tus visitantes</strong> (o RUM, siglas de Real User Monitoring, monitorización de usuarios reales) sobre qué elemento se pinta primero en cada tipo de dispositivo.</p>
<p>No tiene pantalla de ajustes ni la va a tener, funciona solo, en segundo plano. El que hace algo con esos datos es <strong>Image Prioritizer</strong>, el plugin que depende de Optimization Detective para funcionar.</p>
<p>Con la información real de tus visitas, añade <code>fetchpriority="high"</code> a la imagen que de verdad es el LCP en cada punto de ruptura, ajusta la carga diferida para que no se quede vacío justo lo que sí se ve al entrar, y <strong>reduce el peso del fotograma inicial de los vídeos que hacen de LCP</strong>.</p>
<p>Anteriormente, Image Prioritizer también calculaba el atributo <code>sizes</code> de las imágenes responsive, pero ya no, esa función se quitó por un problema, y hoy ese trabajo lo hace otro plugin del mismo equipo, <a href="https://wordpress.org/plugins/auto-sizes/" target="_blank" rel="nofollow noopener">Enhanced Responsive Images</a>.</p>
<h2>¿Para cuándo estará esto en WordPress?</h2>
<p>El equipo de rendimiento suele probar la funcionalidad completa en un plugin independiente, la validan con tráfico real de decenas de miles de webs, y cuando por fin entra en el núcleo, suele hacerlo con ajustes más prudentes que los que tenía el plugin original.</p>
<p>Ya te conté ese proceso con la <a href="https://ayudawp.com/carga-especulativa-nativa/" target="_blank" rel="ugc noopener">carga especulativa nativa</a>, que también nació como plugin, se probó en más de 50.000 sitios, con una mejora media del 1,9% en LCP en los que lo llevaban activado, y aterrizó en WordPress 6.8 con el modo prefetch y la anticipación más conservadora en vez del <code>prerender</code> y la anticipación moderada que traía el plugin.</p>
<p>El cálculo del atributo <code>sizes</code> para imágenes con carga diferida siguió un camino parecido hasta la versión 6.7.</p>
<p>Dicho esto, <strong>no hay fecha para Optimization Detective ni para Image Prioritizer</strong>. Ninguno de los dos aparece nombrado de momento en planes de futuras versiones, solo Enhanced Responsive Images y View Transitions figuran como trabajo del equipo de rendimiento en marcha hacia alguna versión de WordPress de las próximas.</p>
<h2>Esa cosa es cojonuda ¿no? … pues no del todo</h2>
<p>Antes de que instales los dos plugins unos cuantos peros que conviene que conozcas:</p>
<ul>
<li><strong>Los dos siguen en beta:</strong> Optimization Detective en la 1.0.0-beta5 e Image Prioritizer en la 1.0.0-beta3, y ninguno tiene pantalla de ajustes.</li>
<li><strong>No deberías usar plugins canonical en webs en producción:</strong> Como cualquier plugin de este tipo su misión es terminar en el núcleo de WordPress y, aunque te corroa la impaciencia, no deberías usarlos como si fuesen plugins normales, nunca, ni estos ni ningún otro.</li>
<li><strong>Necesitas la API REST abierta a visitantes anónimos:</strong> Así es como se recogen los datos de cada visita. El propio plugin trae un aviso en Salud del sitio que te avisa si la tiene bloqueada, así que no te vas a quedar a ciegas. Si usas Vigilante con el modo de protección de la API REST más restrictivo, revisa que no le esté cerrando el paso a este plugin en concreto, o nunca vas a ver ninguna optimización aplicada sin saber por qué.</li>
<li><strong>No optimiza nada para ti como administrador:</strong> Hace falta que sean visitantes normales, así que no esperes ver cambios nada más activarlo, necesitas que pase tráfico real primero, para móvil y para escritorio.</li>
</ul>
<h2>¿Hago algo ya?</h2>
<p>No hay una respuesta única, depende de cuánto te guste ir por delante y de cuánto tiempo le quieras dedicar, pero sobre todo teniendo en cuenta que <strong>si pruebas este tipo de plugins debe ser únicamente como experimentació</strong>n.</p>
<p>Si no te importa que algo esté en beta y tienes tráfico suficiente para que se llenen de datos las visitas en pocos días, con todas las precauciones, instala <a href="https://wordpress.org/plugins/optimization-detective/" target="_blank" rel="nofollow noopener">Optimization Detective</a> y <a href="https://wordpress.org/plugins/image-prioritizer/" target="_blank" rel="nofollow noopener">Image Prioritizer</a>, revisa el código fuente de tu web a los pocos días y compara.</p>
<p>Si prefieres no depender de tráfico acumulado ni de tener la API REST abierta a cualquiera, y quieres algo que ya lleva tiempo funcionando sin sorpresas <strong>hay plugins que sí puedes usar ya para optimizar WordPress</strong>.</p>
<h3>¿De qué plugin estás hablando?</h3>
<p>Sabes que hay muchos plugins de optimización, pero <strong>yo solo uso uno gratuito, <a href="https://dietpress.dev/es/" target="_blank" rel="ugc noopener">DietPress</a></strong>, y este ya pone <code>fetchpriority="low"</code> a todas las imágenes menos la primera, sin mirar visitas ni dispositivos, <strong>una regla fija que sigue siendo mejor que lo que hace el núcleo por su cuenta con el resto de imágenes de la página, que es no hacer nada</strong>.</p>
<p>Pero esa regla fija y la lógica de Image Prioritizer, que decide con visitas reales por punto de ruptura, no siempre van a estar de acuerdo. Si en el móvil la imagen importante no es la primera del HTML, más habitual de lo que parece con maquetadores y avisos que se cuelan antes del contenido, tu plugin le estaría bajando la prioridad justo a la imagen a la que el otro se la quiere subir.</p>
<p>Lo tengo controlado, <strong>en cuanto Image Prioritizer deje la beta adaptaré DietPress para que no se pisen cuando se incorpore en WordPress</strong>, todavía no sé si apartándose cuando lo detecte o afinando la regla, pero se adapta, eso seguro.</p>
<p>Y si prefieres no tocar nada de esto todavía, tampoco pasa nada. Por el patrón que te contaba antes, es candidato real a acabar en el núcleo tarde o temprano, y cuando lo haga no vas a tener que instalar ni configurar nada, como pasó con la carga especulativa.</p>
<p>Elijas lo que elijas, <strong>tu web no tiene por qué seguir dependiendo de una adivinanza para saber cuál es su imagen más importante</strong>, y eso tarde o temprano juega a tu favor.</p>
<p>Si acabas probando alguno de los dos plugins, cuéntame qué tal te ha ido, aquí abajo en los comentarios tienes hueco.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/image-prioritizer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Seguridad WordPress para empresas y agencias</title>
		<link>https://ayudawp.com/seguridad-wordpress-empresas-agencias/</link>
					<comments>https://ayudawp.com/seguridad-wordpress-empresas-agencias/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 20 Jul 2026 06:28:08 +0000</pubDate>
				<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Vigilante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159941</guid>

					<description><![CDATA[WordPress mueve más del 40 % de todas las webs del mundo y cualquier empresa que lo use es un objetivo por pura probabilidad estadística, sea cual sea su tamaño.]]></description>
										<content:encoded><![CDATA[<p><strong>WordPress mueve más del 40 % de todas las webs del mundo y cualquier empresa que lo use es un objetivo por pura probabilidad</strong> estadística, sea cual sea su tamaño.</p>
<p>Usar el software más extendido del planeta significa compartir también sus vulnerabilidades conocidas con la mitad de tus competidores.</p>
<p>Y esto no es solo un problema técnico, pues <strong>una brecha que exponga datos de clientes activa obligaciones legales</strong> concretas (en España, informar a la Agencia Española de Protección de Datos en un plazo de 72 horas), además de los <strong>costes de reputación y de recuperación</strong> del propio incidente.</p>
<p>Esta guía está organizada teniendo en cuenta <strong>por donde entran los distintos posibles ataques, que son cuatro grandes puertas</strong>, y en cada una encontrarás cómo entra el ataque, qué lo cierra (con soluciones gratuitas siempre que existen, que es casi siempre) y cómo comprobar que la puerta quedó cerrada.</p>
<p>Después encontrarás tres bloques transversales de distinta afectación, como son los riesgos propios de vender con WooCommerce, lo que te exige la ley aunque nadie te ataque, y el protocolo si ya han entrado.</p>
<p>Dicho todo esto, empezamos.</p>
<h2>Puerta 1 – Las extensiones: por donde entra la inmensa mayoría de los ataques</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-159963" src="https://ayudawp.com/wp-content/uploads/2026/07/seguridad-empresas-puerta-1-extensiones.jpg" alt="" width="1200" height="670"></p>
<p>El ataque típico contra un WordPress de empresa <strong>no lo lanza una persona</strong> contra tu web, <strong>lo lanza un bot contra millones de webs a la vez</strong>. El proceso es siempre parecido:</p>
<ol>
<li>El bot rastrea internet buscando versiones concretas de plugins con vulnerabilidades publicadas.</li>
<li>Identifica la tuya por la huella que deja en el código fuente.</li>
<li>Explota el fallo (para el que suele existir exploit automatizado desde el mismo día del aviso).</li>
<li>Sube un pequeño archivo PHP a la carpeta de <code>uploads</code> que le da control remoto.</li>
<li>Crea un administrador con nombre discreto y empieza a inyectar redirecciones o spam SEO.</li>
</ol>
<p>Tú <strong>no ves nada hasta que Google marca la web como comprometida</strong> o un cliente pregunta por qué al hacer clic en tu enlace acaba en una tienda de medicamentos que no es la tuya. Entre la infección y el descubrimiento pasan normalmente semanas.</p>
<p>Los números explican por qué esta puerta es la primera, y es que de todas las vulnerabilidades nuevas de WordPress la mayoría son del tipo <a href="https://ayudawp.com/ataques-xss-wordpress/" target="_blank" rel="noopener">XSS</a>, que permite <strong>colar scripts ajenos en el navegador de tus visitantes</strong>.</p>
<p>Muy típico es el caso de los plugins abandonados, que no dejan de funcionar de golpe, siguen activos, y cada mes sin actualizarse acumulan más probabilidades de tener un fallo conocido que ya nadie va a parchear.</p>
<p>Y hay un agravante que es que WordPress.org cierra o retira plugins del repositorio con cierta regularidad por malware o vulnerabilidades sin corregir, y ese cierre no desinstala nada de tu servidor. <strong>El código sigue ahí, ejecutándose, y el aviso no te llega a ningún sitio</strong> salvo que lo busques activamente.</p>
<p>Esto mismo le pasó a un cliente mío con un plugin sencillo, una utilidad para mostrar imágenes del antes y el después, pero con una vulnerabilidad enorme, para la que <a href="https://ayudawp.com/parche-xss-twenty20/" target="_blank" rel="noopener">me tocó preparar un parche</a>, ante el abandono del plugin original.</p>
<p>Qué cierra esta puerta:</p>
<ul>
<li><strong>Una política de actualizaciones por escrito</strong>: gratis y más eficaz que cualquier herramienta, con actualizaciones automáticas para versiones menores y plugins de confianza, prueba en staging para versiones mayores y plugins críticos (pasarela de pago, formularios, membresías), y cobertura semanal fija con copia de seguridad previa para todo lo demás.</li>
<li><strong>Una auditoría periódica de todo lo instalado</strong>: quién mantiene cada plugin y tema, cuándo se actualizó por última vez, si tiene vulnerabilidades conocidas en tu versión (consúltalo gratis en <a href="https://wpscan.com/">WPScan</a> o Patchstack antes de instalar nada nuevo) y qué duplicidades funcionales puedes eliminar.</li>
<li><strong>Tolerancia cero con lo <a href="https://ayudawp.com/plugins-temas-nulled-gpl/" target="_blank" rel="noopener">nulled</a> o de procedencia desconocida</strong>, y decisión inmediata sobre cualquier extensión activa sin actualizaciones disponibles porque el desarrollador desapareció o la licencia caducó, pues eso es código congelado y sin parches, una decisión estratégica y no un detalle técnico.</li>
<li><strong>Desinstalar lo que no se usa</strong>, incluidos los temas de repuesto que se quedan «por si acaso», porque un tema desactivado sigue siendo código explotable presente en el servidor.</li>
<li><strong>Vigilancia diaria de los cierres del repositorio:</strong> Esta detección automática es, hoy por hoy, casi exclusiva de <a href="https://vigilante.works/es/" target="_blank" rel="noopener">Vigilante</a>, que consulta la API de wordpress.org cada día por cada plugin instalado, activo o no, y avisa con fecha y motivo si alguno ha sido cerrado o retirado.</li>
<li><strong>Un cortafuegos de aplicación como red de contención</strong>, activo desde el primer día aunque sea con la configuración por defecto, con esto bloqueas los patrones de explotación más comunes y la ejecución de PHP en la carpeta de <code>uploads</code>, de modo que frena el ataque incluso cuando el plugin vulnerable siga instalado.</li>
<li><strong>Ponérselo más difícil al escaneo automatizado</strong>: ocultar la versión de WordPress del código fuente, los feeds y las URL de scripts, y eliminar los <code>readme.html</code> y <code>license.txt</code> de la raíz, que la revelan a cualquiera.</li>
<li><strong>Si el tema es a medida</strong>, comprobar que usa tema hijo (un padre modificado directamente pierde los cambios en la próxima actualización) y que está claro quién paga y renueva cada licencia, además, documenta esa revisión con un informe como el que genera la <a href="https://herramientas.ayudawp.com/theme-audit/">auditoría de temas</a>, te da la referencia para la siguiente.</li>
</ul>
<p>Cómo comprobar que está cerrada:</p>
<ul>
<li>Abre el código fuente de tu portada y busca <code>generator</code> y <code>ver=</code>: si aparece tu versión exacta de WordPress, sigue visible.</li>
<li>Sube un archivo PHP de prueba a la carpeta <code>uploads</code> por el medio que uses habitualmente e intenta ejecutarlo desde el navegador, debería devolver un error, no ejecutarse.</li>
<li>Fecha de la última auditoría de extensiones y número de plugins desinstalados en ella: si la respuesta es «nunca» y «cero», ahí tienes el primer hueco.</li>
<li>Comprueba que tu escáner de integridad tiene programada una exploración automática y cuándo fue la última.</li>
</ul>
<h2>Puerta 2 – Las personas y sus credenciales</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-159964" src="https://ayudawp.com/wp-content/uploads/2026/07/seguridad-empresas-puerta-1-credenciales.jpg" alt="" width="1200" height="670"></p>
<p>La segunda puerta <strong>ni siquiera necesita una vulnerabilidad</strong> y es que WordPress regala por defecto la lista de nombres de usuario, puesto que su misma API REST responde en <code>tudominio.com/wp-json/wp/v2/users</code> a cualquiera que pregunte, y las URL del tipo <code>?author=1</code>, <code>?author=2</code> redirigen al archivo público de cada autor.</p>
<p>Con esa lista y las colecciones de contraseñas filtradas que circulan por internet, un bot solo tiene que probar combinaciones en tu formulario de acceso, y si <code>XML-RPC</code> está activo puede probar cientos por petición gracias a su método <code>system.multicall</code>.</p>
<p>La otra variante ni siquiera requiere bots. Es el típico caso de la agencia de hace dos años que conserva un acceso de administrador, la cuenta compartida entre tres personas, el ex-compañero al que nadie dio de baja. <strong>El error humano, no un ataque brillante, es la causa más habitual de una brecha</strong>.</p>
<p>Qué cierra esta puerta:</p>
<ul>
<li><strong>Identificación en dos pasos (2FA) obligatoria</strong> para todos los perfiles de editor para arriba, con aplicación de verificación (<code>TOTP</code>) o código por email, exigible por perfil desde tu plugin de seguridad.</li>
<li><strong>Mínimas capacidades con los perfiles por defecto</strong> (administrador, editor, autor, colaborador, suscriptor), creando un perfil a medida antes que subir a nadie a administrador por comodidad.</li>
<li><strong>Caducidad de contraseñas con historial</strong> que impida reutilizar las últimas, sobre todo en administradores, y límite de sesiones simultáneas por usuario si trabajas con externos que entran y salen de proyectos.</li>
<li><strong>Cierre de la enumeración y del XML-RPC</strong> desde tu plugin de seguridad <a href="https://ayudawp.com/enumeracion-usuarios/" target="_blank" rel="noopener">o con código</a>, y URL de acceso personalizada en lugar de <code>/wp-login.php</code>, que elimina la mayoría del tráfico automatizado contra el formulario.</li>
<li><strong>Un gestor de contraseñas</strong> con espacios compartidos por equipos (Bitwarden, por ejemplo, tiene versión gratuita para empezar y planes de equipo económicos), que acaba con las contraseñas en hojas de cálculo y en hilos de correo.</li>
<li><strong>Una lista de bajas</strong> para cuando alguien deja la empresa o termina un proyecto, donde reflejar quién tiene/tenía acceso a WordPress, panel del hosting, registrador del dominio, CDN, Search Console y cualquier servicio conectado. Un usuario por persona, con nombre real, o esta lista será imposible de aplicar.</li>
<li><strong>Un registro de auditoría</strong> que capture accesos, cambios de usuarios y activación de plugins, filtrable y exportable. Esto es lo que convierte «alguien tocó algo» en «este usuario hizo esto a esta hora».</li>
<li><strong>Formación básica del equipo</strong>: no reutilizar contraseñas, desconfiar de enlaces y adjuntos inesperados, saber a quién avisar ante algo raro, es gratis, y más rentable que cualquier herramienta.</li>
</ul>
<p>Cómo comprobar que está cerrada:</p>
<ul>
<li>Visita por tu cuenta <code>dominio.com/wp-json/wp/v2/users</code> y <code>dominio.com/?author=1</code>: ninguna de las dos debería revelar nombres de usuario.</li>
<li>Cuenta cuántos administradores hay y asegúrate, uno a uno, que de verdad lo necesitan.</li>
<li>Busca cuentas sin acceso en los últimos seis meses y accesos de proyectos ya cerrados.</li>
<li>Haz el simulacro de baja: si una persona concreta se fuera mañana, ¿cuántos servicios habría que tocar y tienes la lista?</li>
</ul>
<h2>Puerta 3 – El alojamiento y el servidor</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-159965" src="https://ayudawp.com/wp-content/uploads/2026/07/seguridad-empresas-puerta-1-servidor.jpg" alt="" width="1200" height="670"></p>
<p>La tercera puerta está fuera de WordPress. Aquí hablamos de que, por ejemplo, una <strong>versión de PHP al final de su vida útil</strong> deja de recibir parches de seguridad aunque todo lo demás esté al día.</p>
<p>Muy típico es también utilizar un <strong>hosting compartido sin aislamiento entre cuentas</strong>, lo que convierte el ataque al vecino en un ataque a tu web.</p>
<p>Otro caso habitual es un listado de directorios abierto, lo que permite a cualquiera pasearse por <code>/wp-content/uploads/</code> y descargar lo que encuentre, y lo mismo pasa con <strong>permisos de archivo demasiado generosos</strong>, que dejan que un proceso comprometido escriba en <code>wp-config.php</code> o <code>.htaccess</code>, los dos archivos donde una sola línea inyectada sobrevive incluso a reinstalar WordPress.</p>
<p>Y hay un problema más en esta puerta, la disponibilidad, porque una caída también es un incidente y cuesta dinero. Según los cálculos que hice para una conferencia que di en GoDigital de Valencia en 2025, <strong>un e-commerce pequeño pierde entre 50 y 200 € por minuto caído, una web corporativa entre 20 y 50 contactos comerciales por hora, y un restaurante sin sistema de reservas entre 500 y 1.500 € por noche.</strong></p>
<p>El día que tu web salga en televisión o una campaña funcione de verdad, la diferencia entre un hosting que escala y uno que se cae es facturación directa.</p>
<p>Qué cierra esta puerta:</p>
<ul>
<li><strong>Un hosting que cumpla los mínimos exigibles</strong>: HTTP/2 o HTTP/3, versiones de PHP y MySQL o MariaDB actualizadas y cambiables por ti sin tiques de soporte, configuración de seguridad específica para WordPress, aislamiento real de cuentas incluso en planes compartidos, soporte técnico especializado en WordPress, recuperación automática ante caídas y capacidad de absorber picos de tráfico. Si el tuyo no los cumple cambiar de hosting es la medida de seguridad más rentable de esta sección.</li>
<li><strong>Tres constantes en <code>wp-config.php</code></strong> (primer bloque de código más abajo): desactivan el editor de archivos, fuerzan HTTPS en el escritorio y evitan que los errores de PHP se muestren a los visitantes.</li>
<li><strong>HTTPS en todo el sitio con HSTS</strong> (segundo bloque de código de abajo), para que el navegador ni siquiera intente la conexión sin cifrar la próxima vez.</li>
<li><strong>El resto de cabeceras de seguridad</strong> (Content Security Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy), que puedes generar listas para Apache, Nginx o PHP con este <a href="https://herramientas.ayudawp.com/security-headers/">generador de cabeceras</a> gratuito.</li>
<li><strong>Permisos de archivo correctos</strong>: <code>644</code> para archivos, <code>755</code> para directorios, y <code>440</code> o <code>400</code> para <code>wp-config.php</code> si el hosting lo permite sin romper nada, además de <code>Options -Indexes</code> en el <code>.htaccess</code> para cerrar el listado de directorios.</li>
<li><strong>Un <a href="https://ayudawp.com/tag/security-txt/" target="_blank" rel="noopener"><code>security.txt</code></a></strong> en <code>/.well-known/</code> siguiendo el estándar RFC 9116, para que un investigador que encuentre un fallo sepa cómo avisarte de forma responsable en vez de publicarlo.</li>
<li><strong>Vigilancia de integridad de <code>wp-config.php</code> y <code>.htaccess</code></strong>: tu plugin de seguridad debería guardar una copia de referencia con suma de verificación y avisarte con un <code>diff</code> línea a línea si algo cambia sin que hayas sido tú.</li>
<li><strong>Copias de seguridad verificadas y fuera del servidor</strong>: restaura una de prueba en un entorno aparte antes de necesitarla en serio, porque una copia alojada en la misma máquina que protege no vale nada el día que esa máquina falle.</li>
<li><strong>Monitorización de disponibilidad externa</strong>, para enterarte tú antes que tus clientes: servicios gratuitos como UptimeRobot comprueban la web cada cinco minutos y avisan por correo en cuanto deja de responder.</li>
</ul>
<pre>// Desactivar el editor nativo de plugins y temas
define( 'DISALLOW_FILE_EDIT', true );
 
// Forzar HTTPS en wp-admin
define( 'FORCE_SSL_ADMIN', true );
 
// Nunca mostrar errores a visitantes, solo registrarlos
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_DISPLAY', false );</pre>
<pre>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
&lt;/IfModule&gt;
 
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"</pre>
<p>El reparto de responsabilidad con tu hosting conviene confirmarlo por escrito, porque la letra pequeña cambia mucho de un proveedor a otro:</p>
<table>
<thead>
<tr>
<th>Área de seguridad</th>
<th>Qué suele cubrir un buen hosting gestionado</th>
<th>Qué te corresponde a ti</th>
</tr>
</thead>
<tbody>
<tr>
<td>Parches del servidor y del sistema operativo</td>
<td>Sí, casi siempre</td>
<td>Nada, es su trabajo</td>
</tr>
<tr>
<td>Certificado SSL/TLS</td>
<td>Sí, la mayoría lo emite gratis hoy</td>
<td>Forzar HTTPS en todo el sitio y en el admin</td>
</tr>
<tr>
<td>Mitigación de DDoS a nivel de red</td>
<td>Depende mucho del hosting; mejor en los gestionados serios</td>
<td>Limitar peticiones a nivel de aplicación, cortafuegos, 2FA</td>
</tr>
<tr>
<td>Copias de seguridad</td>
<td>Suele venir incluida, pero revisa la retención real</td>
<td>Comprobar que restauran de verdad, backups propios antes de cambios grandes</td>
</tr>
<tr>
<td>Escáner de malware e integridad de archivos</td>
<td>Raro que venga de serie, salvo hostings premium</td>
<td>Escáner activo, revisión de plugins cerrados o abandonados</td>
</tr>
<tr>
<td>Actualizaciones de plugins y temas</td>
<td>Casi nunca, salvo que lo actives tú expresamente</td>
<td>Mantenerlos al día, probar en un entorno de pruebas antes</td>
</tr>
</tbody>
</table>
<p>Cómo comprobar que está cerrada:</p>
<ul>
<li>Pasa un análisis externo de cabeceras y exposición: el <a href="https://herramientas.ayudawp.com/security-check/">análisis de seguridad</a> hace más de 30 comprobaciones gratis y al instante, sin instalar nada.</li>
<li>Pregunta a tu hosting, por escrito, qué versión de PHP ejecutas y hasta cuándo recibe parches de seguridad.</li>
<li>Restaura un backup de prueba en un entorno aparte al menos una vez por semestre y anota cuánto tardaste y si todo se restauró perfecto.</li>
<li>Recuerda la última caída: ¿te avisó tu monitorización o te avisó un cliente?</li>
</ul>
<h2>Puerta 4 – El perímetro: dominio, correo y proveedores</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-159966" src="https://ayudawp.com/wp-content/uploads/2026/07/seguridad-empresas-puerta-1-perimetro.jpg" alt="" width="1200" height="670"></p>
<p>La cuenta del registrador del dominio sin identificación en dos pasos es <strong>el secuestro perfecto</strong> pues quien la controle cambia las DNS y se lleva tu web, tu correo y tu marca a otro servidor, con tu WordPress intacto y perfectamente asegurado en el hosting de siempre.</p>
<p><strong>El correo del dominio es la variante silenciosa</strong> ya que WordPress y WooCommerce envían correos transaccionales a diario, y un dominio sin DMARC puede ser suplantado por cualquiera para hacer phishing a tus propios clientes con tu remitente y tu marca, sin tocar un solo archivo tuyo.</p>
<p>Los proveedores externos (la agencia, el desarrollador puntual, el servicio conectado por API) son accesos más que habituales que rara vez están inventariados.</p>
<p>Qué cierra esta puerta:</p>
<ul>
<li><strong>2FA y bloqueo de transferencia en el registrador del dominio</strong>, hoy mismo: es la cuenta más valiosa de toda tu infraestructura y suele ser la menos protegida.</li>
<li><strong>Inventario de quién controla qué</strong>: dominio, zonas DNS, correo y cada servicio conectado, con un responsable con nombre por fila. Vale una hoja de cálculo, lo que no vale es que la respuesta sea «creo que lo llevaba el informático anterior».</li>
<li><strong>SPF, DKIM y DMARC en el dominio:</strong> el SPF declara qué servidores pueden enviar correo en tu nombre, el DKIM firma cada mensaje (lo genera tu proveedor de correo desde su panel, no es un registro que puedas copiar de una guía) y el DMARC dicta qué hacer con lo que no pase esas comprobaciones. Empieza con el DMARC en modo observación y endurece cuando los informes vengan limpios; tienes los registros de ejemplo más abajo.</li>
<li><strong>Registro de licencias con titular y fecha de renovación</strong> de cada tema y plugin de pago: una licencia que caduca sin que nadie lo sepa es código congelado, y eso te devuelve directo a la puerta 1.</li>
<li><strong>Acceso de proveedores por escrito</strong>: qué puede tocar cada uno, con qué cuenta y hasta cuándo, revocable el día que termina el proyecto. Esto además conecta con el contrato de encargo de tratamiento del bloque legal.</li>
</ul>
<p>Registros de ejemplo, adaptando dominio y proveedor de correo a los tuyos:</p>
<pre>; SPF: declara quien puede enviar correo por ti
; (el include depende de tu proveedor: este es el de Google Workspace)
tudominio.com.  TXT  "v=spf1 include:_spf.google.com ~all"
 
; DMARC, fase 1: solo observar, nada se bloquea todavia
; (recibiras informes de quien envia correo usando tu dominio)
_dmarc.tudominio.com.  TXT  "v=DMARC1; p=none; rua=mailto:dmarc@tudominio.com"
 
; DMARC, fase final tras unas semanas de informes limpios
; (p=quarantine como paso intermedio si prefieres endurecer poco a poco)
_dmarc.tudominio.com.  TXT  "v=DMARC1; p=reject; rua=mailto:dmarc@tudominio.com"</pre>
<p>Cómo comprobar que está cerrada:</p>
<ul>
<li>Consulta tu registro DMARC con cualquier comprobador gratuito (MXToolbox o dmarcian, por ejemplo): si no existe es que tu dominio es suplantable desde ayer.</li>
<li>Entra en la cuenta del registrador y verifica dos cosas: que pide segundo factor y que el bloqueo de transferencia está activo.</li>
<li>Abre el inventario de accesos y licencias: si no existe, esa es la tarea urgente de esta semana.</li>
</ul>
<h2>Tiendas online con WordPress – Riesgos específicos de WooCommerce</h2>
<p>El ataque más frecuente contra un WooCommerce pequeño no busca robarte, busca usarte. Me refiero a <a href="https://ayudawp.com/ataque-carding/" target="_blank" rel="noopener"><strong>bots que prueban tarjetas robadas en tu pasarela de pago</strong> (lo que se conoce como card testing)</a> haciendo cientos de micropedidos que a ti te generan comisiones por transacción fallida, disputas y, si se acumulan, la suspensión de la cuenta en la pasarela.</p>
<p>La segunda variante es el <strong>registro masivo de cuentas falsas</strong>, que ensucia tu base de clientes y prepara fraudes posteriores.</p>
<p>Y la tercera no es un ataque sino una acumulación. Cada pedido guarda datos personales, y una base con años de pedidos completos es superficie expuesta el día de una brecha y responsabilidad directa ante el RGPD.</p>
<p>Qué lo cierra, todo gratis:</p>
<ul>
<li><strong>Verificación antibots en el pago y el registro</strong>: Cloudflare Turnstile es gratuito y menos molesto que un captcha clásico, y la mayoría de plugins de formularios y de seguridad lo integran.</li>
<li><strong>Límite de intentos de pago por IP y por sesión</strong>, desde el cortafuegos de tu plugin de seguridad o desde la propia pasarela, que suele incluir reglas antifraude configurables sin coste.</li>
<li><strong>Revisión semanal de patrones de fraude</strong>: rachas de pedidos fallidos de importe mínimo, muchas cuentas nuevas sin compra asociada, picos de registro a horas extrañas.</li>
<li><strong>Retención de datos con caducidad</strong>: WooCommerce trae herramientas de limpieza y anonimizado en «Ajustes → Cuentas y privacidad». Configúralas y deja de acumular pedidos identificables de hace cinco años que ya no necesitas.</li>
</ul>
<p>Cómo comprobar que está cerrada:</p>
<ul>
<li>Consulta en el panel de tu pasarela la proporción de transacciones rechazadas del último mes: si supera con claridad a la de meses anteriores, ya te están usando.</li>
<li>Cuenta las cuentas de cliente creadas en los últimos 30 días sin ningún pedido asociado.</li>
<li>Abre un pedido de hace tres años y mira qué datos personales sigue guardando.</li>
</ul>
<h2>Obligaciones legales y de privacidad siempre aplicables</h2>
<p>Si tu WordPress recoge datos personales de clientes, usuarios registrados o simples visitantes que rellenan un formulario, <strong>estás sujeto al RGPD y a la Ley Orgánica de Protección de Datos, con independencia del tamaño de la empresa</strong>.</p>
<p>El RGPD exige aplicar medidas de seguridad adecuadas al riesgo, así que una brecha de seguridad es casi siempre también una brecha de protección de datos, con plazos y sanciones concretos.</p>
<p><strong>La notificación a la AEPD debe hacerse en un máximo de 72 horas</strong>, con multas de hasta 10 millones de euros o el 2 % de la facturación para las infracciones graves (entre ellas, no notificar a tiempo) y de hasta 20 millones o el 4 % para las más graves.</p>
<p>Las sanciones a autónomos y pymes suelen moverse en varios miles de euros, lejos de los titulares millonarios pero suficientes para hacerte un agujero importante.</p>
<p>Qué hacer:</p>
<ul>
<li><strong>Documenta cualquier incidente de seguridad</strong>, aunque decidas no notificarlo: el RGPD exige registrar internamente el análisis que llevó a esa decisión, precisamente para poder demostrarlo si la AEPD pregunta.</li>
<li><strong>Deja por escrito, en un contrato de encargo de tratamiento</strong>, quién es el responsable y quién el encargado cuando trabajas con una agencia o un servicio externo.</li>
<li><strong>Aplica minimización de datos</strong>: no guardes en formularios ni en la base de datos más datos personales de los estrictamente necesarios, porque cada campo de más es superficie expuesta de más el día que algo falle.</li>
<li><strong>Revisa avisos de cookies y política de privacidad con regularidad</strong>: están entre los motivos más frecuentes de sanción a pequeños negocios, haya habido o no una brecha técnica.</li>
<li><strong>Interioriza el plazo de las 72 horas</strong> antes de que ocurra un incidente, no durante: es la diferencia entre reaccionar con un protocolo decidido o improvisar bajo presión legal además de técnica.</li>
</ul>
<p>Nada de esto sustituye el asesoramiento de un abogado especializado si la empresa maneja datos sensibles o de gran volumen.</p>
<h2>Si ya te han entrado – Protocolo de las primeras horas</h2>
<p>Aun con las cuatro puertas cerradas, un incidente sigue siendo posible, y <strong>cómo se reaccione en las primeras horas determina si se queda en un susto contenido o se convierte en una crisis larga</strong>.</p>
<p>Las señales de que algo va mal serían estas:</p>
<ul>
<li>Contenido, páginas o redirecciones que nadie de tu equipo ha creado.</li>
<li>Picos de tráfico extraños, sobre todo dirigidos al login o al área de administración.</li>
<li>Usuarios, plugins o temas nuevos que no reconoces.</li>
<li>Entradas de registro anómalas: intentos de acceso repetidos, direcciones IP desconocidas, archivos modificados sin explicación.</li>
<li>Avisos del navegador, de Google Search Console o de tu propio hosting marcando el sitio como inseguro o con malware.</li>
</ul>
<p>Si aparece cualquiera de esas señales, el orden es importante:</p>
<ol>
<li><strong>Aísla el sitio:</strong> Activa el modo mantenimiento o restringe el acceso público mientras investigas, y si tu plugin de seguridad incluye un modo de emergencia con desafío para visitantes, es el momento de activarlo. El objetivo es frenar el daño sin perder lo que necesitarás analizar después.</li>
<li><strong>Comunica con transparencia</strong>: en paralelo a la parte técnica, a quien pueda verse afectado. Tener el mensaje redactado de antemano evita improvisar bajo presión; en <a href="https://ayudawp.com/presentaciones/godigital/">esta recopilación de recursos gratuitos</a> tienes plantillas de comunicación de crisis, una lista de comprobaciones de acción inmediata y la calculadora de coste de caída con la que salen las cifras de la puerta 3 que te contaba antes.</li>
<li><strong>Conserva una copia del estado comprometido</strong> antes de tocar nada, útil tanto para el análisis técnico como para una eventual denuncia o parte al seguro.</li>
<li><strong>Restaura desde la copia de seguridad limpia más reciente</strong>, verificada y anterior al momento de la brecha.</li>
<li><strong>Cambia todas las credenciales</strong>: contraseñas de todos los usuarios, no solo del administrador, además de las claves de la base de datos, las de API de servicios conectados y las de acceso al hosting y al registrador.</li>
<li><strong>Ejecuta un escaneo completo de malware e integridad de archivos</strong> para confirmar que no queda ningún resto: puertas traseras, archivos añadidos o código inyectado que la restauración no haya eliminado.</li>
<li><strong>Identifica y corrige la causa raíz</strong> (el plugin desactualizado, la contraseña débil, el permiso mal configurado) antes de volver a publicar, o el ataque se repetirá en cuanto el sitio vuelva a estar visible.</li>
<li><strong>Evalúa la obligación de notificar</strong> a la AEPD y a los afectados si hay datos personales comprometidos, dentro del plazo de 72 horas.</li>
</ol>
<p>Si la gestión del incidente supera la capacidad del equipo, o si el sitio maneja datos sensibles o pagos, merece la pena contar con <a href="https://servicios.ayudawp.com/">apoyo externo especializado en recuperación de webs hackeadas</a>, sea el mío, el de Sucuri como referencia internacional de pago o el equipo de seguridad de tu propio hosting si lo tiene, porque el tiempo que se ahorra evitando errores en caliente suele compensar el coste del servicio.</p>
<h2>Con qué aplicarlo – Plugins y servicios recomendados</h2>
<p>A lo largo de la guía he escrito varias veces «tu plugin de seguridad» sin concretar cuál, y toca hacerlo. Las opciones serias del mercado gratuito son Vigilante, Wordfence, Kadence Security y SG Security, que comparé función a función en <a href="https://ayudawp.com/plugins-seguridad-gratis/">este análisis de plugins de seguridad</a>.</p>
<p>Vigilante es mío y lo uso en mis webs y en las de mis clientes, así que ya conoces el sesgo y puedes descontarlo, aunque cualquiera de los otros cumple razonablemente si se configura bien y se revisa a conciencia.</p>
<p>Además, te recomiendo llevar un registro de todo consentimiento que se haga en tu web, y como para esta necesidad no había nada suficientemente completo creé estos plugins, que como todos están disponibles gratis en WordPress.org o tu instalador de plugins:</p>
<ul>
<li><a href="https://es.wordpress.org/plugins/terms-conditions-consent-log/" target="_blank" rel="noopener">Registro de consentimientos de términos y condiciones</a>: para llevar un registro legal de todos los consentimientos que pides en tu web, totalmente integrado con los ajustes de privacidad de WordPress.</li>
<li><a href="https://es.wordpress.org/plugins/eu-withdrawal-compliance/" target="_blank" rel="noopener">Cumplimiento del derecho de desistimiento de la UE</a>: todo lo que necesitas, con tienda o sin ella, para registrar y cumplir con el derecho a desistimiento.</li>
</ul>
<p>La otra decisión es quién aplica todo esto, si alguien de dentro o un servicio externo. Si decides delegarlo, sea en una agencia de confianza, en el plan de cuidado de algunos hostings gestionados o en un <a href="https://mantenimiento.ayudawp.com/">servicio de mantenimiento especializado</a> como el que ofrezco yo mismo, exige que cubra como mínimo:</p>
<ul>
<li>La política de actualizaciones de la puerta 1, con prueba en staging y copia previa.</li>
<li>Copias de seguridad verificadas, con restauración de prueba periódica y almacenadas fuera del servidor.</li>
<li>Monitorización de disponibilidad e integridad con avisos, no solo un informe mensual.</li>
<li>Revisión periódica de accesos, usuarios y extensiones instaladas.</li>
<li>Protocolo de incidentes por escrito, con tiempos de respuesta comprometidos.</li>
</ul>
<p>Con esa lista delante puedes evaluar cualquier presupuesto, incluido el mío. Un servicio que no restaura copias de prueba ni revisa accesos no está manteniendo tu web por mucho que actualice plugins.</p>
<h2>Plan de arranque – Por dónde empezar</h2>
<p>Si no tienes ninguna pieza de esta guía montada todavía, no intentes cerrarlo todo el mismo día. Este orden da más protección por minuto invertido:</p>
<ol>
<li>Activa <strong>2FA</strong> en WordPress para administradores y editores, y en la cuenta del registrador del dominio.</li>
<li><strong>Fuerza contraseñas</strong> largas con caducidad, <strong>elimina usuarios</strong> del tipo admin o test, y pon en marcha el gestor de contraseñas de equipo.</li>
<li>Cierra la <strong>enumeración de usuarios</strong>, cambia la <strong>URL de acceso</strong> y <strong>desactiva XML-RPC</strong> si no lo usas.</li>
<li>Activa <strong>cortafuegos y escáner de integridad</strong>, aunque sea con la configuración por defecto del primer día.</li>
<li>Audita plugins y temas, desinstala lo que sobre y deja por escrito la política de actualizaciones.</li>
<li><strong>Fuerza HTTPS</strong> en todo el sitio, revisa <strong>permisos de archivo</strong> y publica un <code>security.txt</code>.</li>
<li>Restaura un backup de prueba y saca las copias del servidor.</li>
<li>Publica <strong>DMARC</strong> en modo observación y comprueba tu <strong>SPF</strong>.</li>
<li>Verifica que tu <strong>hosting</strong> cumple los mínimos de la puerta 3 y activa la monitorización externa.</li>
<li>Documenta el <strong>protocolo de brechas</strong> (con las 72 horas de la AEPD dentro), prepara la plantilla de comunicación y forma al equipo en lo básico.</li>
</ol>
<p>Y una advertencia final, nada de esta lista es tarea para realizar una sola vez. Agenda las revisiones (trimestral para accesos y extensiones, semestral para restaurar un backup de prueba) y trata la seguridad como lo que es, mantenimiento continuo y no un proyecto con fecha de fin.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/seguridad-wordpress-empresas-agencias/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Debo bloquear a los bots de IA que rastrean WordPress? Cómo se hace y qué afecta al SEO, AEO y a la visibilidad en IAs</title>
		<link>https://ayudawp.com/bloquear-bots-ia/</link>
					<comments>https://ayudawp.com/bloquear-bots-ia/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 06:28:07 +0000</pubDate>
				<category><![CDATA[IA + WordPress]]></category>
		<category><![CDATA[SEO / AEO / GEO / AIO]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[VigIA]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159840</guid>

					<description><![CDATA[La pregunta que más me hacéis los que tenéis VigIA instalado no es «¿cómo bloqueo a las IA?», es la de fondo: «¿me conviene bloquearlas o no?»]]></description>
										<content:encoded><![CDATA[<p>La pregunta que más me hacéis los que tenéis <a href="https://es.wordpress.org/plugins/vigia/">VigIA</a> instalado no es «<strong>¿cómo bloqueo a las IA?</strong>», es la de fondo: <strong>«¿me conviene bloquearlas o no?»</strong>.</p>
<p>O sea, que <strong>si le cierro el paso a los rastreadores de inteligencia artificial</strong> que me entran en la web,<strong> ¿me estoy protegiendo o  pegando un tiro en el pie con el SEO y con mi visibilidad en las propias IA?</strong></p>
<p>Es una pregunta de las buenas, y casi todo el mundo la responde mal por dos motivos.</p>
<p>El primero es porque <strong>confunde declarar con bloquear</strong>, que no es lo mismo, una cosa es pedirle al bot que no lo haga y otra impedírselo de verdad, y luego está el hecho de que se decide a la brava, sin pararse a pensar qué le cuesta eso al posicionamiento.</p>
<p>Vamos a ponerlo en orden, con datos, y en mi opinión (y experiencia) son cuatro pasos:</p>
<ol>
<li><strong>Analizar</strong> qué puedes hacer y cómo se aplica cada cosa</li>
<li><strong>Saber</strong> (realmente) a qué hacen caso las IA y a qué no.</li>
<li>Lo más importante, <strong>razonar</strong> si a ti te conviene para el SEO y en qué casos.</li>
<li>Y al final, con toda la información en la mano, <strong>decidir</strong> qué haces con tu web.</li>
</ol>
<p>Vamos a verlo con calma.</p>
<h2>Ah ¿pero se puede bloquear a las IAs?</h2>
<p>Antes de decidir conviene saber qué tienes disponible, porque es más de lo que crees y no todo hace lo mismo. Y hay una línea que lo separa todo, porque <strong>unas acciones declaran tu voluntad (solo surten efecto si el bot decide respetarlas) y otras bloquean de verdad (impiden el acceso, lo respete o no)</strong>.</p>
<p>Con esa idea clara esto es lo que hay.</p>
<h3>Señales declarativas (piden, no obligan)</h3>
<p>¿En serio hace falta que recuerde esto? Ah ¿que sí?, pues nada, uy perdón …</p>
<ul>
<li><strong>El <code>Disallow</code> del <code>robots.txt</code>:</strong> Le dices a un bot, por su nombre, que no rastree tu web o ciertas partes. Aquí dentro entra también el <code>Google-Extended</code>, que no es más que un <code>Disallow</code> para el token con el que Google controla el entrenamiento de Gemini.</li>
<li><strong>El <code>noai</code> y el <code>noimageai</code>:</strong> Dos etiquetas en la cabecera de tu web que declaran «no me uses para entrenar, ni el texto ni las imágenes».</li>
<li><strong>Las Content Signals:</strong> Una técnica distinta y más fina, que va en el <code>robots.txt</code> y que en vez de bloquear a un bot separa <em>para qué</em> autorizas tu contenido y para qué no, y que además puede llevar respaldo legal. La vemos aparte, que tiene lo suyo.</li>
</ul>
<h3>Bloqueo real y efectivo (impide de verdad)</h3>
<p>Aquí quería llegar yo…</p>
<ul>
<li><strong>El 403.</strong> Le devuelves al bot un «prohibido» desde PHP, desde el <code>.htaccess</code> o desde un firewall, y no ve absolutamente nada. Esto no pide, esto impide.</li>
</ul>
<h3>Espera que hay más</h3>
<p>Y dos caminos más que no son ni bloquear ni dejar pasar, y que mucha gente ni se plantea:</p>
<ul>
<li><strong>Cobrar por el acceso</strong>, con la cabecera <code>402</code> y el protocolo <code>x402</code>.</li>
<li><strong>Adelantarte</strong>, asegurándote de que, cuando te compartan con una IA, tu web vaya siempre como fuente.</li>
</ul>
<p>¿Le damos ya?, que esto era solo la lista, la chicha de cada cosa la explico ahora.</p>
<h2>Cómo se bloquea a las IAs</h2>
<p>A las manos en la masa. El «cómo» de cada cosa, con código si te va lo artesano y con plugin si prefieres no tocar nada. Y sí, varios plugins son míos, porque los hice justo para esto, así que perdona el autobombo, pero es que vienen al pelo.</p>
<h3>El <code>Disallow</code> en el <code>robots.txt</code> (con el <code>Google-Extended</code> dentro)</h3>
<p>A mano, en tu <code>robots.txt</code>:</p>
<pre>User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Google-Extended
Disallow: /</pre>
<p>Fíjate en que el <code>Google-Extended</code> es un <code>Disallow</code> más, solo que especial, porque <strong>bloquearlo evita que Google te use para entrenar Gemini sin sacarte de las búsquedas</strong>, sigues apareciendo igual.</p>
<p>Lo anterior, por supuesto, es solo un ejemplo, <a href="https://ayudawp.com/bloquear-bots-inteligencia-artificial/" target="_blank" rel="noopener">aquí tienes una lista bastante más completa de bots de IA a los que hacer <code>Disallow</code></a> (o no)</p>
<p>Si no te quieres pelear con el fichero, tanto mi plugin <a href="https://es.wordpress.org/plugins/native-aeo-pack/">Visibility</a> como <a href="https://es.wordpress.org/plugins/vigia/">VigIA</a> te añaden el <code>Disallow</code> a los principales bots de IA <strong>con un par de clics</strong>.</p>
<h3>Las metas <code>noai</code> y el <code>noimageai</code></h3>
<p>En la cabecera de tu web, así:</p>
<pre>&lt;meta name="robots" content="noai, noimageai"&gt;</pre>
<p><strong>Es una declaración de intenciones contra el entrenamiento de las IAs</strong>, nacida en DeviantArt en 2022, que no es un estándar oficial de nada, así que <strong>vale para el bot que quiera respetarla y para nada frente al que no</strong>.</p>
<p>El plugin <a href="https://es.wordpress.org/plugins/ai-content-signals/">AI Content Signals</a> las añade (si quieres) sin tocar código ni complicarte.</p>
<h3>Las Content Signals (y su respaldo legal)</h3>
<p>Las <code>Content Signals</code> también van en el <code>robots.txt</code>, pero en vez de decirle a un bot que no entre, declaran <strong>para qué usos autorizas tu contenido y para cuáles no</strong>, separando tres cosas distintas:</p>
<ul>
<li><code>search</code>: construir un índice de búsqueda y mostrar resultados (enlaces y extractos cortos), sin incluir los resúmenes generados por IA.</li>
<li><code>ai-input</code>: meter tu contenido en modelos de IA en tiempo real, lo que se llama RAG o <em>grounding</em>, las respuestas de búsqueda con IA.</li>
<li><code>ai-train</code>: entrenar o afinar los modelos.</li>
</ul>
<p>Un ejemplo de «buscar sí, entrenar no» quedaría así:</p>
<pre>User-agent: *
Content-Signal: search=yes, ai-train=no</pre>
<p>¿Y dónde está la gracia de verdad? Pues en que <strong>esto no es solo una petición, es una reserva expresa de derechos con base legal</strong>.</p>
<p>El plugin <a href="https://es.wordpress.org/plugins/ai-content-signals/">AI Content Signals</a> que te comenté en el apartado anterior añade además al <code>robots.txt</code> una declaración que ampara esas señales en el artículo 4 de la Directiva europea 2019/790 de derechos de autor, la que <strong>permite a los autores reservarse su contenido frente a la minería de textos y datos</strong>, que es, ni más ni menos, lo que hace el entrenamiento de las IA.</p>
<p>O sea, que ya <strong>no solo le pides al bot que se porte, le recuerdas que hay una ley europea detrás que protege tu contenido</strong>. Te lo conté a fondo en mi artículo sobre las <a href="https://ayudawp.com/content-signals/">Content Signals</a>, por si quieres seguir informándote de esto.</p>
<h3>El bloqueo con 403 por <code>.htaccess</code> o por PHP</h3>
<p>Cuando la declaración no basta toca el <strong>bloqueo de verdad</strong>, cortando por <code>User-agent</code> desde <code>.htaccess</code>:</p>
<pre>RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (Bytespider|PerplexityBot|CCBot) [NC]
RewriteRule .* - [F,L]</pre>
<p>O desde PHP, en tu propio plugin o como suelas añadir códigos a tu web:</p>
<pre>function ayudawp_bloquear_bots_ia() {
    $ua = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '';
    if ( $ua &amp;&amp; preg_match( '#Bytespider|PerplexityBot|CCBot#i', $ua ) ) {
        status_header( 403 );
        exit;
    }
}
add_action( 'init', 'ayudawp_bloquear_bots_ia' );</pre>
<p>Y aquí, de nuevo, <strong>VigIA te lo da hecho</strong>, porque <strong>bloquea de verdad por PHP a los bots que tú elijas, por IP o por <code>User-agent</code></strong>.</p>
<p>Lo mejor de todo es que te da todas las capas, así que puedes probar con el <code>Disallow</code>, y <strong>cuando compruebes que no le hacen ni caso, además de aprender en carne propia, con un clic puedes bloquearlos</strong>, y también ahí comprobar que eso sí funciona (garantizado).</p>
<p>Para lo más bruto y lejos de tu web de todo, un cortafuegos (un WAF, como el de Cloudflare), que es el único que frena hasta a los que maquillan el <code>User-agent</code> o cambian dinámicamente de IP.</p>
<h2>Y en vez de bloquear a las IA ¿puedo cobrarles o alguna otra cosa?</h2>
<p>Pues sí ,es posible, y quizás son las que más interesante de cara al futuro.</p>
<h3>Cobrar por el acceso: 402 y x402</h3>
<p>Existe una cabecera HTTP, la <code>402 Payment Required</code>, que llevaba décadas casi de adorno y que ahora empieza a cobrar sentido, pues en vez de decirle a la IA que no, le dices «<strong>sírvete, pero pagando</strong>».</p>
<p>Sobre esa idea se está montando el protocolo <code>x402</code>, para <strong>que los bots paguen por rastrearte de forma automática</strong>, y Cloudflare ya está levantando su mercado de pago por rastreo.</p>
<p>No es ciencia ficción, te lo he contado en detalle en mis artículos sobre la <a href="https://ayudawp.com/402-payment-required/">cabecera 402</a> y sobre <a href="https://ayudawp.com/x402/">x402</a>, porque es, hoy o mañana, otra opción real para el dueño de <strong>una web que no quiere ni regalar su contenido ni renunciar del todo a las IA</strong>.</p>
<h3>Adelantarte a veces es inevitable, ya puestos que te lleven siempre de fuente</h3>
<p>Esta sería la forma más proactiva de todas, porque en vez de solo defenderte juegas al ataque. La gente va a compartir tu contenido con las IA quieras o no, así que <strong>al menos que lo haga citando tu web como fuente</strong>.</p>
<p>Eso es justo lo que hace el plugin <a href="https://es.wordpress.org/plugins/ai-share-summarize/">AI Share &amp; Summarize</a>, que añade <strong>botones para resumir y compartir tu contenido en ChatGPT, Claude, Perplexity y demás IAs</strong>, y cada vez que un lector los usa, el mensaje que se manda a <strong>la IA lleva tu URL como origen</strong>.</p>
<p>También va un paso más allá y te permite <strong>usar la IA para que los usuarios no abandonen tu web para usar la IA ¿flipas verdad? </strong></p>
<p>Básicamente <a href="https://ayudawp.com/resumenes-ia-integrados/" target="_blank" rel="noopener">puedes ofrecer resúmenes de tu contenido</a> para, a modo de extracto, generado con tu IA favorita, así <strong>les animas a seguir leyendo, sin que dejen de sentir ese calorcito especial que da la IA</strong>.</p>
<p>De paso te da <a href="https://ayudawp.com/ai-share-summarize-analitica-clics/">analítica de esos clics</a>, que no viene nada mal, lo tienes explicado en mi artículo sobre los <a href="https://ayudawp.com/resumenes-ia-integrados/">resúmenes con IA integrados</a>.</p>
<h2>¿A qué hacen caso las IA y a qué no?</h2>
<p>Por resumir, recuerda que <strong>las señales (el <code>Disallow</code>, el <code>noai</code>, las Content Signals) declaran, y solo surten efecto si el bot decide respetarlas, el 403 bloquea de verdad, lo respete o no</strong>.</p>
<p>Los hay que hacen caso, que conste. Sin ir más lejos, esta semana le pedí a mi IA de cabecera (sí, <a href="https://claude.ai/referral/Y0TXzOGBpQ" target="_blank" rel="nofollow noopener">es Claude Code</a>) que me leyera un artículo de <em>ZDNet</em> para recopilar documentarme para los vídeos que hago en YouTube y <strong>me dijo que no podía, que ese dominio estaba vetado en su herramienta ¿mande? </strong></p>
<p>Pues resulta que quien opera estas herramientas mantiene una <strong>lista de webs que no rastrea, casi siempre por motivos legales</strong>, para respetar a editores que han restringido el acceso de las IA o que están directamente en pleitos con ellas.</p>
<p>Y casualmente ZDNet es de Ziff Davis, que <a href="https://www.eweek.com/news/ziff-davis-sues-openai/" target="_blank" rel="nofollow noopener">demandó a OpenAI en abril de 2025</a> justo por usar su contenido para entrenar y para alimentar respuestas, así que encaja como un guante.</p>
<p>No tengo acceso a la lista ni al motivo exacto de cada web, pero la idea es esa, y conviene saberla, que <strong>a veces la IA no te lee porque legalmente no puede</strong>.</p>
<p>El bot más activo de ChatGPT (<code>ChatGPT-User</code>) también se porta razonablemente bien, lee tu <code>robots.txt</code> y para si le dices que no.</p>
<p>El problema son todos los demás.</p>
<p>En agosto de 2025 <a href="https://blog.cloudflare.com/perplexity-is-using-stealth-undeclared-crawlers-to-evade-website-no-crawl-directives/">Cloudflare pilló a Perplexity</a> saltándose las señales a base de cambiar de identidad, rotar direcciones IP y disfrazarse de un navegador normal para colarse en webs que le habían dicho que no. Y yo que tenía en un altar a Perplexity, ¡qué decepción!</p>
<p>Y el <code>Bytespider</code> de ByteDance ignora el <code>robots.txt</code> cuando le da la gana, vamos, siempre. Resumiendo, que <strong>fiarte solo de las señales es fiarte de la buena voluntad de cada bot, uno por uno</strong>, y ya ves que no todos la tienen.</p>
<p>¿Y cómo sabes tú en cuál de los dos grupos está cada bicho que te visita? Aquí es donde VigIA tiene algo que decir, porque trae una herramienta hecha justo para esto: <strong>comprueba si los bots respetan de verdad el <code>Disallow</code> que les has puesto</strong>.</p>
<p>Si pillas a una IA pasando de ti, con el mismo VigIA le aplicas el bloqueo por PHP. Declarar, comprobar y, solo si hace falta, bloquear, todo en el mismo sitio y sin adivinar, con datos reales, que de esto falta mucho <strong>en todo este tema de las IAs, hay mucho iluminado pero los negocios viven/vivimos de realidades</strong> ¿o no?.</p>
<h2>¿Y a ti te conviene bloquear? el SEO y AEO</h2>
<p>Vale, ya sabes qué puedes hacer y a qué hacen caso. Ahora lo que de verdad nos quita el sueño, que es de donde viene la duda de si <strong>conviene bloquear a las IA para el SEO, o nos estamos cerrando una puerta que no deberíamos cerrar.</strong></p>
<p>La pregunta buena no es ¿bloqueo las IA, sí o no?, es más fina, sería algo más como <strong>¿quieres seguir saliendo en los buscadores y en las respuestas de las IA, pero a la vez impedir que usen tu contenido para entrenar sus modelos?</strong></p>
<p>Parece rebuscado, algunos pensarán que imposible, pero no, porque eso, hoy, se puede separar, y ahí está casi toda la chicha, donde podemos poner un poco de orden y control en todo este mejunje.</p>
<p>La clave para entenderlo es que <strong>el AEO y el GEO, eso de posicionarte en las respuestas de la IA, siguen siendo SEO</strong>. No lo digo yo, lo dice <a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide">la propia guía de optimización para IA de Google</a>, pues las AI Overviews y el AI Mode se apoyan en su mismo sistema de posicionamiento y calidad de siempre.</p>
<p>O sea, que <strong>las mismas señales que te hacen posicionar son las que hacen que te citen en las respuestas con IA</strong>. Y ahora ata cabos, que si le impides el paso a los bots que recuperan tu contenido para buscar y citar, <strong>dejas de salir en esas respuestas, y el hueco lo ocupa tu competencia</strong>.</p>
<p>Y esto no es una teoría mía, ya hay datos. Alrededor del 80 % de los grandes medios de noticias ya bloquean al menos un bot de entrenamiento, y un 70 % bloquea también los bots que recuperan contenido para citar en las IA.</p>
<p>¿El resultado? Pues varios estudios apuntan a que esos mismos medios <strong>se están quedando fuera de las respuestas de la IA y perdiendo visibilidad</strong> justo por bloquear a la brava. Se protegen de una cosa y se disparan en el pie con la otra, así que <strong>la cosa está en saber qué y cuándo bloquear</strong>.</p>
<h3>Cuándo bloquear SÍ tiene sentido</h3>
<p>Que quede claro que no todo es dejar pasar. Bloquear compensa, y mucho, cuando <strong>proteger tu contenido pesa más que la visibilidad</strong>. Ejemplos de esto:</p>
<ul>
<li><strong>Contenido propietario o sensible</strong>, eso que te diferencia de verdad de la competencia.</li>
<li><strong>Contenido de pago</strong>, para miembros, cursos o zonas privadas.</li>
<li><strong>Datos únicos que son tu negocio</strong>, como los precios o las fichas de una tienda que no quieres que acaben en el buscador de otro.</li>
<li><strong>Sitios con obligaciones de cumplimiento</strong> estrictas.</li>
<li>Y el caso de los <strong>editores que, sencillamente, no quieren regalar su trabajo para entrenar modelos</strong> y prefieren pelear por que les paguen, ahí es donde entra lo del 402 y el x402 de antes.</li>
</ul>
<h3>Cuándo bloquear sería un grave error</h3>
<p>Y al revés, si <strong>tu web vive de que te encuentren y te citen</strong>, impedir el paso a los bots de búsqueda de IA es de las peores ideas que puedes tener.</p>
<p>Hablo de <strong>blogs, webs de empresa, guías, contenido informativo, marca personal</strong>, todo eso que se alimenta de visibilidad y autoridad.</p>
<p>Ahí <strong>cada cita en una IA es un ladrillo más de tu reputación</strong>, y cerrarles el paso es quedarte fuera del escaparate donde ahora busca la gente. Y para que te citen bien, <strong>el contenido tiene que merecer la cita, que es el <a href="https://ayudawp.com/eeat-wordpress/">E-E-A-T</a> de toda la vida</strong>.</p>
<p>Hay un motivo aparte, eso sí, que vale para cualquiera, y me refiero al <strong>coste de rastreo</strong>.</p>
<p>Estos bots rastrean a lo bestia, y según datos de <a href="https://www.cloudflare.com/learning/ai/how-to-block-ai-crawlers/">Cloudflare</a> hay rastreadores de IA que piden decenas de miles de páginas de tu web por cada mísera visita que te devuelven.</p>
<p>Eso es factura de servidor, así que si uno te está reventando el hosting tienes todo el derecho a pararlo aunque el SEO te diga otra cosa.</p>
<p>¿Y surte efecto bloquear? Pues depende de a quién.</p>
<p>Los bots decentes que respetan las señales pararán en cuanto se lo pidas, los que ignoran el <code>robots.txt</code> necesitan el 403. Y a los que se disfrazan, como vimos con Perplexity, ni el bloqueo por <em>user-agent</em> los para del todo, ahí solo un firewall en condiciones les corta el acceso de verdad.</p>
<p><strong>El método tiene que estar adaptado al bot</strong>, no hay una bala de plata.</p>
<h2>La decisión, con todo en la mano</h2>
<p>Con todo esto ya puedes decidir sin agobios, y el orden sensato es este, justo al revés de lo que hace casi todo el mundo:</p>
<ol>
<li><strong>Primero mide:</strong> Con VigIA (o con los <em>logs</em> de tu servidor), mira quién te rastrea, si respeta tus señales y cuánto te cuesta. Sin este paso vas a ciegas.</li>
<li><strong>Clasifica según el bot y según tu contenido:</strong> A los de búsqueda y cita, déjalos pasar si vives de la visibilidad. A los de entrenamiento, ponles la señal. A los que te sangran el servidor o pasan de ti, bloqueo.</li>
<li><strong>Aplica el nivel justo:</strong> Declaración para el que la respeta, bloqueo para el que no. Y valora si, en vez de bloquear, te compensa cobrar o adelantarte con la atribución.</li>
<li><strong>Revisa tu estrategia a menudo:</strong> Que esto cambia a toda velocidad, y el bot que hoy no te aporta nada, mañana puede ser tu principal fuente de visitas.</li>
</ol>
<h2>«Bueno, vale, ¿pero qué hago?»</h2>
<p>Te veo venir, porque es justo donde te quedas después de tragarte todo esto: «vale, Fernando, ya sé cómo decirle a la IA que no me lea, de varias maneras, y sé qué funciona y qué no, pero yo, con mi web, ¿qué hago?».</p>
<p>Pues para ayudarte a poner orden en la decisión, te lo dejo en una tabla, y luego mi consejo.</p>
<table>
<thead>
<tr>
<th>Qué puedes hacer</th>
<th>En qué afecta</th>
<th>Recomendación</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Disallow</code> a bots de <code>training</code> (Visibility, VigIA)</td>
<td>Declarativo. Los que lo respetan dejan de entrenarte, no toca tu SEO</td>
<td>Recomendado. Cuesta cero y no pierdes nada</td>
</tr>
<tr>
<td><code>Disallow</code> a bots de <code>search</code> o de <code>assistant</code> de IA (VigIA, Visibility)</td>
<td>Declarativo. Dejas de salir citado en las respuestas de las IA</td>
<td>Solo si de verdad no quieres visibilidad en IA. En general no deberías bloquearlos</td>
</tr>
<tr>
<td><code>noai</code> y <code>noimageai</code> (AI Content Signals)</td>
<td>Declarativo. Pides no ser usado para entrenar; voluntario</td>
<td>Recomendado para dejar tu postura clara, sin código</td>
</tr>
<tr>
<td>Content Signals + reserva legal UE (AI Content Signals)</td>
<td>Declarativo con base jurídica (Directiva UE 2019/790). Separa <code>search</code>, <code>ai-input</code> y <code>ai-train</code></td>
<td>Recomendado, es la señal más completa y la única con respaldo legal</td>
</tr>
<tr>
<td>Monitorizar y comprobar cumplimiento (VigIA)</td>
<td>Ni declara ni bloquea: te dice quién entra y quién respeta tus señales</td>
<td>Imprescindible. Es lo que te deja decidir con datos y no a ciegas</td>
</tr>
<tr>
<td>Bloqueo con <code>403</code> por <code>.htaccess</code> o PHP (VigIA)</td>
<td>Bloqueo efectivo. Impide el acceso a los bots declarados que ignoran las señales</td>
<td>Para los que te sangran el servidor o pasan de ti. No frena a los que se disfrazan</td>
</tr>
<tr>
<td>Firewall (WAF, Cloudflare, Vigilante)</td>
<td>Bloqueo efectivo, hasta a los que se disfrazan</td>
<td>Lo más robusto. Ojo, bloquear el <code>training</code> puede impedir también a <code>Googlebot</code></td>
</tr>
<tr>
<td>Cobrar por el acceso (<code>402</code> / <code>x402</code>)</td>
<td>Ni bloqueas ni regalas, pones precio al rastreo de la IA</td>
<td>A tener en el radar, es la vía de futuro para monetizar el acceso</td>
</tr>
<tr>
<td>Adelantarte con la atribución (AI Share &amp; Summarize)</td>
<td>No bloquea, cuando te comparten con una IA, eres de fuente y puedes medir</td>
<td>Recomendado. Juegas a favor en vez de solo defenderte</td>
</tr>
</tbody>
</table>
<p>Si miras la tabla entera, la lógica salta sola, pues casi todo lo que de verdad quieres (que no te entrenen) lo consigues con señales que no tocan tu SEO, y el bloqueo efectivo lo guardas para los que ignoran tus normas o solo consumen recursos del servidor.</p>
<p>Lo único que te cuesta visibilidad de verdad es impedir el paso a los bots de búsqueda, así que ese error no lo cometas sin querer.</p>
<h3>Mi consejo, por si te sirve</h3>
<p>Para la web típica, la de contenido, servicios o marca, mi posición es deja pasar a los bots de búsqueda (<code>search</code>) y de cita (<code>assistant</code>), que te interesa muchísimo que las IA te lean y te nombren.</p>
<p>Además, declarar con las Content Signals y el <code>noai</code> que no te entrenen, medir con VigIA quién te respeta, y bloquear de verdad solo a los que ignoran tus normas o te ponen a prueba el hosting.</p>
<p>Además, estoy muy a favor de limitarte solo en defenderte, a ir a por la atribución, que las IA te van a leer igual y más vale que te lleven de fuente.</p>
<p>Si en cambio tu negocio es contenido propietario, de pago o datos únicos, ahí sí, bloquea lo que haga falta y con menos remordimientos, o plantéate cobrar por el acceso.</p>
<p>Porque al final esto va de lo de siempre, de que <strong>hemos pasado de ser dueños de nuestro contenido a andar negociando quién lo lee, para qué y a cambio de qué</strong>.</p>
<p>Tu web es tuya y la decisión también, faltaría más, pero tómala con los datos delante y sabiendo qué es una declaración y qué es un bloqueo efectivo, que es justo lo que casi nadie te cuenta.</p>
<p>Si quieres seguir tirando del hilo, tengo más escrito sobre <a href="https://ayudawp.com/visibilidad-ia/">visibilidad en las IA</a>, sobre el <a href="https://ayudawp.com/llms-txt-llms-full-txt/">llms.txt</a> y sobre <a href="https://ayudawp.com/ai-overviews-google/">cómo posicionar en las AI Overviews de Google</a>, donde seguro que atas algún cabo más.</p>
<p>Y si lo ves de otra manera, o me quieres contar cómo lo llevas en tu web, me tienes ahí abajo, en la sección de comentarios, que para eso están.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/bloquear-bots-ia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Trucazo rápido para saber dónde y por qué va lento WordPress</title>
		<link>https://ayudawp.com/diagnostico-rapido-pagina-lenta/</link>
					<comments>https://ayudawp.com/diagnostico-rapido-pagina-lenta/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 15 Jul 2026 06:28:14 +0000</pubDate>
				<category><![CDATA[Programación + WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[WPO - Optimizar WordPress]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[mu-plugins]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Query Monitor]]></category>
		<category><![CDATA[wp-config.php]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159885</guid>

					<description><![CDATA[Si quieres diagnosticar en qué se te van los tiempos de carga de cualquier página aquí tienes un modo rápido, limpio y privado de verlo fase a fase.]]></description>
										<content:encoded><![CDATA[<p>Tu WordPress va lento, abres Query Monitor a ver qué pasa, miras las consultas y… están bien, hay pocas, son rápidas, nada raro, y sin embargo la página tarda un mundo en pintarse.</p>
<p>Pues bien, resulta que ahí tienes el problema delante y no lo estás viendo, porque <strong>el tiempo no siempre se va en la base de datos</strong>.</p>
<p>Que conste, la mayoría de las veces que algo va lento la culpable sí es la base de datos, en eso llevas razón y por eso conviene empezar por ahí con la <a href="https://ayudawp.com/optimizar-consultas-sql/" target="_blank" rel="ugc noopener">guía para optimizar las consultas SQL</a>.</p>
<p>Pero cuando las consultas están limpias y la cosa se sigue arrastrando el tiempo de carga se te está yendo en otro sitio, en PHP puro, en un plugin que hace un bucle a lo bestia, en una llamada a una API externa metida dentro de un hook, en un render que se atasca.</p>
<p>Y no, eso en las consultas no sale.</p>
<p>Para medirlo con detalle existe el comando <code>wp profile</code>, que reparte el tiempo de carga por fases, pero necesita SSH y línea de comandos, y en un alojamiento compartido normal ni lo tienes ni te dejan tocarlo.</p>
<p>Así que aquí va la versión casera, <strong>un mu-plugin que te dice, al final de cada página, cuánto tiempo se ha ido en cada tramo de la carga</strong>. Sin consola, y solo lo ves solo tú.</p>
<h2>Midiendo los tiempos de carga de una página web por fases</h2>
<p>La carga de WordPress no es un bloque, son fases encadenadas, primero se cargan los plugins, luego arranca el tema, después se dispara <code>init</code>, viene la consulta principal y al final el render de la página.</p>
<p>La idea es poner un cronómetro en cada uno de esos pasos para ver en cuál se atasca la cosa.</p>
<p>Crea un archivo, por ejemplo <code>ayudawp-phase-timer.php</code>, y súbelo a la carpeta <code>/wp-content/mu-plugins/</code> (si no existe la creas tú, es una carpeta normal y corriente).</p>
<p><a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="noopener">Los mu-plugins ya sabrás se ejecutan solos y antes que todo lo demás</a>, que es justo lo que necesitamos para cronometrar desde el arranque.</p>
<p>En fin, que este es el nene:</p>
<pre>&lt;?php
/**
* Plugin Name: Load Phase Timer
* Plugin URI: https://ayudawp.com/
* Description: Solo para admins: muestra los momentos en los que el tiempo real se solapa con el ciclo de carga de WordPress. Herramienta de diagnóstico, eliminar tras su uso.
* Version: 1.0.0
* Author: Fernando Tellado
* Author URI: https://tellado.es
 */

// Evitar el acceso directo
defined( 'ABSPATH' ) || exit;

// Solo se ejecuta cuando se activa explícitamente, para evitar una sobrecarga en el uso habitual
// Activar definiendo AYUDAWP_PHASE_TIMER como true in wp-config.php
if ( ! defined( 'AYUDAWP_PHASE_TIMER' ) || ! AYUDAWP_PHASE_TIMER ) {
	return;
}

// Una marca temporal por cada paso del ciclo
$GLOBALS['ayudawp_phase_marks'] = array();

// Ancla al inicio de la solicitud real, definida por PHP incluso antes de que se cargue WordPress
$GLOBALS['ayudawp_phase_marks']['request_start'] = isset( $_SERVER['REQUEST_TIME_FLOAT'] )
	? (float) $_SERVER['REQUEST_TIME_FLOAT']
	: microtime( true );

// Momento en que este mu-plugin empieza a ejecutarse
$GLOBALS['ayudawp_phase_marks']['muplugins_start'] = microtime( true );

/**
 * Registra el tiempo real de cada paso
 */
function ayudawp_mark_phase( $name ) {
	$GLOBALS['ayudawp_phase_marks'][ $name ] = microtime( true );
}

// Marca temporal de cada paso del ciclo de carga, en orden
add_action( 'muplugins_loaded',  function () { ayudawp_mark_phase( 'muplugins_loaded' ); },  0 );
add_action( 'plugins_loaded',    function () { ayudawp_mark_phase( 'plugins_loaded' ); },    0 );
add_action( 'after_setup_theme', function () { ayudawp_mark_phase( 'after_setup_theme' ); }, 0 );
add_action( 'init',              function () { ayudawp_mark_phase( 'init' ); },              0 );
add_action( 'wp_loaded',         function () { ayudawp_mark_phase( 'wp_loaded' ); },         0 );
add_action( 'template_redirect', function () { ayudawp_mark_phase( 'template_redirect' ); }, 0 );

// Al final de la solicitud muestra el informe (solo admins)
add_action( 'shutdown', 'ayudawp_print_phase_report', PHP_INT_MAX );

/**
 * Genera y muestra el desglose por fases como comentario HTML, solo para admins
 */
function ayudawp_print_phase_report() {

	// Nunca expone tiempos internos a visitantes
	if ( ! function_exists( 'current_user_can' ) || ! current_user_can( 'manage_options' ) ) {
		return;
	}

	ayudawp_mark_phase( 'shutdown' );
	$marks = $GLOBALS['ayudawp_phase_marks'];

	// Etiqueta para humanos =&gt; [ from milestone, to milestone ]. Cadena contigua
	$phases = array(
		'Antes de WordPress (arranque PHP)' =&gt; array( 'request_start', 'muplugins_start' ),
		'Carga de mu-plugins'               =&gt; array( 'muplugins_start', 'muplugins_loaded' ),
		'Carga de plugins'                  =&gt; array( 'muplugins_loaded', 'plugins_loaded' ),
		'Arranque del tema'                 =&gt; array( 'plugins_loaded', 'after_setup_theme' ),
		'Hasta init'                        =&gt; array( 'after_setup_theme', 'init' ),
		'De init a wp_loaded'               =&gt; array( 'init', 'wp_loaded' ),
		'Consulta principal'                =&gt; array( 'wp_loaded', 'template_redirect' ),
		'Render y salida'                   =&gt; array( 'template_redirect', 'shutdown' ),
	);

	$total = ( $marks['shutdown'] - $marks['request_start'] ) * 1000;

	$lines   = array();
	$lines[] = 'AyudaWP Load Phase Timer';
	$lines[] = 'URL: ' . ( isset( $_SERVER['REQUEST_URI'] ) ? esc_html( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : 'n/a' );
	$lines[] = str_repeat( '-', 52 );

	foreach ( $phases as $label =&gt; $pair ) {
		list( $from, $to ) = $pair;

		// Omite fases cuyos pasos no se hayan activado (p.ej. template_redirect en wp-admin)
		if ( ! isset( $marks[ $from ], $marks[ $to ] ) ) {
			continue;
		}

		$ms  = ( $marks[ $to ] - $marks[ $from ] ) * 1000;
		$pct = $total &gt; 0 ? ( $ms / $total ) * 100 : 0;
		$lines[] = sprintf( '%-38s %8.1f ms  %5.1f%%', $label, $ms, $pct );
	}

	$lines[] = str_repeat( '-', 52 );
	$lines[] = sprintf( '%-38s %8.1f ms', 'TOTAL', $total );

	$output = implode( "\n", $lines );

	// Red de seguridad: no dejar que el contenido salga del comentario HTML
	$output = str_replace( '--&gt;', '--&amp;gt;', $output );

	echo "\n&lt;!--\n" . $output . "\n--&gt;\n"; // phpcs:ignore WordPress.Security.EscapeOutput
}
</pre>
<p>Para que no te consuma nada en el día a día, <strong>el cronómetro solo se enciende cuando tú quieres</strong>. Añade esta línea a tu <code>wp-config.php</code> mientras diagnosticas y la quitas al terminar:</p>
<pre>// Activa el temporizador de fase de AyudaWP para medir el tiempo de carga de las páginas
define( 'AYUDAWP_PHASE_TIMER', true );</pre>
<h2>Interpretar el reparto de tiempos</h2>
<p>Abre como administrador la página que va lenta, mira el código fuente (botón derecho, <code>Ver código fuente de la página</code>) y busca al final del todo <strong>un comentario de código con el reparto de tiempos</strong>, verás algo así:</p>
<pre>&lt;!--
AyudaWP Load Phase Timer
URL: /mi-pagina-lentorra/
----------------------------------------------------
Antes de WordPress (arranque PHP) 37.8 ms 23.9%
Carga de mu-plugins 0.1 ms 0.1%
Carga de plugins 17.9 ms 11.3%
Arranque del tema 8.4 ms 5.3%
Hasta init 3.9 ms 2.5%
De init a wp_loaded 18.0 ms 11.4%
Consulta principal 8.1 ms 5.1%
Render y salida 63.8 ms 40.4%
----------------------------------------------------
TOTAL 158.1 ms
--&gt;</pre>
<p><strong>La fase con más milisegundos es donde se te está yendo el tiempo.</strong> A partir de ahí:</p>
<ul>
<li>Si se concentra en <strong>Carga de plugins</strong> o en <strong>Hasta init</strong>, tienes demasiados plugins o alguno hace trabajo pesado al arrancar, así que toca revisar cuáles son y desactivar los que no aporten.</li>
<li>Si el tiempo está en <strong>Consulta principal</strong> y las consultas estaban limpias, mira el bucle principal, las <code>WP_Query</code> mal montadas o los relacionados, y vuelve a esa guía de consultas SQL.</li>
<li>Si el grueso está en <strong>Render y salida</strong>, el problema es de la plantilla, de shortcodes pesados o de scripts, no de la base de datos.</li>
</ul>
<p>Ojo, esto es para direcciones de la parte visible de la web, en el escritorio (<code>wp-admin</code>) algunas fases no aparecen porque no llegan a dispararse, y es lo normal.</p>
<p>Y que quede claro, esto es un primer vistazo y no sustituye a nada. Cuando ya sepas donde se atasca la cosa y quieras al culpable concreto <a href="https://ayudawp.com/query-monitor/" target="_blank" rel="ugc noopener">Query Monitor</a> te atribuye cada consulta, cada llamada HTTP y cada hook al plugin que lo provoca. Y si tienes SSH, <code>wp profile</code> te da todo esto y bastante más.</p>
<p>Una última cosa, que luego todo son sustos, <strong>esto es una herramienta de diagnóstico y no se queda puesta. </strong>Cuando termines quita la línea del <code>wp-config.php</code> o borra directamente el archivo, que un cronómetro corriendo en cada carga, por ligero que sea, no pinta nada en producción.</p>
<p>¿Te ha salido disparada una fase que no te esperabas? Cuéntamelo aquí abajo en los comentarios, que seguro que no eres el único al que le pasa.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/diagnostico-rapido-pagina-lenta/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Todo lo que deberías revisar si vas a auditar un web WordPress, o al menos lo que yo hago</title>
		<link>https://ayudawp.com/auditar-web-wordpress/</link>
					<comments>https://ayudawp.com/auditar-web-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 14 Jul 2026 06:28:44 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[AI Share & Summarize]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Content Signals]]></category>
		<category><![CDATA[DietPress]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Ómnibus]]></category>
		<category><![CDATA[OPcache]]></category>
		<category><![CDATA[RGPD]]></category>
		<category><![CDATA[VigIA]]></category>
		<category><![CDATA[Visibility]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159848</guid>

					<description><![CDATA[Te llega una web WordPress que no has hecho tú, de la que nadie sabe darte detalles, y tienes que decidir si aceptas mantenerla, cuánto cobras por arreglarla o qué contarle al cliente en la consultoría. ]]></description>
										<content:encoded><![CDATA[<p>Te llega una web WordPress que no has hecho tú, de la que nadie sabe darte detalles, y tienes que decidir si aceptas mantenerla, cuánto cobras por arreglarla o qué contarle al cliente en la consultoría. Para eso sirve una auditoría técnica: <strong>una revisión sistemática, área por área, que termina en un informe con prioridades claras</strong> y no en una lista infinita de cosas que «habría que mirar».</p>
<p>Las áreas habituales no son pocas, rondan la decena: entorno y servidor, núcleo de WordPress, tema, plugins, seguridad, rendimiento, SEO técnico, visibilidad IA y RGPD, más tienda online y multisitio si los hay.</p>
<p>Pues bien, hoy quiero compartir contigo cómo lo hacemos en mi servicio de mantenimiento de webs WordPress, y espero que te sea útil, no solo si también ofreces ese tipo de servicio, sino en otras posibles situaciones:</p>
<ol>
<li><strong>Asumes el mantenimiento de una web que no conoces</strong> y quieres saber dónde te metes antes de firmar, porque lo que no detectes hoy será tu problema mañana.</li>
<li><strong>Te contratan una consultoría</strong> y necesitas diagnosticar el estado real de la web antes de recomendar nada.</li>
<li><strong>Te encargan mejorar o rediseñar una web existente</strong>, o valorar una que tu cliente quiere comprar, y toca saber sobre qué base estás pisando.</li>
<li><strong>Quieres analizar tu propia web</strong> para saber qué está bien, qué no, y cómo mejorarla de manera generalizada.</li>
</ol>
<p>Igual que en la guía de <a href="https://ayudawp.com/analizar-codigo-tema-wordpress/" target="_blank" rel="ugc noopener">auditoría de temas WordPress a medida</a>, el artículo va en dos velocidades. Si prefieres no usar código cada bloque te dice qué puedes comprobar con herramientas visuales y qué pedirle a una IA, y si eres el técnico del proyecto tienes los comandos y el detalle que completan el trabajo.</p>
<p>Y aunque no tengas acceso por SSH ni por FTP, tranquilo, que en cada bloque te doy la manera de comprobar lo mismo desde el escritorio de WordPress, el panel del hosting o una herramienta, para que la falta de un acceso no te deje ningún bloque sin revisar.</p>
<p>Cada bloque de esta propuesta de estructura de auditoría <strong>clasifica los hallazgos en tres niveles</strong>, los mismos que luego usarás <strong>para priorizar el trabajo</strong>:</p>
<ul>
<li><strong>Crítico</strong> (se corrige antes de cualquier otra cosa)</li>
<li><strong>Importante</strong> (se planifica en la próxima actuación)</li>
<li><strong>Menor</strong> (se documenta y se resuelve cuando toque pasar por ahí).</li>
</ul>
<p>Vamos a verlo con calma.</p>
<h2>Antes de tocar nada: accesos, contexto y red de seguridad</h2>
<p>Una auditoría sin accesos completos es una auditoría a medias, así que lo primero es pedirle al cliente todo esto, y pedirlo por escrito, que luego las cosas se olvidan:</p>
<ul>
<li><strong>Administrador de WordPress</strong>: un usuario propio para ti, nuevo, no el que se comparte media empresa por WhatsApp.</li>
<li><strong>Panel del hosting</strong>: sin él no puedes configurar versiones de PHP, base de datos, copias de seguridad con garantías ni logs del servidor.</li>
<li><strong>FTP/SFTP, WP-CLI o SSH</strong>: imprescindible para la velocidad técnica, y tu salvavidas si algo se rompe durante la revisión.</li>
<li><strong>Gestión del dominio y DNS</strong>: a veces está en un registrador distinto del hosting y nadie recuerda la contraseña, mejor descubrirlo ahora que durante una migración.</li>
<li><strong>Licencias de plugins y temas de pago</strong>: cuáles hay, quién las paga y desde qué cuenta se renuevan.</li>
<li><strong>Google Search Console, Bing Webmasters y Analytics</strong>: si existen, pide acceso; si no existen, ya tienes el primer hallazgo del informe.</li>
</ul>
<p>Pide también contexto, que no todo son contraseñas: quién hizo la web, quién la ha tocado desde entonces, qué problemas recuerdan y si hay algo «<strong>que no se puede tocar porque se rompe</strong>». Esa última frase, cuando aparece, <strong>señala exactamente el sitio donde más falta hace la auditoría</strong>.</p>
<p>Y antes de nada, la red de seguridad: <strong>copia de seguridad completa, verificada y descargada fuera del servidor</strong>. La auditoría en sí no debería romper nada porque es observación, pero posiblemente vayas a activar plugins de diagnóstico y a hurgar en ajustes, y si algo falla quieres poder volver atrás sin depender de la copia (quizás inexistente, ya lo verás en el bloque de seguridad) del hosting.</p>
<p>Todo lo que sea intervención de verdad, en staging (una copia de pruebas de la web), nunca en producción.</p>
<h3>Herramientas básicas</h3>
<p>Para la velocidad sin código usa el <a href="https://ayudawp.com/que-es-wp_debug-y-como-usarlo/" target="_blank" rel="ugc noopener">modo depuración de WordPress</a> con registro en archivo, el plugin oficial <a href="https://es.wordpress.org/plugins/health-check/" target="_blank" rel="nofollow noopener">Health Check &amp; Troubleshooting</a> y la pantalla <a href="https://ayudawp.com/salud-del-sitio-wordpress/" target="_blank" rel="ugc noopener">salud del sitio</a>, que ya viene de serie en la pantalla de herramientas, y es el mejor <strong>punto de partida que regala WordPress</strong>. Con eso y tu IA de confianza cubres la mayor parte del recorrido.</p>
<p>Para todo lo que normalmente pedirías por FTP, el <strong>gestor de archivos del hosting</strong> (cPanel, Plesk, las Site Tools de SiteGround o prácticamente cualquier panel) te deja ver y editar ficheros y revisar permisos sin instalar nada ni abrir una consola, que es tu puente para casi todo lo que aquí resuelvo por línea de comandos.</p>
<p>Para la parte más técnica te recomiendo tener <a href="https://wordpress.org/plugins/query-monitor/" target="_blank" rel="nofollow noopener">Query Monitor</a> instalado durante la auditoría (y desinstalado después), <a href="https://wp-cli.org/" target="_blank" rel="nofollow noopener">WP-CLI</a> por SSH para los comandos que irán apareciendo, y una <strong>hoja de cálculo o herramienta donde ir anotando hallazgos</strong> con su gravedad, porque <strong>una auditoría que no se documenta sobre la marcha es una auditoría que toca repetir</strong>.</p>
<p>Y <strong>si la caché no te deja ver el estado real de la web</strong> mientras investigas, el plugin <a href="https://es.wordpress.org/plugins/anticache/" target="_blank" rel="nofollow noopener">Anti-Cache Kit</a> vacía y desactiva de golpe los plugins de caché, activa el modo depuración y lo revierte todo al desactivarlo, con la misma regla que Query Monitor de <strong>activo mientras dura la auditoría, fuera al terminar</strong>.</p>
<h2>Qué puedes auditar sin tener acceso ni una triste contraseña de nada</h2>
<p>Mientras esperas los accesos (en la vida real tardan días, ya lo verás) puedes ir adelantando trabajo, porque <strong>una parte sorprendentemente amplia de la auditoría se puede hacer desde fuera</strong>, con la web pública y cuatro herramientas gratuitas.</p>
<p>La forma rápida de barrer casi todo este bloque es el <a href="https://herramientas.ayudawp.com/security-check/" target="_blank" rel="ugc noopener">análisis de seguridad WordPress</a> de las herramientas gratuitas, que hace <strong>más de 30 comprobaciones externas de seguridad</strong> de una tacada, entre las que están algunas tan importantes como las cabeceras HTTP, certificado SSL, exposición de archivos, listas negras y bastantes más.</p>
<p>Lo anterior lo complementas con <a href="https://pagespeed.web.dev/" target="_blank" rel="nofollow noopener">PageSpeed Insights</a> para las <strong>métricas de experiencia real de usuarios</strong>, <a href="https://www.ssllabs.com/ssltest/" target="_blank" rel="nofollow noopener">SSL Labs</a> para el certificado a fondo y <a href="https://mxtoolbox.com/" target="_blank" rel="nofollow noopener">MXToolbox</a> para DNS, listas negras y la salud del correo del dominio.</p>
<p>Lo del correo casi nadie lo mete en una auditoría web y luego pasa lo que pasa, y hay cosas que revisar, como los registros <strong>SPF, DKIM y DMARC</strong> (las firmas DNS que autorizan quién puede enviar correo en nombre del dominio), que determinan <strong>si los emails de la web (pedidos, formularios, recuperación de contraseña) llegan a la bandeja de entrada o mueren en spam</strong>.</p>
<p>De todo esto ya nos saldrá información que podemos empezar a clasificar.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Certificado SSL caducado, mal instalado o con la cadena incompleta</strong>: además del susto del navegador, invalida de facto todo lo demás.</li>
<li><strong>Dominio o IP en listas negras de spam o malware</strong>: hay que averiguar el porqué antes de seguir, puede ser herencia de una infección pasada o señal de una activa.</li>
<li><strong>Contenido mixto</strong> (recursos HTTP dentro de páginas HTTPS): candado roto, avisos al visitante y datos viajando sin cifrar.</li>
<li><strong>Sin SPF ni DMARC en un dominio que envía correo transaccional</strong>: entregabilidad a la ruleta y suplantación del dominio servida en bandeja.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Cabeceras de seguridad ausentes</strong> (HSTS, X-Content-Type-Options o Referrer-Policy, entre otras): se resuelven en el bloque de seguridad, aquí solo se anotan.</li>
<li><strong>Métricas Web Principales no superadas en datos de campo</strong>: LCP por encima de 2,5 segundos o INP por encima de 200 ms en móvil apuntan maneras para el bloque de rendimiento.</li>
<li><strong>Versión de WordPress visible</strong> en el meta generator y archivos como <code>readme.html</code> accesibles: información regalada a cualquier escáner automático.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Sin archivo <code>security.txt</code> (el estándar para que investigadores de seguridad sepan a quién avisar si encuentran algo).</li>
<li>TTFB (el tiempo que tarda el servidor en empezar a responder) por encima de 800 ms desde ubicaciones cercanas al público del sitio: no es sentencia, pero es la primera pista de un hosting justito.</li>
</ul>
<h2>Entorno y servidor</h2>
<p>Con los accesos ya en la mano, lo primero es analizar los cimientos de la web, porque <strong>ninguna optimización posterior compensa un servidor por debajo de mínimos</strong>. La pantalla de información de la salud del sitio te da casi todo el inventario sin salir de WordPress, y el panel del hosting completa el resto.</p>
<p>Para el técnico, <code>wp cli info</code>, <code>wp core check-update</code> y un vistazo a <code>phpinfo()</code> temporal (que borrarás al terminar, no como los que verás en el bloque de seguridad) cierran la foto.</p>
<p>Lo que hay que inventariar es el hosting y tipo de servidor (Apache, Nginx, LiteSpeed), versión de PHP y sus límites de memoria y ejecución, versión de MySQL o MariaDB, protocolo HTTP, compresión activa, sistema de copias del hosting, CDN si la hay y cómo está gestionado el cron.</p>
<p>Las referencias contra las que comparar las tienes siempre al día en la <a href="https://wordpress.org/about/requirements/" target="_blank" rel="nofollow noopener">página oficial de requisitos de WordPress</a>, que son versiones de PHP y base de datos mínimos y recomendados del momento. La regla que nunca caduca es que <strong>una versión de PHP sin soporte de seguridad es siempre un mal comienzo</strong>, aunque WordPress todavía la acepte, así que un servidor anclado en versiones viejas acumula papeletas más deprisa de lo que su dueño se imagina.</p>
<p>El cron merece párrafo propio, pues WordPress tiene su propio planificador de tareas (<a href="https://ayudawp.com/wp-cron/" target="_blank" rel="ugc noopener"><code>wp-cron</code></a>) que se ejecuta cuando alguien visita la web, lo que significa que <strong>en webs con poco tráfico las tareas programadas se retrasan y en webs con mucho tráfico se dispara más de la cuenta</strong>.</p>
<p>La configuración sana en producción es desactivarlo con <code>define( 'DISABLE_WP_CRON', true );</code> y sustituirlo por un cron real del servidor cada pocos minutos. Si encuentras publicaciones programadas que no se publicaron ya sabes por dónde empezar.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Versión de PHP sin soporte de seguridad</strong> (que el hosting te la ofrezca no la convierte en segura): sin parches ante vulnerabilidades nuevas, es la primera actualización a planificar, en staging y con calma.</li>
<li><strong>Sin copias de seguridad del hosting</strong>, o existentes pero jamás restauradas: <strong>una copia que nunca se ha probado a restaurar es una esperanza, no una copia</strong>.</li>
<li><strong>Correo transaccional saliente sin authentication por PHP</strong> con la función <code>mail()</code> en un dominio con SPF estricto: los correos de la web no llegan, y nadie se ha dado cuenta porque nadie los echa de menos hasta que hacen falta.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Límite de memoria PHP por debajo de 256 MB</strong> en webs con WooCommerce o page builders: errores intermitentes difíciles de reproducir que desaparecen «solos».</li>
<li><strong>Función <code>wp-cron</code> sin sustituir por cron de sistema</strong> en webs de tráfico alto o muy bajo.</li>
<li><strong>Servidor sin HTTP/2</strong> (ya ni hablamos de HTTP/3) o sin compresión Brotli/GZIP activa: rendimiento regalado que no cuesta dinero activar.</li>
<li><strong>Base de datos en MySQL 5.7 o MariaDB antiguas</strong>: funcionan, pero sin soporte y perdiendo mejoras de rendimiento considerables.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Sin CDN en webs con público geográficamente disperso: mejora disponible, no urgencia.</li>
<li>Espacio en disco o <a href="https://ayudawp.com/inodos/" target="_blank" rel="noopener">inodos</a> cerca del límite del plan: hoy anécdota, el día que la web no pueda escribir ni una imagen, drama.</li>
<li>Logs de error del servidor inaccesibles o desactivados: sin ellos, el próximo diagnóstico será a ciegas.</li>
</ul>
<h2>El núcleo de WordPress y ajustes que nadie revisa</h2>
<p>Aquí se audita el WordPress en sí, o sea, la <strong>versión, integridad del sistema, configuración y usuarios</strong>. Es el bloque más rápido de revisar y donde aparecen algunos de los hallazgos más incómodos de explicar al cliente, porque <strong>casi todos se arreglaban con un clic que nadie hizo en su momento</strong>.</p>
<p>Sin necesidad de código, la herramienta de salud del sitio te dice versión, actualizaciones pendientes y problemas de configuración, y en los ajustes de lectura está la casilla más peligrosa de WordPress, la de disuadir a los motores de búsqueda, que en más de una web estrenada lleva años marcada <strong>sin que nadie sepa por qué el SEO <em>no despega</em></strong>.</p>
<p>Repasa también los usuarios para saber cuántos administradores hay, si siguen en la empresa y si alguno se llama <code>admin</code>, que a estas alturas ya es casi una declaración de intenciones.</p>
<p>Con código, la comprobación estrella es la integridad del núcleo:</p>
<pre>wp core verify-checksums
wp plugin verify-checksums --all</pre>
<p>El primer comando compara cada archivo del núcleo con el original de WordPress.org y <strong>delata cualquier archivo modificado o añadido</strong>, que es una de las formas más rápidas de detectar una infección. El segundo hace lo mismo con los plugins del repositorio oficial.</p>
<p>Para realizar este tipo de comprobación si no tienes acceso a la interfaz de comandos puedes usar el <strong>scanner de integridad de archivos y la auditoría de seguridad del <a href="https://vigilante.works" target="_blank" rel="nofollow noopener">plugin de seguridad Vigilante</a></strong>.</p>
<p>En <code>wp-config.php</code> revisa que las claves y salts de seguridad existan y no sean las de ejemplo, que <code>WP_DEBUG</code> no esté activo en producción y si hay constantes útiles como <code>DISALLOW_FILE_EDIT</code> (desactiva el editor de código del admin, un clásico de la post-explotación).</p>
<h3>Crítico</h3>
<ul>
<li><strong>Núcleo de WordPress varias versiones mayores por detrás</strong>: no es solo funcionalidad, cada versión sin aplicar es una lista pública de vulnerabilidades corregidas que la web sigue teniendo.</li>
<li>Detectar con <code>verify-checksums</code> con <strong>archivos modificados o desconocidos en el núcleo</strong>: tratar como incidente de seguridad hasta demostrar lo contrario.</li>
<li><strong>Administradores que ya no trabajan en el proyecto</strong> con la cuenta activa, o cuentas compartidas entre varias personas: cada admin de más es una puerta de entrada más.</li>
<li><strong>Constantes</strong> <code>WP_DEBUG</code> con <code>WP_DEBUG_DISPLAY</code> activo en producción: rutas, consultas y errores del servidor impresos en pantalla para quien pase por allí.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Actualizaciones automáticas del núcleo desactivadas del todo, sin proceso alternativo que las cubra</strong>: las menores de seguridad deberían estar siempre activas.</li>
<li><strong>Salts de seguridad</strong> de <code>wp-config.php</code> <a href="https://ayudawp.com/seguridad-cookies-sesion/" target="_blank" rel="noopener">sin regenerar</a> desde el año de la instalación, o iguales entre el sitio de producción y copias de staging que andan por ahí.</li>
<li><strong>Prefijo de tablas</strong> <code>wp_</code> con usuarios y contraseñas heredados de instaladores automáticos antiguos: el prefijo en sí no es la muralla que algunos venden, pero el combo delata una instalación nunca revisada.</li>
<li><strong>Zona horaria, idioma o ajustes de comentarios</strong> sin configurar (bien): spam entrando a manta por comentarios abiertos sin moderación en entradas de hace cinco años, pingbacks y trackbacks activos, emails innecesarios.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Etiqueta <code>meta generator</code> con la versión de WordPress en el HTML: información innecesaria de cara al exterior.</li>
<li>Página «Hola mundo», página de ejemplo y temas de prueba aún publicados: cosmética, pero cosmética que retrata el nivel de mantenimiento que ha tenido la web.</li>
</ul>
<h2>El tema WordPress y sus personalizaciones</h2>
<p>Al tema le dediqué una guía completa de <a href="https://ayudawp.com/analizar-codigo-tema-wordpress/" target="_blank" rel="ugc noopener">auditoría de temas a medida</a>, con análisis de código, seguridad, rendimiento y SEO bloque a bloque, así que no voy a repetirla aquí. Lo que sí forma parte de esta auditoría general es lo que el tema cuenta de sí mismo a nivel de instalación, sin abrir un solo archivo.</p>
<p>En <code>Apariencia → Temas</code> lo razonable a revisar es <strong>el tema activo, su tema padre si es un tema hijo, y un tema de respaldo reciente de los de WordPress</strong> (el Twenty Twenty-algo de turno) para pruebas y emergencias.</p>
<p>Todo lo demás sobra, y no por manía, pues cada tema instalado es código presente en el servidor que hay que mantener actualizado aunque esté inactivo, porque <strong>un tema desactivado también es explotable si tiene una vulnerabilidad</strong>.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Tema activo sin actualizaciones disponibles</strong> porque el desarrollador desapareció o la licencia caducó: la web funciona sobre código congelado y sin parches, decisión estratégica a poner sobre la mesa del cliente cuanto antes.</li>
<li><strong>Tema padre modificado directamente</strong>, sin tema hijo: la próxima actualización del padre borra los cambios sin avisar.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Licencia del tema de pago sin saber quién la paga</strong> ni desde qué cuenta: mientras nadie lo aclare, las actualizaciones dependen de una renovación que quizás ya no existe.</li>
<li><strong>Media docena de temas instalados</strong> <em>por si acaso</em>: superficie de ataque y peso de mantenimiento sin beneficio alguno.</li>
<li><strong>Tema hijo con cambios sustanciales sin documentar</strong>: funciona, pero nadie sabe qué se tocó ni por qué, y eso en la práctica es deuda técnica heredada.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Tema hijo con cabecera incompleta o <code>style.css</code> vacío: señal de creación con prisas, revisar que al menos esté bien construido.</li>
</ul>
<p>Si el tema es a medida o hay mucho que revisar, ahí sí, guía completa de auditoría de temas que te comenté antes, y la herramienta gratuita de <a href="https://herramientas.ayudawp.com/theme-audit/" target="_blank" rel="ugc noopener">auditoría de temas WordPress</a> para documentar los hallazgos y generar el informe.</p>
<h2>Los plugins</h2>
<p>Este es el bloque estrella de la auditoría, y no lo digo por decir, pues <strong>la inmensa mayoría de las vulnerabilidades que se descubren en el ecosistema WordPress están en los plugins, casi todo el resto en los temas y un puñado testimonial en el núcleo</strong>, año tras año en cada informe del sector.</p>
<p>La seguridad, el rendimiento y buena parte de los problemas raros de una web WordPress viven en su lista de plugins, así que aquí conviene ir despacio.</p>
<p>Lo primero es el inventario. Sin necesidad de código puedes revisar la pantalla de plugins con sus contadores, con código esta línea te da la foto completa lista para pegar en el informe:</p>
<pre>wp plugin list --fields=name,status,version,update,auto_update</pre>
<p>Y ahora, las preguntas que hay que hacerle a esa lista, una por una:</p>
<ul>
<li><strong>¿Cuántos hay y cuántos están activos?:</strong> Los inactivos son código explotable en el servidor. Se verifica que no hagan falta, se borran (no solo desactivar) y listo.</li>
<li><strong>¿Cuáles están abandonados?:</strong> En la ficha de WordPress.org hay que mirar última actualización hace más de dos años, sin probar en las últimas tres versiones mayores o con el aviso naranja del repositorio. Un plugin abandonado no avisa, simplemente un día deja de funcionar o se convierte en el agujero por el que entran. Si tienes un plugin como Worfence o Vigilante te avisan en su scanner de plugins cerrados y abandonados.</li>
<li><strong>¿Hay duplicidades funcionales?:</strong> Dos plugins de caché, dos de SEO, tres de seguridad pisándose las reglas entre sí. Pasa muchísimo más de lo que parece, y el resultado nunca es <em>doble protección</em>, es doble carga y conflictos.</li>
<li><strong>¿Hay plugins de pago sin licencia?:</strong> Versiones pro que no se actualizan desde tiempos inmemoriales, o instaladas desde «clubs GPL» de dudosa procedencia. Además del riesgo legal que el cliente debe conocer, <strong>un plugin de pago sin licencia es un plugin sin actualizaciones, y sin actualizaciones no hay parches de seguridad</strong>.</li>
<li><strong>¿Tiene alguno vulnerabilidades conocidas?:</strong> Se busca cada plugin con su versión exacta en <a href="https://patchstack.com/database" target="_blank" rel="nofollow noopener">Patchstack</a> o <a href="https://wpscan.com/" target="_blank" rel="nofollow noopener">WPScan</a>. Si aparece con vulnerabilidad sin parchear, al primer puesto de la lista de acciones.</li>
<li><strong>¿Cuánto cuesta cada uno en rendimiento?:</strong> Con Query Monitor ves qué plugin mete más consultas y más tiempo en cada carga. No se trata del número de plugins, que ese debate está más que visto y <strong>el problema nunca es la cantidad de plugis, es sobrecargar la web con código que no necesita</strong>. Cinco plugins bien programados y realmente necesarios pesan menos que un todo-en-uno hinchado.</li>
<li><strong>¿Qué hay en mu-plugins y en los drop-ins?:</strong> La carpeta <code>mu-plugins</code> (plugins de activación obligatoria que no aparecen en la lista normal) y los drop-ins como <code>object-cache.php</code> o <code>advanced-cache.php</code> son los rincones que nadie mira, donde lo mismo vive una integración legítima del hosting que un regalo de un atacante con acceso pasado. En <code>Plugins → Imprescindibles</code> se listan los mu-plugins y, si hay plugins dependientes (<code>drop-ins</code>), aparece también su pestaña, y por consola los sacan <code>wp plugin list --status=must-use</code> y <code>wp plugin list --status=dropin</code>. Para asomarte a lo que hay dentro de esos archivos sin SSH, tira del gestor de archivos del hosting, que es justo el sitio donde un atacante esconde lo que no quiere que veas.</li>
<li><strong>¿Qué dejaron los plugins desinstalados?:</strong> Tablas huérfanas en la base de datos, opciones con autoload y tareas cron que siguen ejecutándose contra nada. Lo retomamos en el bloque de rendimiento, pero se detecta aquí, comparando la lista de plugins con lo que hay en la base de datos.</li>
</ul>
<p>Para algo rápido sin código hay truco, y es pegar la lista completa de plugins (nombre y versión) en tu IA de confianza con este prompt:</p>
<pre>Esta es la lista de plugins de una instalación WordPress con sus versiones. Dime: 1) cuáles parecen abandonados o con mala reputación de mantenimiento; 2) qué duplicidades funcionales detectas; 3) cuáles tienen vulnerabilidades conocidas en esas versiones; 4) qué preguntas debería hacerle al propietario sobre licencias. Preséntalo como tabla con nivel de prioridad.</pre>
<p>La respuesta no sustituye la comprobación en Patchstack o WPScan (la IA puede no conocer lo de esta semana), pero como primer barrido y detector de duplicidades funciona de maravilla.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Plugins con vulnerabilidades conocidas sin parchear en la versión instalada</strong>: actualización o retirada inmediata, antes de terminar la auditoría siquiera.</li>
<li><strong>Plugins <a href="https://ayudawp.com/plugins-temas-nulled-gpl/" target="_blank" rel="noopener">nulled</a> o de procedencia <em>desconocida</em></strong>: retirada y sustitución, sin matices. Nunca sabes qué llevan dentro, y lo que llevan dentro a veces se llama puerta trasera.</li>
<li><strong>Plugins abandonados ocupando funciones primordial de la web</strong> (formularios, tienda, membresías): planificar sustitución ya, no cuando falle.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Plugins inactivos acumulados</strong> sin verificar ni borrar.</li>
<li><strong>Duplicidades funcionales activas</strong> (especialmente caché y SEO): elegir uno, configurar bien y retirar el resto.</li>
<li><strong>Licencias de pago sin titular claro</strong>: documentar quién paga qué, cuánto y hasta cuándo, en el informe.</li>
<li><strong>Actualizaciones automáticas sin criterio</strong>: ni todo activado a lo loco en una web crítica sin staging, ni todo desactivado y sin nadie que actualice a mano. Lo importante es que haya una decisión consciente, no una casilla olvidada.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Plugins de un solo uso puntual (un import de hace años, un generador de algo) que siguen instalados: fuera con ellos.</li>
<li>Restos menores de plugins desinstalados en base de datos: se limpian en la fase de optimización, con copia previa.</li>
</ul>
<h2>La SEGURIDAD</h2>
<p>Instalar un plugin de seguridad y darse por protegido es como comprar un extintor para tu casa y dejarlo en el maletero del coche, porque de algo servirá, pero no es un plan. Lo que se audita aquí es <strong>cuántas capas reales de protección tiene la web y cuántas cree tener</strong>, que suelen ser números distintos.</p>
<p>Sin tener que tirar de código, el barrido externo ya lo hiciste con el análisis de seguridad del bloque sin accesos, y <strong>ahora toca la parte interna</strong>, que es probar a mano si responden URLs que jamás deberían responder, como <code>/debug.log</code>, <code>/.env</code>, <code>/phpinfo.php</code>, el listado de directorios en <code>/wp-content/uploads/</code> o copias de seguridad sueltas tipo <code>backup.zip</code> en la raíz.</p>
<p><strong>Cada una de esas URLs respondiendo contenido es un hallazgo directo al informe</strong>, y más habitual de lo que te gustaría creer.</p>
<p>Pero hay un hallazgo que no está en ninguna URL suelta pero aparece más de lo que parece, como una copia de staging, de pre-producción o un clon viejo del sitio accesible al público, que Google indexa y un atacante estudia a placer para colarse por la de verdad.</p>
<p>Si das con una, hasta que decidas si la migras o la borras, lo suyo es <strong>cerrarla con acceso obligatorio</strong>, y para eso te vale un plugin como <a href="https://es.wordpress.org/plugins/gozer/" target="_blank" rel="nofollow noopener">Gozer</a>, que deja la web entera detrás del acceso con un clic.</p>
<p>Con código, además de los checksums que ya pasaste en el bloque del núcleo, toca comprobar <a href="https://ayudawp.com/permisos-de-carpetas-y-archivos-en-wordpress/" target="_blank" rel="noopener">permisos de archivos</a> (directorios en <code>755</code>, archivos en <code>644</code> y <code>wp-config.php</code> más restrictivo), probar <code>xmlrpc.php</code> (si responde y nadie lo usa para nada, se cierra), consultar <code>/wp-json/wp/v2/users</code> a ver si la web muestra la lista de usuarios a cualquiera (enumeración vía REST API), y revisar a fondo las cabeceras de seguridad que anotaste en el barrido externo.</p>
<p>Si no tienes consola no te preocupes que este bloque de auditoría no se te queda a medias, la propia comprobación de seguridad que trae el plugin <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a> corre <strong>más de 40 chequeos desde dentro de WordPress</strong>, incluidos decenas que no se pueden hacer desde fuera, como los permisos de los archivos, los salts por defecto, el prefijo <code>wp_</code>, si hay algún administrador sin 2FA o si tu versión de PHP ya está fuera de soporte.</p>
<p>Así que buena parte de lo que sacarías por SSH lo tienes en una sola pantalla. Los permisos concretos también los ves y los cambias desde el gestor de archivos del hosting, y las URLs que no deberían responder las pruebas tú mismo en el navegador, que <strong>para eso no hace falta ni herramienta</strong>.</p>
<p>El modelo mental para el informe son <strong>3 niveles de cortafuegos</strong>:</p>
<ul>
<li><strong>CDN/perímetro</strong> (Cloudflare o similar por delante del servidor).</li>
<li><strong>Servidor</strong> (lo que ponga el hosting)</li>
<li><strong>Aplicación</strong> (plugin de seguridad bien configurado)</li>
</ul>
<p>No son obligatorios los tres en toda web, pero hay que saber cuáles hay, y <strong>si la respuesta es «ninguno», eso es un problema</strong>, no una opinión.</p>
<p>Y la joya de la corona, las copias de seguridad, donde la regla razonable es la <code>3-2-1</code> (tres copias, en dos soportes, una fuera del servidor). La copia de seguridad del hosting cuenta como una, no como el plan entero, porque si el servidor arde o la cuenta se suspende, se llevan la web y la copia en el mismo incendio.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Malware o código inyectado detectado</strong>: se acabó la auditoría normal, toca protocolo de limpieza, y si el sitio es un tema a medida revisa la guía de <a href="https://ayudawp.com/temas-wordpress-codigo-malicioso/" target="_blank" rel="ugc noopener">detección de código malicioso</a> antes de tocar nada.</li>
<li><strong>Archivos <code>debug.log</code>, <code>.env</code> o <code>phpinfo.php</code> accesibles públicamente</strong>: exposición directa de rutas, errores, credenciales o configuración del servidor.</li>
<li><strong>Sin identificación en dos pasos (2FA) en cuentas de administrador</strong>, combinado con login sin límite de intentos: la puerta principal abierta a fuerza bruta con toda la paciencia del mundo.</li>
<li><strong>Copias de seguridad inexistentes</strong>, solo en el propio servidor o nunca restauradas de prueba.</li>
<li><strong><a href="https://ayudawp.com/enumeracion-usuarios/" target="_blank" rel="noopener">Enumeración de usuarios</a> abierta</strong> vía REST API o archivos de autor, con nombres de usuario que coinciden con los del login, con lo que la mitad del trabajo del atacante ya se la das hecha.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Cabeceras de seguridad ausentes o incompletas</strong> (<code>HSTS</code>, <code>CSP</code> aunque sea básica, <code>X-Frame-Options</code>, <code>Referrer-Policy</code>).</li>
<li><code>xmlrpc.php</code> activo sin uso que lo justifique.</li>
<li><strong>Sin cortafuegos</strong> de aplicación ni plugin de seguridad configurado, o instalado con los ajustes de fábrica sin adaptar.</li>
<li><strong>Listado de directorios activo</strong> en <code>uploads</code> o directorios sensibles.</li>
<li><strong>Sin monitorización de cambios en archivos</strong>: para esto <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a> es fundamental, es un plugin gratuito, escanea los archivos y te avisa si alguien modifica algo sin que lo sepas, que es exactamente lo que hace un atacante cuando planta una puerta trasera en un archivo que ya existía. La auditoría te dice cómo está la web hoy, Vigilante te avisa si deja de estarlo mañana.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>URL de acceso sin enmascarar: medida cosmética que reduce ruido de bots, no sustituye a nada de lo anterior, pero como higiene vale.</li>
<li>Meta generator, <code>readme.html</code> y versiones visibles: ya anotado en el barrido externo, se resuelve junto al resto.</li>
<li>Endpoint de Application Passwords activo sin uso conocido: revisar y cerrar si nadie lo necesita.</li>
</ul>
<h2>Rendimiento y velocidad de carga</h2>
<p>Antes de tocar nada conviene separar dos mundos que se confunden constantemente. Me refiero a <strong>los datos de campo</strong> (lo que experimentan los usuarios reales, que es lo que Google usa para valorar la web) y, por otro lado, a <strong>los datos de laboratorio</strong> (la simulación que hace la herramienta de turno para diagnosticar).</p>
<p>El informe se abre con los de campo, que salen en PageSpeed Insights si la web tiene tráfico suficiente, y las referencias son las métricas web principales: <strong>LCP hasta 2,5 segundos, INP hasta 200 ms y CLS hasta 0,1</strong>. El laboratorio viene después, para averiguar el porqué de cada suspenso.</p>
<p>La revisión interna va por <a href="https://ayudawp.com/caches-wordpress/" target="_blank" rel="noopener"><strong>capas de caché</strong></a>, que en una web sana son varias y coordinadas:</p>
<ul>
<li><strong>Caché de página</strong> (el plugin de turno o la del hosting, uno solo y bien configurado)</li>
<li><strong>Caché de objetos</strong> (Redis o Memcached si el hosting la ofrece, imprescindible para tiendas y membresías),</li>
<li><strong>OPcache de PHP y caché de navegador</strong> con sus caducidades.</li>
</ul>
<p>Como auditor tu misión no es saber si hay un plugin de caché, la cuestión adecuada es más bien <strong>cuántas capas hay, si se solapan y con qué criterio se han configurado</strong>.</p>
<p>Después, la base de datos, esa gran olvidada. Con código, esta línea te dice cuántos KB de <a href="https://ayudawp.com/optimizar-autoload-opciones-base-datos/" target="_blank" rel="noopener">opciones se cargan en memoria en cada petición</a> (<code>autoload</code>):</p>
<pre>wp option list --autoload=on --format=total_bytes</pre>
<p>Por debajo de 1 MB vas bien, y a partir de ahí cada MB extra es lastre que se carga en todas y cada una de las visitas. El <strong>desglose de culpables</strong> te lo da <a href="https://wordpress.org/plugins/aaa-option-optimizer/" target="_blank" rel="nofollow noopener">AAA Option Optimizer</a>, que además identifica opciones huérfanas de plugins ya desinstalados.</p>
<p>Completa el repaso con <strong>revisiones acumuladas por miles, transients caducados y tablas huérfanas</strong>, todo ello con copia de seguridad previa antes de limpiar nada.</p>
<p>Quedan <strong>los sospechosos habituales</strong>, que son las imágenes sin optimizar (formatos modernos WebP o AVIF, tamaños acordes a lo que se muestra, carga diferida nativa).</p>
<p>También cuentan las <strong>fuentes cargadas desde Google en vez de alojadas en local</strong> (doble motivo para cambiarlo, el segundo te espera en el bloque RGPD), el Heartbeat de WordPress a su ritmo por defecto en el admin, y JavaScript y CSS sin minimizar ni combinar con criterio.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Métricas web principales suspensas en campo en móvil</strong>: afectan hoy mismo a usuarios y posicionamiento.</li>
<li><strong>Sin ninguna caché de página activa</strong> en una web con tráfico: cada visita cocina la página desde cero, con el servidor pagando la fiesta.</li>
<li><strong>Autoload de opciones desbocado</strong> (varios MB): impuesto invisible en cada petición, incluidas las del admin.</li>
<li><strong>Dos o más plugins de caché u optimización activos a la vez</strong>: no suman, se pisan, y los efectos son de los que vuelven loco a cualquiera («a veces va lento, a veces no»).</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Sin caché de objetos</strong> disponible o disponible pero sin activar en webs con WooCommerce o membresías.</li>
<li><strong>Imágenes a pelo</strong>: sin formatos modernos, sin dimensionar y sin comprimir. Suele ser la mejora más visible por esfuerzo invertido.</li>
<li><strong>Fuentes externas de Google sin alojar</strong> en local.</li>
<li><strong>Base de datos sin mantenimiento</strong>: revisiones infinitas, transients caducados, restos de plugins.</li>
<li><strong>Heartbeat sin controlar</strong> en webs con muchos usuarios simultáneos en el admin.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Minimizado de JS/CSS sin aplicar: mejora real pero modesta, y siempre después de tener el resto en orden.</li>
<li>Recursos (<code>assets</code>) que cargan en páginas donde no se usan: afinado fino, planificable.</li>
</ul>
<h2>SEO / AEO técnico</h2>
<p>Aquí no se audita el contenido ni las palabras clave, se audita la fontanería, las tripas, <strong>que lo que debe indexarse se pueda indexar, que lo que no deba no se indexe, y que ninguna configuración esté saboteando el trabajo de nadie</strong>. Es un bloque donde los hallazgos críticos suelen ser pocos pero de los que hacen polvo el negocio del cliente.</p>
<p>Empieza por lo que ya viste en el núcleo (la casilla de visibilidad) y sigue con el plugin SEO, y no es complicado, básicamente que haya uno, que sea uno solo y que esté bien configurado, adaptado al sitio, no instalado y ya.</p>
<p>Aquí cada maestrillo tiene su librillo, y yo en mis webs uso <a href="https://visibility.quest/" target="_blank" rel="nofollow noopener">Visibility</a>, plugin de <strong>SEO nativo y ligero</strong> pensado justo para sustituir suites hinchadas, pero lo que se audita no es la marca del plugin sino <strong>que la herramienta esté bien elegida y mejor configurada</strong>.</p>
<p>Después el <code>robots.txt</code> (que no bloquee CSS ni JavaScript y que no arrastre un <code>Disallow: /</code> heredado de staging), el mapa del sitio (accesible, declarado en <code>robots.txt</code>, enviado a Search Console y Bing, y sin URLs que no deberían estar).</p>
<p>Las redirecciones (una sola cadena de www/no-www y HTTP a HTTPS, sin saltos encadenados) y el estado de indexación real en Search Console Bing Webmasters, que para eso pediste el acceso al principio.</p>
<p>Del lado del código fuente toca ver <strong>si el canonical es correcto</strong>, que haya un solo H1 por página y <strong>jerarquía de encabezados</strong> sin saltos (el detalle fino lo tienes en la guía de auditoría de temas), schema sin duplicar entre tema y plugin SEO, y <code>hreflang</code> si hay idiomas.</p>
<p>Para saber en qué se está gastando Google el rastreo de la web, mi <a href="https://herramientas.ayudawp.com/crawl-limit/" target="_blank" rel="ugc noopener">analizador de límites de rastreo</a> te da la foto del <code>crawl budget</code> (el presupuesto de rastreo que Google dedica al sitio) sin instalar nada.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Casilla de disuadir buscadores activa</strong>, meta robots <code>noindex</code> global o <code>Disallow: /</code> en <code>robots.txt</code> en una web en producción: la web está pidiendo por escrito que no la encuentren.</li>
<li><strong>Dos plugins SEO</strong> activos o <strong>schema y metas duplicados entre tema y plugin</strong>: dos fuentes contándole a Google cosas distintas sobre la misma página.</li>
<li><strong>Acciones manuales o problemas de seguridad notificados en Search Console</strong> que nadie ha leído: pasa, y más de lo que parece, porque nadie mira el buzón.</li>
<li><strong>Redirecciones en cadena o bucles</strong> entre versiones www/no-www y HTTP/HTTPS.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Mapa del sitio con URLs <code>noindex</code>, archivos adjuntos o taxonomías vacías</strong>, que son ruido que gasta rastreo.</li>
<li><strong>Errores 404</strong> en enlaces internos y sin sistema de redirecciones para URLs que cambiaron.</li>
<li><strong>Enlaces externos <code>dofollow</code> donde deberían ser <code>nofollow</code></strong> (patrocinados, afiliados sin marcar, iconos sociales, páginas legales).</li>
<li><strong>Imágenes sin texto alternativo de forma sistemática</strong>, lo que supone accesibilidad y SEO de imágenes a la vez.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Relación texto/código muy baja en páginas clave es señal de plantillas sobrecargadas, se anota para la fase de mejoras.</li>
<li>Migas de pan ausentes o sin schema correspondiente.</li>
</ul>
<h2>Visibilidad IA</h2>
<p>Cada vez más gente pregunta directamente a ChatGPT, Claude, Perplexity y compañía, y <a href="https://ayudawp.com/ai-overviews-google/" target="_blank" rel="ugc noopener">Google responde con IA</a> antes de mostrar el primer resultado clásico.</p>
<p>Eso convierte en revisión de auditoría algo que hace tres años no existía, <strong>saber si pueden las IAs descubrir, entender y citar el contenido de esta web</strong> Y otra duda igual de legítima, <strong>si quiere el propietario que puedan</strong>.</p>
<p>Porque este bloque tiene una particularidad que no tiene ningún otro, que <strong>el resultado correcto depende de una decisión de negocio del cliente</strong>.</p>
<p>Hay quien quiere aparecer en cada respuesta de IA y hay quien no quiere ceder ni una coma para entrenamiento. <strong>Decidirlo no te toca a ti, tu trabajo es documentar el estado actual y sus consecuencias</strong>, que casi siempre son involuntarias, pues la mayoría de las webs ni bloquean ni facilitan, simplemente nadie ha mirado.</p>
<p><strong>Hay mucho que revisar</strong>, como las directivas para bots de IA en <code>robots.txt</code>, con el matiz de que el <code>robots.txt</code> es orientativo, quien de verdad quiera bloquear necesita hacerlo por PHP con respuesta 403), <a href="https://ayudawp.com/llms-txt/" target="_blank" rel="ugc noopener">archivos <strong>llms.txt y llms-full.txt</strong></a>, <strong>Content Signals</strong> en <code>robots.txt</code> (definido por Cloudflare para declarar qué usos permites de búsqueda, asistentes y entrenamiento de IA), datos estructurados <a href="https://ayudawp.com/tag/json-ld/" target="_blank" rel="noopener"><strong>JSON-LD</strong></a> de identidad, etiquetas <strong>Open Graph y Twitter Cards</strong>, HTML5 semántico, feed RSS accesible, contenido legible sin ejecutar JavaScript y, en el extremo más avanzado, contenido en <strong>Markdown para agentes de IA</strong>.</p>
<p>Mucho que revisar ¿verdad? No te preocupes, hay ayudas para todo.</p>
<p><strong>Para el diagnóstico externo</strong> tienes el <a href="https://herramientas.ayudawp.com/ai-visibility/" target="_blank" rel="ugc noopener">analizador de visibilidad IA</a> puntúa la web sobre 100 en cinco categorías y te dice exactamente qué falta. Sencillo, completo y gratis.</p>
<p>Y <strong>para implantar y vigilar desde dentro usa <a href="https://es.wordpress.org/plugins/vigia/" target="_blank" rel="nofollow noopener">VigIA</a></strong>, esa joya de plugin, también gratuito, que monitoriza más de 55 rastreadores de IA con analítica de cuáles pasan y qué leen, genera los <code>llms.txt</code>, sirve el contenido como Markdown para agentes, añade el JSON-LD de identidad y bloquea por PHP a los bots que decidas, todo en uno y de paso <strong>midiendo qué rastreadores ignoran tu <code>robots.txt</code></strong>.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Contenido invisible sin JavaScript</strong> en una web que vive de ser encontrada: si el HTML llega vacío, para buena parte de los rastreadores de IA la web no existe.</li>
<li><strong>Bloqueos involuntarios heredados</strong> (reglas anti-bots del hosting o CDN que nadie configuró a propósito) en una web cuyo negocio es la visibilidad.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Sin decisión documentada sobre bots de IA</strong>: ni directivas, ni señales, ni criterio. El hallazgo que apuntas al informe ahí se llama «nadie ha decidido nada».</li>
<li><strong>Sin datos estructurados de identidad</strong> (WebSite/Organization) ni Open Graph: las IAs pueden leer la web pero no saben de quién es ni cómo citarla.</li>
<li><strong>Feed RSS desactivado o roto</strong>: sigue siendo una de las vías favoritas de descubrimiento de contenido, también para las IAs.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Sin <code>llms.txt</code> ni Markdown para agentes en una web que sí quiere visibilidad IA: mejora incremental, fácil de añadir con VigIA.</li>
<li>Sin Content Signals en <code>robots.txt</code>: el estándar es joven, pero declarar intenciones cuesta un minuto.</li>
</ul>
<h2>Legalidad técnica y funcional</h2>
<p>Aviso antes de empezar, para que quede claro, no soy abogado y esto no es asesoramiento jurídico. Lo que sí puedo contarte es <strong>qué comprueba un técnico en una auditoría para saber si la web tiene los deberes hechos o está coleccionando papeletas para una sanción</strong>, y con eso tu cliente ya puede ir a su asesor con datos en vez de con vaguedades.</p>
<p>La comprobación principal se hace con las <strong>DevTools del navegador</strong> en una ventana de incógnito. Para ello abre la pestaña de red y la de cookies <strong>antes de aceptar nada en el banner</strong> y mira qué se carga. Si ya hay cookies de analítica o marketing, o peticiones saliendo hacia Google, Meta y compañía antes del consentimiento, el banner es decorativo, y <strong>un banner decorativo es peor que no tenerlo</strong>, porque documenta que sabías que tenías que pedir permiso.</p>
<p>El criterio vigente de la AEPD añade otra comprobación de primero de RGPD: <strong>rechazar tiene que ser tan fácil como aceptar</strong>, mismo nivel, mismo número de clics.</p>
<p>Las <strong>fuentes de Google cargadas en remoto</strong> son el segundo clásico. Un tribunal alemán ya sentenció que enviar la IP del visitante a Google sin consentimiento por cargar una fuente es sancionable, y de aquella sentencia llovieron reclamaciones por media Europa. Se detectan en la pestaña de red (peticiones a <code>fonts.googleapis.com</code> o <code>fonts.gstatic.com</code>).</p>
<p>El mismo repaso vale para <strong>vídeos de YouTube incrustados sin modo de privacidad mejorada</strong>, mapas y cualquier recurso de terceros que se cargue antes de consentir.</p>
<p>Completa el bloque lo de siempre que casi nunca está, como <strong>formularios y su primera capa informativa y casilla de aceptación sin activar</strong> por defecto, textos legales que describan lo que la web hace de verdad (no la plantilla de otra web con el buscar-y-reemplazar a medias, que hay por ahí cada política de privacidad con el nombre de otra empresa dentro que asusta), y si hay productos de Google en juego, <a href="https://ayudawp.com/tcfv2/" target="_blank" rel="noopener">Consent Mode v2</a> funcionando, obligatorio para audiencias del Espacio Económico Europeo.</p>
<p>Hasta aquí las cookies, pero hay <strong>otro consentimiento que casi nadie audita</strong> y que no tiene nada que ver con el banner. Una cosa es <strong>ePrivacy</strong>, lo del banner de cookies, y otra el consentimiento al que se refiere el artículo 7.1 del RGPD, <strong>el de aceptar tus condiciones o tu privacidad en un formulario, en el registro o en el pago</strong>.</p>
<p><strong>La mayoría de webs tienen la casilla marcada pero no guardan ninguna prueba de que se marcó</strong>, y el 7.1 no pide la casilla, pide <strong>que puedas demostrar el consentimiento</strong>: cuándo se dio, desde qué IP, y qué texto y qué versión se aceptaron. Sin ese registro una casilla marcada no vale de nada el día que alguien reclama.</p>
<p>Hay plugins de cookies que incluyen algún registro suelto, pero <strong>para dejar esa prueba sellada y a prueba de manipulación</strong> tienes <a href="https://es.wordpress.org/plugins/terms-conditions-consent-log/" target="_blank" rel="nofollow noopener">Terms &amp; Conditions Consent Log</a>, que guarda <strong>fecha, IP, agente de usuario, versión y el texto exacto con un hash SHA-256</strong>, y funciona con WooCommerce, Contact Form 7, WPForms, Gravity Forms, Fluent Forms y hasta los comentarios y el registro de WordPress.</p>
<p>Y si la web es una tienda (o sitio corporativo de una física), apunta otra obligación que no estaba hace nada, y que desde el 19 de junio de 2026 está en vigor en toda la UE el <strong>desistimiento digital</strong>, la Directiva 2023/2673, que exige <strong>que el cliente pueda desistir de su compra tan fácil como la hizo, con un botón o formulario claro</strong>, respetando los 14 días y con las exclusiones del artículo 16 bien marcadas, que es lo que por ley no admite devolución.</p>
<p><strong>Comprobar que ese mecanismo existe y que funciona es tan parte de la auditoría legal como el banner de cookies</strong>, y lo verás de verdad al hacer el pedido de prueba del bloque de tienda. Te lo cuento a fondo en la guía del <a href="https://ayudawp.com/desistimiento-ue-woocommerce/" target="_blank" rel="ugc noopener">derecho de desistimiento en WooCommerce</a>.</p>
<p>Para cumplirlo ya hay varios plugins de botón de desistimiento en el repositorio, pero ninguna cumplía del todo así que preparé uno que sí, gratis como siempre, <strong><a href="https://es.wordpress.org/plugins/eu-withdrawal-compliance/" target="_blank" rel="nofollow noopener">EU Withdrawal Compliance</a></strong>, que añade la función de desistimiento, guarda un recibo con hash SHA-256, incluye el formulario modelo del anexo I.B y te deja marcar las exclusiones del artículo 16 por producto y por categoría, <strong>con o sin WooCommerce</strong>.</p>
<p>La accesibilidad tampoco es ya cosa de buenos samaritanos, la <strong>Ley Europea de Accesibilidad</strong> está en vigor desde junio de 2025 y obliga a la mayoría de webs comerciales, así que en una auditoría de 2026 hay que mirarla, aunque sea por encima.</p>
<p>No toca hacer aquí una auditoría WCAG completa, pero sí un primer barrido de <strong>lo fundamental</strong>, o sea contraste suficiente, textos alternativos en las imágenes, que se pueda navegar con el teclado, formularios con sus etiquetas y que no haya barreras evidentes.</p>
<p>Para ese primer barrido tienes el <a href="https://herramientas.ayudawp.com/accesibilidad/" target="_blank" rel="ugc noopener">analizador de accesibilidad web</a> de mis herramientas, que revisa la web según las pautas WCAG y te dice qué falla.</p>
<p><strong>Eso sí, ninguna herramienta automática detecta más que una parte de los problemas de accesibilidad</strong>, así que lo que salga limpio ahí todavía necesita una revisión a mano, igual que pasa con cualquier análisis automático frente a una auditoría manual.</p>
<p>Y una última de tienda, fundamental si ofreces rebajas, descuentos, ofertas o como lo llames. Me refiero a la <strong>directiva Omnibus</strong>, que <strong>obliga a mostrar el precio más bajo de los últimos 30 días junto al precio rebajado</strong>. El clásico «antes 50 €, ahora 30 €» sin ese dato incumple, y es sancionable.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Cookies y rastreadores cargando antes del consentimiento</strong>: el hallazgo RGPD más frecuente y el más fácil de demostrar por cualquiera que reclame.</li>
<li><strong>Sin textos legales</strong>, o textos de otra web con nombres de empresa ajenos aún dentro.</li>
<li><strong>Formularios</strong> que recogen datos personales sin información ni aceptación alguna.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Banner sin opción de rechazo</strong> al mismo nivel que la aceptación.</li>
<li><strong>Fuentes de Google y recursos de terceros</strong> cargando en remoto sin consentimiento.</li>
<li><strong>Consent Mode v2 ausente</strong> usando Google Analytics o Ads con público europeo.</li>
<li><strong>Nadie sabe qué encargados del tratamiento hay</strong> (hosting, CDN, email marketing) ni dónde se firmaron los contratos de encargo.</li>
<li><strong>Formularios, registro o pago sin prueba del consentimiento</strong>: la casilla marcada, pero sin el registro con fecha, IP, texto y versión que exige el artículo 7.1 para poder demostrarlo.</li>
<li><strong>Tienda sin mecanismo de desistimiento</strong> accesible, o sin las exclusiones del artículo 16 marcadas, con la obligación de la Directiva 2023/2673 ya en vigor.</li>
<li><strong>Barreras de accesibilidad</strong> que incumplen la Ley Europea de Accesibilidad: contraste insuficiente, imágenes sin texto alternativo, navegación imposible con teclado o formularios sin etiquetas.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Política de cookies desactualizada respecto a las cookies que la web pone en realidad: toca inventario y puesta al día.</li>
<li>Solicitudes de permisos del navegador (geolocalización, notificaciones) disparadas nada más cargar la página: además de molestas, difíciles de justificar.</li>
<li>Rebajas sin mostrar el precio más bajo de los últimos 30 días que exige la directiva Omnibus.</li>
</ul>
<h2>Tienda online</h2>
<p>Si no hay tienda salta este bloque, y si la hay redobla la atención, porque <strong>aquí ya no auditas una web, auditas una caja registradora, y cada fallo tiene un coste que se mide en pedidos perdidos</strong>, no en puntuaciones de herramienta.</p>
<p>La primera revisión es el estado de WooCommerce Estado (<code>WooCommerce → Estado</code>), que por sí solo te dice la <strong>versión y base de datos de WooCommerce, plantillas sobreescritas obsoletas</strong> (lo vimos a fondo en la guía de temas) y el <strong>estado de HPOS, el almacenamiento de pedidos en tablas propias</strong> que ya es el modo por defecto en instalaciones nuevas.</p>
<p>Si la tienda sigue en modo antiguo, o peor, en modo compatibilidad con sincronización eterna, hay que averiguar qué plugin lo está impidiendo y <strong>valorar la migración con calma</strong> y en staging.</p>
<p>La segunda <strong>revisión obligatoria es hacer una compra, de verdad</strong>, del principio al final, probando el modo sandbox de la pasarela o producto de prueba de un céntimo, pero completa.</p>
<p>Esta es la única forma de saber si el checkout funciona, si hay errores de JavaScript en consola a mitad de proceso, si los impuestos cuadran y, atención a esta, <strong>si los correos del pedido llegan al cliente y a la tienda</strong>, que enlaza con el SPF y el SMTP que auditaste en el bloque de servidor.</p>
<p>Y ya que estás dentro del proceso, <strong>comprueba también si hay mecanismo de desistimiento</strong> como vimos antes en el bloque de legalidad, porque es aquí, con la compra hecha, donde se ve de verdad si el cliente puede ejercer su derecho con la misma facilidad con la que ha pagado.</p>
<p>Aprovecha para revisar las pasarelas de pago, con las claves de producción donde haga falta y que no haya ningún modo de pruebas olvidado desde el lanzamiento, que haberlos haylos.</p>
<p>Y la tercera es el <strong>programador de acciones</strong> (la cola de tareas internas de WooCommerce), que se revisa en <code>WooCommerce → Estado → Acciones programadas</code>. Te puedes encontrar con <strong>decenas de miles de acciones fallidas o pendientes acumuladas</strong>, que pueden ser síntoma de algo roto por debajo, pero siempre son <strong>lastre para la base de datos</strong>. Si se desmadra (que lo hará) ten siempre a mano <a href="https://es.wordpress.org/plugins/easy-actions-scheduler-cleaner-ayudawp/" target="_blank" rel="nofollow noopener">el plugin para limpiar las acciones programadas innecesarias</a>.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Pasarela en modo de pruebas en producción</strong>, o claves de test y producción mezcladas: pedidos que parecen cobrados y no lo están.</li>
<li><strong>Correos transaccionales que no llegan</strong>: pedidos a ciegas para el cliente y para la tienda.</li>
<li><strong>Pago con errores de JavaScript o pasos rotos en móvil</strong>: dinero saliéndose por el desagüe cada día que pasa.</li>
<li><strong>Plugins clave de la tienda incompatibles con HPOS</strong> consultando pedidos a la antigua: roturas silenciosas ya o en la próxima actualización.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Plantillas de WooCommerce sobreescritas</strong> varias versiones por detrás.</li>
<li><strong>Programador de acciones</strong> con miles de tareas fallidas o pendientes sin explicación.</li>
<li><strong>Impuestos mal configurados o precios sin coherencia</strong> entre ficha, carrito y checkout.</li>
<li><strong>Webhooks de integraciones</strong> (ERP, email marketing, envíos) fallando en silencio.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Checkout con campos innecesarios y distracciones: mejora de conversión a proponer, no urgencia técnica.</li>
<li>Pedidos de prueba y datos de desarrollo aún en la base de datos de producción.</li>
</ul>
<p>Para terminar, repasa la sección anterior sobre legalidad, porque en tiendas la cosa está cargadita, y las sanciones son tremendas.</p>
<h2>Multisitio: auditar una red no es auditar una web</h2>
<p>Si el sitio es una instalación normal sáltate este bloque. Y si es una red multisitio, prepárate, porque <strong>una red no es un área más que auditar, es un modo que cambia cómo auditas todo lo anterior</strong>.</p>
<p>Aquí <strong>varios sitios comparten una sola instalación de WordPress, la misma base de datos, los mismos archivos de plugins y temas y, muchas veces los mismos usuarios</strong>, así que un fallo en un rincón puede llevarse la red entera por delante.</p>
<p>Lo primero es tener claro qué está compartido, porque ahí viven casi todos los riesgos.</p>
<p><strong>El código es común</strong>, o sea que una vulnerabilidad en un plugin o un tema no afecta a un sitio, afecta a todos a la vez. <strong>Los usuarios también son comunes</strong>, porque la tabla <code>wp_users</code> es única para toda la red, y <strong>una inyección SQL</strong> en el sitio más tonto puede exponer los usuarios y las contraseñas de todos, superadministradores incluidos.</p>
<p>Las subidas van a una carpeta compartida, <code>/wp-content/uploads/sites/ID/</code>, donde un archivo malicioso colado en un sitio vive pared con pared con el resto. El caso de manual que se repite es justo ese, un PHP colado en uploads, la tabla de usuarios volcada, una contraseña débil de superadmin reventada y puerta trasera en toda la red en una tarde.</p>
<p>Por encima de todo está el superadministrador, que en una red es el modo dios, pues crea y borra sitios, instala plugins y temas para todos y gestiona a cualquier usuario.</p>
<p>Así que la primera pregunta de la auditoría es <strong>cuántos superadmins hay</strong> (lo razonable son tres o menos), si alguno es en realidad un cliente que no debería serlo, si todos tienen 2FA y si sigue en el proyecto la gente que aparece en esa lista.</p>
<p>Sin tocar código, casi todo esto lo tienes en el escritorio de red, en <code>Mis sitios → Administrar red</code>. Ahí está la lista de sitios con su estado, los usuarios de toda la red, los plugins y temas disponibles y la pantalla de actualizaciones.</p>
<p>Con eso auditas la red sin abrir una consola. Con WP-CLI, <code>wp site list</code> te saca todos los sitios con su ID y su URL, <code>wp user list --network</code> los usuarios, y para actuar sobre un sitio concreto le añades <code>--url=</code> a cualquier comando. Tras actualizar el núcleo, no olvides <code>wp core update-db --network</code>, que pone al día la base de datos de todos los sitios de golpe.</p>
<p>Dos cosas más que la red cambia respecto a un sitio suelto. Una es que <strong>una actualización toca todos los sitios a la vez</strong>, así que el staging deja de ser recomendable y pasa a ser obligatorio, porque una incompatibilidad no rompe un sitio, rompe la red.</p>
<p>La otra es que los recursos del servidor son compartidos, de modo que un pico de tráfico o un plugin desbocado en un solo sitio degrada a todos los demás, que es justo lo del bloque de picos de tráfico pero multiplicado.</p>
<p>En lo relativo a la seguridad en redes multisitio la regla de oro es activar en red solo lo imprescindible, porque <strong>cada plugin activado en red se ejecuta en todos los sitios en cada carga</strong>, y lo demás actívalo sitio a sitio.</p>
<p>Lo que pongas de seguridad, o sea cortafuegos, bloqueo de ejecución de PHP en uploads, escaneo de integridad y registro de actividad, compruébalo antes en un plugin que sea compatible con multisitio, que muchos no lo son.</p>
<p>Vigilante, por ejemplo, funciona en red, aunque con ajustes independientes por sitio y sin un panel único que lo gobierne todo de golpe, así que aseguras cada sitio pero lo configuras uno a uno. Hay modos de hacerlo desde un panel único pero mi consejo es que mientras sea manejable gestiones la seguridad sitio a sitio.</p>
<h3>Crítico</h3>
<ul>
<li><strong>Superadmins de más</strong>, alguno que es un cliente, o cuentas de superadmin activas de gente que ya no está: en una red, cada una es la llave maestra de todo.</li>
<li><strong>Ejecución de PHP habilitada en la carpeta de subidas compartida</strong>: la vía más habitual para plantar una puerta trasera que afecta a toda la red desde un solo sitio.</li>
<li><strong>Un plugin o un tema con vulnerabilidad conocida activo en la red</strong>: no es un sitio en riesgo, son todos a la vez.</li>
</ul>
<h3>Importante</h3>
<ul>
<li><strong>Plugins activados en red que solo usa un sitio</strong>: peso y superficie de ataque en todos los demás sin ningún motivo.</li>
<li><strong>Prefijo de tablas <code>wp_</code> por defecto y un único usuario de base de datos con permisos de sobra</strong>: facilita el salto de un sitio comprometido al resto.</li>
<li><strong>Sin registro de actividad en los sitios de la red</strong>: aunque casi ningún plugin ofrezca todavía un panel único para toda la red, cada sitio debería al menos registrar su actividad para saber qué pasó y quién lo hizo.</li>
<li><strong>Actualizaciones de red aplicadas sin staging</strong> previo.</li>
</ul>
<h3>Menor</h3>
<ul>
<li>Sitios de la red archivados, marcados como spam o de prueba que nadie ha limpiado: ruido que conviene revisar y retirar.</li>
<li>Copias de seguridad por sitio en lugar de una copia de toda la red: en multisitio se respalda la instalación completa, no las tablas de un sitio suelto.</li>
</ul>
<h2>El informe</h2>
<p>Una auditoría que termina en una lista de 200 problemas (o más) sin orden ni contexto no sirve para nada, o peor, sirve para asustar al cliente y que no contrate ninguna solución.</p>
<p><strong>El valor de una auditoría web no está en encontrar fallos sino en convertirlos en un plan que alguien pueda aprobar</strong>, y para eso el informe necesita tres cosas: prioridades, evidencias y separación clara entre lo urgente y lo deseable.</p>
<p>Las prioridades ya las traes hechas, porque los tres niveles de cada bloque trasladan directos al plan de trabajo:</p>
<ul>
<li><strong>Lo crítico se corrige antes de cualquier otra cosa</strong> (y si asumes el mantenimiento, antes de considerar la web «bajo tu responsabilidad»)</li>
<li><strong>Lo importante se planifica</strong> en la próxima actuación o antes de la siguiente versión mayor de WordPress o PHP</li>
<li><strong>Lo menor se documenta</strong> para resolverlo cuando se pase por ese código o esa configuración por otra razón.</li>
</ul>
<p>Deja evidencia de todo, con capturas de cada hallazgo (en lo posible), su dato o su URL. No por desconfianza, sino porque dentro de seis meses nadie recordará por qué se decidió algo, y el informe es la memoria del proyecto.</p>
<p>Este esquema, por cierto, no me lo he inventado para el artículo, <strong>es el mismo que uso en los informes iniciales <a href="https://ayudawp.com/necesidad-mantenimiento-web/" target="_blank" rel="noopener">cuando asumo el mantenimiento de una web</a></strong>, con la situación previa área por área y las soluciones en dos listas separadas, las inmediatas que se aplican de oficio (copia de seguridad, monitorización, actualizaciones seguras) y las <strong>propuestas que requieren aprobación o presupuesto</strong>.</p>
<p>Y una recomendación de cierre para el documento es que escribas la parte de conclusiones en el idioma del cliente, no en el tuyo. «El autoload de wp_options pesa 9 MB» no significa nada para quien firma las facturas, pero «tu web carga en cada visita varios <em>megas</em> de imágenes, y tus clientes pueden abandonar la web si tarda más de 3 segundos» sí.</p>
<h2>Herramientas gratuitas</h2>
<p>Las herramientas de diagnóstico que han ido apareciendo por el artículo, y más, las tienes en <a href="https://herramientas.ayudawp.com/" target="_blank" rel="ugc noopener">herramientas.ayudawp.com</a>: el análisis de seguridad externo, el analizador de visibilidad IA, el de límites de rastreo, el analizador de accesibilidad web y la auditoría de temas para documentar hallazgos e imprimir el informe.</p>
<p>Allí tienes también unos cuantos generadores que te vendrán genial cuando toque corregir lo encontrado, como el de cabeceras de seguridad, el de <code>wp-config.php</code>, el de <code>.htaccess</code>, el de <code>robots.txt</code> o el de <code>security.txt</code>, además del optimizador de imágenes, pero eso ya es otra fase y otro artículo. Son gratuitas, en español, sin registro y funcionando en tu navegador.</p>
<p>Además, luego tienes <strong>plugins que considero imprescindibles</strong>, y te resumo:</p>
<ul>
<li><strong>Seguridad</strong>: <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a> o All in one security</li>
<li><strong>SEO</strong>: <a href="https://es.wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="nofollow noopener">Visibility</a> o The SEO Framework</li>
<li><strong>Visibilidad IA</strong>: <a href="https://es.wordpress.org/plugins/vigia/" target="_blank" rel="nofollow noopener">VigIA</a>, <a href="https://es.wordpress.org/plugins/ai-share-summarize/" target="_blank" rel="nofollow noopener">AI Share &amp; Summarize</a>, <a href="https://es.wordpress.org/plugins/ai-content-signals/" target="_blank" rel="nofollow noopener">AI Content Signals</a>, <a href="https://es.wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="nofollow noopener">Visibility</a></li>
<li><strong>Rendimiento y velocidad de carga</strong>: <a href="https://es.wordpress.org/plugins/wpo-tweaks/" target="_blank" rel="nofollow noopener">DietPress</a>, <a href="https://ayudawp.com/query-monitor/" target="_blank" rel="ugc noopener">Query Monitor</a>, <a href="https://ayudawp.com/optimizar-consultas-sql/" target="_blank" rel="ugc noopener">WP Crontrol</a></li>
<li><strong>Tienda online</strong>: <a href="https://es.wordpress.org/plugins/easy-actions-scheduler-cleaner-ayudawp/" target="_blank" rel="nofollow noopener">Easy Action Scheduler Cleaner</a></li>
<li><strong>RGPD / Legal</strong>: <a href="https://es.wordpress.org/plugins/eu-withdrawal-compliance/" target="_blank" rel="nofollow noopener">EU Withdrawal Compliance</a>, <a href="https://es.wordpress.org/plugins/terms-conditions-consent-log/" target="_blank" rel="nofollow noopener">Terms &amp; Conditions Consent Log</a>, <a href="https://ayudawp.com/plugin-consentimientos-rgpd-cookies-casi-perfecto/" target="_blank" rel="ugc noopener">un buen plugin de gestión de cookies</a></li>
</ul>
<h3>Prompts de IA útiles en auditorías</h3>
<p>La IA no sustituye las comprobaciones en tiempo real ni las herramientas especializadas, pero <strong>traduce y prioriza a una velocidad que compensa usarla en cada auditoría</strong>.</p>
<p><strong>Para traducir la salud del sitio</strong> (pega el texto del informe que genera WordPress en «Herramientas → Salud del sitio → Información», botón de copiar al portapapeles):</p>
<pre>Este es el informe de Salud del sitio de un WordPress. Explícame en términos simples qué problemas hay, cuáles son graves y en qué orden los resolverías. No asumas que sé de servidores.</pre>
<p><strong>Para las cabeceras de seguridad</strong> (pega la respuesta de <code>curl -I https://laweb.com</code> o las cabeceras que muestra cualquier herramienta externa):</p>
<pre>Estas son las cabeceras HTTP de una web WordPress. Dime qué cabeceras de seguridad faltan, cuáles están mal configuradas y qué riesgo real supone cada ausencia. Ordena por importancia.</pre>
<p><strong>Para el borrador del informe al cliente</strong> (pega tu lista de hallazgos técnicos):</p>
<pre>Estos son los hallazgos técnicos de una auditoría WordPress clasificados en Crítico, Importante y Menor. Redacta un resumen ejecutivo de una página para un cliente sin conocimientos técnicos: qué pasa, qué riesgo tiene y qué propongo hacer, sin tecnicismos y sin dramatismo.</pre>
<p>Para profundizar aún más pasa <strong>Claude Code sobre la carpeta wp-content</strong> con una instrucción inicial que le pida clasificar hallazgos por gravedad te da un primer mapa priorizado del código en minutos. Con la misma limitación de siempre, que conviene no olvidar, y es que <strong>la IA analiza código estático, no ejecución</strong>, así que Query Monitor, los logs y las compras de prueba siguen siendo insustituibles.</p>
<h2>¿Cada cuánto repetir todo esto?</h2>
<p>La auditoría es una foto, y las webs se mueven. La cadencia que a mí me funciona con las webs que mantengo:</p>
<ul>
<li><strong>Completa</strong>: al asumir una web nueva, siempre, y después una vez al año, porque lo que era Menor el año pasado puede haberse convertido en Crítico si el ecosistema avanzó y la web no.</li>
<li><strong>Seguridad</strong>: revisión mensual apoyada en alertas automáticas de vulnerabilidades para los plugins instalados, con Vigilante avisando de cambios en archivos entre revisión y revisión.</li>
<li><strong>Rendimiento</strong>: tras cualquier cambio grande (tema nuevo, migración, campaña con tráfico fuerte) y un vistazo trimestral a los datos de campo.</li>
<li><strong>Con cada versión mayor de WordPress o PHP</strong>: repaso de compatibilidad en staging antes de actualizar producción.</li>
</ul>
<p>Y si todo esto te parece sensato pero no tienes cuándo hacerlo, te viene grande o prefieres derivar responsabilidades, para eso existe <a href="https://mantenimiento.ayudawp.com" target="_blank" rel="ugc noopener">mi servicio de mantenimiento web</a>, donde la auditoría inicial, las revisiones y el informe mensual van de serie, es literalmente lo que hacemos cada día.</p>
<p>Si haces tu primera auditoría con esta guía me encantará saber <strong>cómo te ha ido, qué te has encontrado y qué echas en falta</strong>, y si auditas webs a menudo seguro que tienes revisiones propias que aquí no están, para todo eso, incluso para debatir, me tienes ahí abajo, en la sección de comentarios.</p>
<p>La próxima web que te llegue sin documentación ya no te va a pillar a ciegas, pero sobre todo tendrás una lista de por dónde empezar, por lo menos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/auditar-web-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Es peligroso eso del unfiltered_html?</title>
		<link>https://ayudawp.com/unfiltered_html/</link>
					<comments>https://ayudawp.com/unfiltered_html/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 13 Jul 2026 06:28:39 +0000</pubDate>
				<category><![CDATA[Programación + WordPress]]></category>
		<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Multisitio]]></category>
		<category><![CDATA[Vigilante]]></category>
		<category><![CDATA[wp-config.php]]></category>
		<category><![CDATA[XSS]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159874</guid>

					<description><![CDATA[En WordPress cualquier administrador o editor puede meter HTML y JavaScript sin filtrar dentro de una entrada, y eso incluye un script que se ejecuta en el navegador de cada visitante. No es un fallo, es una capacidad que viene de serie, se llama unfiltered_html.]]></description>
										<content:encoded><![CDATA[<p><strong>En WordPress cualquier administrador o editor puede meter HTML y JavaScript sin filtrar</strong> dentro de una entrada, y eso incluye un <code>&lt;script&gt;</code> que se ejecuta en el navegador de cada visitante. No es un fallo, <strong>es una capacidad que viene de serie</strong>, se llama <code>unfiltered_html</code>, y la buena noticia es que, si quieres, porque tiene sus cosas, se corta con una sola línea en el <code>wp-config.php</code>.</p>
<p>Vamos a verlo, porque tiene más miga de la que parece.</p>
<h2>Para empezar ¿qué es eso del unfiltered_html y qué hace?</h2>
<p><strong>WordPress filtra el HTML que guardas en las entradas</strong> con una función llamada <code>wp_kses</code>, que viene a ser el segurata que decide qué tags pasan y cuáles no, y por eso un suscriptor o un colaborador no puede colarte un <code>&lt;script&gt;</code> ni un <code>&lt;iframe&gt;</code> raro. Hasta ahí bien.</p>
<p>El problema es quién se puede saltar esa medida de seguridad. En una instalación normal, de un solo sitio, <strong>los administradores y los editores tienen la capacidad <code>unfiltered_html</code>, que les deja escribir el HTML que les dé la gana, sin filtrar ninguno</strong>. Lo que teclean va directo a la base de datos tal cual, scripts incluidos.</p>
<blockquote><p>Si tienes una red multisitio con WordPress la cosa cambia, porque ahí solo los superadministradores la tienen, ni siquiera los administradores de cada subsitio. Así que este truco va sobre todo para las webs de un solo sitio, que son la mayoría.</p></blockquote>
<p>¿Que esto es teórico? Ni de lejos. Ya conté en su día una <a href="https://ayudawp.com/vulnerabilidad-seguridad-divi-extra/" target="_blank" rel="ugc noopener">vulnerabilidad en Divi, Extra y Divi Builder</a> por la que usuarios de perfil bajo, como un simple autor, podían usar HTML sin filtrar en el contenido cuando editaban con el maquetador, justo lo que se supone que solo pueden hacer los administradores, lo que sería un escalado de privilegios de manual.</p>
<h2>Por qué es un problema de seguridad, y no de confianza</h2>
<p><strong>El riesgo no es que tu editor sea mala gente, es que alguien se haga con su cuenta</strong>. Una contraseña reutilizada que aparece en una filtración, un phishing bien montado o un plugin comprometido que escala permisos, y de repente alguien tiene entre manos una cuenta con <code>unfiltered_html</code>.</p>
<p>Con esa cuenta no necesita romper nada, le basta con editar una entrada, pegar un <code>&lt;script&gt;</code> que robe cookies de sesión o redirija a los visitantes, guardar y a correr. Es <a href="https://ayudawp.com/ataques-xss-wordpress/" target="_blank" rel="ugc noopener">XSS almacenado</a>, del que <strong>se queda en tu base de datos y se ejecuta en el navegador de cada persona que abre esa página, tú incluido</strong> cuando entras al escritorio.</p>
<h2>Mira qué fácil es impedir el unfiltered_html</h2>
<p>La parte buena de todo esto es que el problema, que lo puede ser, se arregla simplemente definiendo una constante en el <code>wp-config.php</code>. Ábrelo por FTP o desde el gestor de archivos de tu hosting y añade esta línea antes de la que dice <code>/* That's all, stop editing! Happy publishing. */</code>:</p>
<pre>define( 'DISALLOW_UNFILTERED_HTML', true );</pre>
<p>Y ya está. A partir de ahí <strong>WordPress le quita la capacidad a todo el mundo, administradores y superadministradores incluidos</strong>, y todo lo que se guarde pasa por el filtro <code>wp_kses</code> como si lo escribiera un colaborador cualquiera. Ya no puedes meter una etiqueta <code>&lt;script&gt;</code>.</p>
<p>Para comprobar que funciona entra como administrador, mete un bloque de HTML personalizado con un <code>&lt;script&gt;alert(1)&lt;/script&gt;</code> dentro, guarda y recarga. Si la constante está bien puesta, el script habrá desaparecido solo.</p>
<h2>¿Se rompe algo si quito el unfiltered_html?</h2>
<p>Esto no es gratis del todo,porque al capar el HTML sin filtrar <strong>WordPress también va a vaciar cosas seguramente normales que metas a mano como código</strong>, como un <code>&lt;iframe&gt;</code> de un mapa pegado en un bloque de HTML personalizado, un incrustado manual, un script de seguimiento que colabas en una entrada concreta, o ciertos atributos que <code>wp_kses</code> no admite por defecto.</p>
<p>Y luego hay otro efecto colateral, y es que <strong>desaparece también la opción de CSS adicional del personalizador</strong>. WordPress usa la capacidad <code>edit_css</code> para ese cuadro donde escribes CSS, y esa capacidad está enganchada por dentro a <code>unfiltered_html</code>, así que al desactivar una te llevas la otra por delante.</p>
<p>Lo mismo pasa con el CSS personalizado del editor de sitio en los temas de bloques. Si metes tus estilos por ahí tenlo claro antes de activar la constante.</p>
<p>Entonces, ¿cuándo la activo?</p>
<ul>
<li><strong>Sí, sin pensarlo</strong>, si tienes varios redactores, editores o autores, o si mantienes webs de clientes donde no controlas quién toca qué. El riesgo de una cuenta comprometida pesa mucho más que la comodidad de pegar un iframe de vez en cuando.</li>
<li><strong>Con cuidado, o mejor no</strong>, si eres el único que edita, metes HTML crudo por el editor a menudo o dependes del CSS adicional del personalizador. En ese caso tienes salidas más finas.</li>
</ul>
<p>Sí, hay otras maneras de protegerte sin hacerlo a la brava, para este segundo caso. Una es que en vez de capárselo a todos con la constante, quites la capacidad solo a los perfiles que no la necesitan, como editores y autores, con un filtro sobre <code>map_meta_cap</code>, y dejársela a los administradores. Solo tendrías que añadir un código como este:</p>
<pre>/* Filtrar el HTML sin filtrar solo a los que no son administradores */
add_filter( 'map_meta_cap', 'ayudawp_limitar_unfiltered_html', 10, 3 );
 
function ayudawp_limitar_unfiltered_html( $caps, $cap, $user_id ) {
 
	// Solo actuamos sobre la capacidad de HTML sin filtrar
	if ( 'unfiltered_html' === $cap ) {
 
		// Leemos los datos del usuario directamente para no provocar
		// una llamada recursiva a este mismo filtro, como pasaría con user_can()
		$user = get_userdata( $user_id );
 
		// Si no es administrador (no tiene manage_options), se la denegamos
		if ( ! $user || empty( $user-&gt;allcaps['manage_options'] ) ) {
			$caps = array( 'do_not_allow' );
		}
	}
 
	return $caps;
}</pre>
<p>Con esto <strong>los administradores siguen metiendo el HTML que quieran y a los editores se les filtra igual que a un colaborador</strong>, sin tocar el <code>wp-config.php</code> ni llevarte por delante el CSS adicional del personalizador. Y si lo que buscas es que tus redactores no puedan ni acercarse al HTML a mano, tienes el otro camino, <a href="https://ayudawp.com/desactivar-editor-codigo-html/" target="_blank" rel="ugc noopener">desactivar el editor de código del editor de bloques</a>. Depende de cómo trabajéis.</p>
<h2>No te relajes que eso no es todo, aun te pueden colar código</h2>
<p>La constante cierra la puerta del editor, que es la más grande, pero no es la única. <strong>Un plugin con una vulnerabilidad de XSS, un comentario mal filtrado o un formulario pueden colar un script por otro lado</strong>, y ahí esta línea no llega.</p>
<p>Para eso está la <strong>cabecera Content-Security-Policy (CSP), que es la que de verdad frena que un script se ejecute aunque haya conseguido meterse en tu base de datos</strong>.</p>
<p>Si tu política solo permite ejecutar JavaScript de tu propio dominio, el <code>&lt;script&gt;</code> del atacante que apunta fuera se queda mirando. Es la defensa con más rentabilidad contra el XSS, como ya expliqué en la <a href="https://ayudawp.com/ataques-xss-wordpress/" target="_blank" rel="ugc noopener">guía de protección contra XSS</a>.</p>
<p>Cabeceras CSP las gestionan muchos plugins de seguridad, pero el más completo en este sentido es <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a>, que incluye incluso un comprobador de cabeceras. La idea es tener las dos capas trabajando juntas, la constante para que el script no entre por el editor y la CSP para que no se ejecute si entra por otro sitio.</p>
<h2>¿En qué quedamos, impido el unfiltered_html o no?</h2>
<p>Si en tu web publica más gente que tú, o llevas webs de clientes, la respuesta corta es sí. añade la línea al <code>wp-config.php</code> y te quitas de encima uno de los vectores de XSS más tontos y más habituales que hay. Pero administras y alimentas la web solo tú y usas el CSS adicional del personalizador o pegas iframes a mano, valora antes la alternativa de capárselo solo a ciertos perfiles.</p>
<p>Tienes más contexto en la <a href="https://ayudawp.com/constantes-de-wordpress/" target="_blank" rel="ugc noopener">lista completa de constantes de WordPress</a> por si quieres seguir apretando tuercas en el <code>wp-config.php</code>, y en la <a href="https://ayudawp.com/ataques-xss-wordpress/" target="_blank" rel="ugc noopener">guía de XSS</a> para montar la parte de la CSP como es debido.</p>
<p>¿Tú la tenías capada o acabas de descubrir que tus editores podían hacer esto? Me lo cuentas ahí abajo, en los comentarios … o no.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/unfiltered_html/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>