<?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>Fri, 13 Nov 2026 15:22:57 +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>#DoctorWordPress: qué es eso de la Secrets API y si sirve para algo</title>
		<link>https://ayudawp.com/doctorwordpress-que-es-eso-de-la-secrets-api-y-si-sirve-para-algo/</link>
					<comments>https://ayudawp.com/doctorwordpress-que-es-eso-de-la-secrets-api-y-si-sirve-para-algo/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Fri, 13 Nov 2026 15:22:57 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[#CrónicasWordPress]]></category>
		<category><![CDATA[#DoctorWordPress]]></category>
		<category><![CDATA[#TrucosWordPress]]></category>
		<category><![CDATA[Secrets API]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=161028</guid>

					<description><![CDATA[La Secrets API (API de secretos, si lo prefieres en cristiano) llega con WordPress 7.2, que sale el 8 de diciembre de 2026, y en el directo te conté qué hace, qué no hace y qué te conviene ir preparando ya.]]></description>
										<content:encoded><![CDATA[<p><!-- TÍTULO PROPUESTO: Secrets API de WordPress 7.2: ¿una caja fuerte para las claves de tus plugins? ¿mejora de verdad la seguridad? #DoctorWordPress --></p>
<p>La <strong>Secrets API</strong> (API de secretos, si lo prefieres en cristiano) llega con <strong>WordPress 7.2, que sale el 8 de diciembre de 2026</strong>, y en el directo te conté qué hace, qué no hace y qué te conviene ir preparando ya.</p>
<h3>Una caja fuerte para claves, tokens y contraseñas</h3>
<p>A ver, el problema de partida es viejo. Los plugins que se conectan a servicios externos (pasarelas de pago, servicios de correo, APIs de IA y compañía) guardan sus claves de API, tokens y contraseñas en la base de datos, y hasta ahora <strong>esas claves quedaban ahí a la vista, en texto plano</strong>.</p>
<p>Con la Secrets API, WordPress trae una especie de caja fuerte para que los plugins guarden esos datos cifrados. <strong>Si alguien se lleva una copia de tu base de datos, solo verá texto cifrado que no le sirve de nada.</strong> Y teniendo en cuenta la cantidad de copias de seguridad olvidadas y volcados SQL que andan por ahí sueltos, eso ya es mucho.</p>
<p>Ahora bien, no es magia y conviene no venirse arriba. <strong>No te protege de un plugin malicioso</strong>, que se ejecuta dentro de tu WordPress y puede leer lo mismo que lee cualquier otro plugin, <strong>ni de quien consiga a la vez la base de datos y el archivo wp-config.php</strong>. Es una capa más, de las buenas, pero una capa.</p>
<h3>La clave WP_SECRETS_KEY: se pone una vez y no se toca</h3>
<p>Todo el invento descansa en una constante, <code>WP_SECRETS_KEY</code>, que va en el archivo <code>wp-config.php</code>, fuera de la base de datos. La idea es sencilla: <strong>que quien robe una cosa no tenga también la otra</strong>, como quien guarda la llave de la caja fuerte en otra habitación (y no pegada con celo debajo de la caja).</p>
<p>Y ojo con esto, que es lo más importante del directo: <strong>esa clave se pone una vez y no se cambia nunca</strong>. Si la cambias o la pierdes, los secretos guardados no se pueden leer y tampoco se puede guardar nada nuevo. ¿La solución si ya la has liado?, pues volver a poner el valor anterior. Así que apúntala bien y no la regeneres alegremente como harías con las claves de seguridad de toda la vida.</p>
<h3>Qué cambia para los plugins</h3>
<p>Si te estás preguntando si ahora cada plugin te va a llenar el wp-config.php de constantes, pues no. <strong>En wp-config.php solo va WP_SECRETS_KEY, una por web</strong>, y los plugins guardan sus claves cifradas en la base de datos, en filas con el prefijo <code>_wp_secret_</code>.</p>
<p>Lo que no te voy a vender es que esto vaya a cambiar las cosas de un día para otro. Los plugins se irán adaptando poco a poco, y para que te hagas una idea, <strong>en la 7.2 ni siquiera los Conectores de IA de WordPress usan todavía la API</strong>.</p>
<p>Además, la 7.2 no trae pantalla para gestionar secretos (según la propuesta, llegará en la 7.3). Lo único que vas a ver está en <strong>Herramientas &gt; Salud del sitio</strong>, y los valores no se muestran en ninguna parte, que es justo lo que se espera de una caja fuerte.</p>
<h3>¿Tengo que hacer algo ya?</h3>
<p>Mi recomendación es que sí, que <strong>conviene añadir la constante ya</strong>. Sin ella, un plugin bien hecho seguirá guardando sus claves como hasta ahora, pero uno mal hecho puede fallar al guardar, y no te apetece descubrirlo justo cuando tu pasarela de pago deja de funcionar.</p>
<p>Tienes toda la información detallada en la guía que he publicado aquí: <a href="https://ayudawp.com/secrets-api/">Secrets API de WordPress</a>.</p>
<h2>Vídeo completo del #DoctorWordPress del 11 de noviembre</h2>
<p>Aquí tienes el directo entero, con la explicación de la Secrets API:</p>
<p><a href="https://www.youtube.com/watch?v=ByJvpxvTd6Y&amp;t=10s">Ver el #DoctorWordPress del 11 de noviembre de 2026 en YouTube</a></p>
<div class="ast-oembed-container " style="height: 100%;"><iframe title="¿Qué es la Secrets API de WordPress? ¿Mejora la seguridad de WordPress y los plugins?" width="1600" height="900" src="https://www.youtube.com/embed/ByJvpxvTd6Y?start=10&amp;feature=oembed&amp;enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<h2>Nos vemos en el próximo directo</h2>
<p>Te recuerdo que hago directo dos veces por semana, los <strong>lunes las #CrónicasWordPress</strong> con la actualidad, la opinión y el debate, y los <strong>miércoles el #DoctorWordPress</strong> con un truco y vuestras preguntas, a partir de las 19:30, hora española.</p>
<p>Si quieres asistir en directo y participar con tus preguntas, <a href="https://www.youtube.com/AyudaWordPressES?sub_confirmation=1">suscríbete al canal de Ayuda WordPress en YouTube</a>. Y si tienes tema para la próxima crónica o una duda para el doctor, me tienes ahí abajo, en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/doctorwordpress-que-es-eso-de-la-secrets-api-y-si-sirve-para-algo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Modo mantenimiento en WordPress: qué estado HTTP devuelve tu plugin y cómo corregirlo</title>
		<link>https://ayudawp.com/modo-mantenimiento-wordpress-503-retry-after/</link>
					<comments>https://ayudawp.com/modo-mantenimiento-wordpress-503-retry-after/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 12 Nov 2026 07:28:06 +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[503]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Mantenimiento]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160893</guid>

					<description><![CDATA[Qué estado HTTP devuelven siete plugins de mantenimiento en WordPress 7.1.4, qué dice Google del 503 y un código con Retry-After.]]></description>
										<content:encoded><![CDATA[<p>Un plugin de modo mantenimiento enseña un aviso a los visitantes, pero a Google le llega el código de estado HTTP de la respuesta. Si la página del aviso se sirve con un 200, el rastreador recibe una página normal con el texto «volvemos enseguida» en lugar del contenido de cada URL.</p>
<p><strong>Para las paradas cortas, Google documenta devolver un 503</strong> y, si se sabe cuánto va a durar, añadir la cabecera <code>Retry-After</code>. Lo que he hecho ha sido instalar nueve plugins de mantenimiento en un WordPress y medir la respuesta de siete, además de la del propio núcleo. Con el modo de mantenimiento de cada uno activado, cinco devuelven 503 en la portada, uno solo lo hace si se marca una casilla que viene desactivada y otro responde 200.</p>
<p>¿Quieres ver los detalles para así aprender algo por el camino?</p>
<h2>Qué pide Google y durante cuánto tiempo</h2>
<p>En la guía para <a href="https://developers.google.com/search/docs/crawling-indexing/reduce-crawl-rate" target="_blank" rel="nofollow noopener">reducir la frecuencia de rastreo</a> Google indica que, para una reducción urgente y breve (un par de horas o uno o dos días), el servidor puede responder con un 500, un 503 o un 429 en lugar de un 200. Con 503 y 429 admite también la cabecera <code>Retry-After</code>, que puede llevar un número de segundos (por ejemplo, <code>Retry-After: 120</code>) o una fecha y hora en UTC.</p>
<p>La página sobre <a href="https://developers.google.com/search/docs/crawling-indexing/pause-online-business?hl=es" target="_blank" rel="nofollow noopener">pausar o inhabilitar temporalmente un sitio web</a> recoge las prácticas para el caso de cerrar el sitio entero: una página informativa con un 503 en lugar del contenido, la mejor estimación de fecha o duración en <code>Retry-After</code>, HTML estático y una comprobación local con <code>curl</code>. También pide que el <code>robots.txt</code> siga permitiendo el rastreo y que no devuelva un 503, porque eso impediría todo el rastreo.</p>
<p><strong>Son respuestas pensadas para periodos cortos.</strong> Google desaconseja mantenerlas más de uno o dos días y avisa de que, si Googlebot las observa en la misma URL durante varios días, esa URL puede salir del índice. Para un cierre de unas semanas, la propia página advierte de que Google puede tener problemas para indexar el sitio y recomienda limitar sus funciones en lugar de cerrarlo.</p>
<h2>Qué hace WordPress por <del>su cuenta</del> nosotros</h2>
<p>Durante las actualizaciones, WordPress crea un archivo <code>.maintenance</code> en la raíz del sitio y, mientras exista, responde con un 503 y <code>Retry-After: 600</code>. En la instalación de pruebas (WordPress 7.1.4) la respuesta incluyó las cabeceras de no caché, llegó a <code>/</code>, <code>/wp-login.php</code>, <code>/wp-json/</code>, <code>/feed/</code> y <code>/robots.txt</code>, y bloqueó también a los administradores.</p>
<p>Según el código de <code>wp_is_maintenance_mode()</code>, el modo se da por terminado cuando la marca de tiempo del archivo tiene más de diez minutos. Eso ocurre con el número fijo que escribe WordPress. Si alguien crea el archivo a mano con <code>$upgrading = time();</code>, la condición no llega a cumplirse nunca y el 503 se mantiene hasta que se borra.</p>
<p>Hay una excepción que cambia el resultado, y es que si existe el archivo <code>wp-content/maintenance.php</code> WordPress lo carga y termina la ejecución sin enviar por su cuenta ningún código de estado ni cabecera.</p>
<p>En mis pruebas, con ese archivo presente y el <code>.maintenance</code> activo, la respuesta fue un 200 sin <code>Retry-After</code> y sin cabeceras de caché, así que quien utilice una página de mantenimiento propia por esta vía tiene que enviar él mismo el 503 y el <code>Retry-After</code> desde el archivo.</p>
<h2>Qué devuelve cada plugin</h2>
<p>Las pruebas está hechas en una instalación local con WordPress 7.1.4, Apache, PHP 8.5 y unos treinta plugins activos. Cada plugin se activó y se configuró desde su interfaz, con los ajustes por defecto salvo lo indicado, y las respuestas se pidieron como visitante anónimo, sin cookies y sin caché.</p>
<p>Minimal Coming Soon &amp; Maintenance Mode y Under Construction &amp; Maintenance Mode (distinto del Under Construction de la tabla) se instalaron, pero no se midieron.</p>
<table>
<caption>Respuesta de cada plugin con su modo de mantenimiento activado (visitante anónimo, WordPress 7.1.4)</caption>
<thead>
<tr>
<th>Plugin y modo</th>
<th>Portada</th>
<th>URL inexistente</th>
<th>Feed</th>
<th>Mapa del sitio</th>
<th><code>Retry-After</code></th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://es.wordpress.org/plugins/maintenance/" target="_blank" rel="nofollow noopener">Maintenance</a> 4.33, ajustes por defecto</td>
<td>200</td>
<td>no medido</td>
<td>200</td>
<td>200</td>
<td>no</td>
</tr>
<tr>
<td>Maintenance 4.33, con la casilla del 503</td>
<td>503</td>
<td>503</td>
<td>200</td>
<td>200</td>
<td>3600</td>
</tr>
<tr>
<td><a href="https://es.wordpress.org/plugins/wp-maintenance-mode/" target="_blank" rel="nofollow noopener">LightStart</a> 2.6.25</td>
<td>503</td>
<td>503</td>
<td>200</td>
<td>503</td>
<td>3600</td>
</tr>
<tr>
<td><a href="https://es.wordpress.org/plugins/under-construction-page/" target="_blank" rel="nofollow noopener">Under Construction</a> 5.83</td>
<td>200</td>
<td>200</td>
<td>200</td>
<td>200</td>
<td>86400 (con un 200)</td>
</tr>
<tr>
<td><a href="https://es.wordpress.org/plugins/wp-maintenance/" target="_blank" rel="nofollow noopener">WP Maintenance</a> 6.1.10.1</td>
<td>503</td>
<td>503</td>
<td>503</td>
<td>503</td>
<td>86400</td>
</tr>
<tr>
<td><a href="https://es.wordpress.org/plugins/cmp-coming-soon-maintenance/" target="_blank" rel="nofollow noopener">CMP</a> 4.1.22, modo «Coming Soon» (por defecto)</td>
<td>200</td>
<td>404</td>
<td>200</td>
<td>200</td>
<td>no</td>
</tr>
<tr>
<td>CMP 4.1.22, modo «Maintenance Mode»</td>
<td>503</td>
<td>503</td>
<td>200</td>
<td>503</td>
<td>86400</td>
</tr>
<tr>
<td><a href="https://es.wordpress.org/plugins/slim-maintenance-mode/" target="_blank" rel="nofollow noopener">Slim Maintenance Mode</a> 1.4.6</td>
<td>503</td>
<td>503</td>
<td>503</td>
<td>503</td>
<td>no</td>
</tr>
<tr>
<td><a href="https://es.wordpress.org/plugins/coming-soon/" target="_blank" rel="nofollow noopener">SeedProd</a> 6.20.11, modo de mantenimiento</td>
<td>503</td>
<td>503</td>
<td>503</td>
<td>503</td>
<td>86400</td>
</tr>
</tbody>
</table>
<ul>
<li>Tres configuraciones responden 200 en la portada: Maintenance con sus ajustes por defecto (el 503 es una casilla opcional), Under Construction y el modo «Coming Soon» de CMP, que es el que trae activado por defecto.</li>
<li>Slim Maintenance Mode devuelve 503 en todas las URL medidas, pero sin la cabecera <code>Retry-After</code>.</li>
<li>Under Construction envía <code>Retry-After: 86400</code> acompañando a un 200, una combinación que Google no documenta (en su guía la cabecera figura con 503 y 429). Además responde 200 en una URL que no existe y no envía cabeceras de no caché en la portada.</li>
<li>Con la portada en 503, Maintenance deja el feed y el mapa del sitio en 200, y LightStart y el modo Maintenance de CMP dejan el feed en 200. WP Maintenance, Slim y SeedProd responden 503 en las cuatro URL.</li>
<li>En todos los casos, <code>/wp-login.php</code> y <code>/robots.txt</code> respondieron 200. La situación del robots.txt se comenta más abajo.</li>
</ul>
<p>El 200 es lo esperable en una página de «próximamente» de un sitio sin publicar. Para una parada de mantenimiento de un sitio ya publicado, la documentación de Google apunta al 503.</p>
<h2>Cómo comprobar la respuesta de tu sitio</h2>
<p>La medición tiene que hacerse sin sesión iniciada y con una petición GET. <code>curl -I</code> envía una petición HEAD, y con algunos plugins el resultado cambia. Maintenance, con la casilla del 503 marcada, respondió 200 a HEAD y 503 a GET en la misma URL, porque muestra su aviso mediante el filtro <code>template_include</code> y WordPress corta las peticiones HEAD antes de llegar a él.</p>
<p>El ejemplo de la documentación de Google usa <code>curl -I -X GET</code>, que sí envía un GET (se comprobó contra un servidor local) y descarta el cuerpo de la respuesta.</p>
<p>Una forma equivalente, que imprime las cabeceras de una petición GET y descarta el cuerpo, es esta:</p>
<pre>curl -sS -D - -o /dev/null https://tudominio.com/</pre>
<p>Para repasar de una vez las URL que más se olvidan:</p>
<pre>for u in / /esta-url-no-existe/ /feed/ /wp-sitemap.xml /robots.txt; do
  echo "== $u"
  curl -sS -D - -o /dev/null "https://tudominio.com$u" | grep -i -E '^(HTTP|retry-after|cache-control)'
done</pre>
<p>En la salida deben aparecer la línea de estado (503 en las URL públicas y 200 en <code>/robots.txt</code>) y, si se ha configurado, la cabecera <code>Retry-After</code>.</p>
<h2>Un código para responder 503 sin plugins</h2>
<p>Para una parada corta, este <a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="noopener">mu-plugin</a> responde 503 con <code>Retry-After</code> a los visitantes que no son administradores y se activa o desactiva con una constante. Las pruebas se hicieron con las constantes definidas antes de la carga de los mu-plugins, lo que equivale a definirlas en el <code>wp-config.php</code>. Se guarda como <code>wp-content/mu-plugins/ayudawp-maintenance-503.php</code>.</p>
<pre>&lt;?php
/**
 * Plugin Name: 503 Retry-After
 * Plugin URI: https://plugins.ayudawp.com/
 * Description: Sirve un 503 con Retry-After a los visitantes mientras el sitio está en mantenimiento
 * Version: 1.0
 * Author: Fernando Tellado
 * Author URI: https://ayudawp.com/
 * License: GPLv2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * 
 */
 
/** 
 * Actívalo añadiendo esto en wp-config.php:
 *     define( 'AYUDAWP_MAINTENANCE', true );
 * Opcional: dile a los rastreadores cuándo esperas volver (marca temporal Unix):
 *     define( 'AYUDAWP_MAINTENANCE_UNTIL', strtotime( '2026-11-12 09:00:00 Europe/Madrid' ) );
 */

add_action( 'template_redirect', 'ayudawp_maintenance_503', 0 );

/**
 * Enviar un 503 con Retry-After a los visitantes que no sean admin
 *
 * @return void
 */
function ayudawp_maintenance_503() {
if ( ! defined( 'AYUDAWP_MAINTENANCE' ) || ! AYUDAWP_MAINTENANCE ) {
return;
}

// Permitir que los administradores naveguen por el sitio mientras está en mantenimiento
if ( current_user_can( 'manage_options' ) ) {
return;
}

// Segundos hasta el final esperado, o una hora por defecto (mínimo 60)
$retry_after = 3600;
if ( defined( 'AYUDAWP_MAINTENANCE_UNTIL' ) ) {
$retry_after = max( 60, (int) AYUDAWP_MAINTENANCE_UNTIL - time() );
}

nocache_headers();
header( 'Retry-After: ' . $retry_after );

wp_die(
'&lt;p&gt;Estamos haciendo tareas de mantenimiento. Volvemos en breve.&lt;/p&gt;',
'Mantenimiento',
array( 'response' =&gt; 503 )
);
}</pre>
<p>Con el código instalado salía esto:</p>
<ul>
<li>Sin la constante, o con ella en <code>false</code>, el sitio funciona con normalidad.</li>
<li>Con la constante activada, la portada, una URL inexistente, el feed y <code>/wp-sitemap.xml</code> respondieron 503 con <code>Retry-After</code> y cabeceras de no caché. Las peticiones HEAD recibieron lo mismo.</li>
<li>Con <code>AYUDAWP_MAINTENANCE_UNTIL</code> definida, el valor de <code>Retry-After</code> se recalcula en cada petición (con un fin previsto dentro de 30 minutos devolvió 1796) y nunca baja de 60. Con una fecha ya pasada devolvió 60.</li>
<li>Un admin con sesión iniciada ve el sitio normal.</li>
<li>Siguieron respondiendo como siempre <code>/wp-login.php</code>, <code>/wp-cron.php</code>, <code>admin-ajax.php</code>, <code>xmlrpc.php</code> y los archivos estáticos, porque el gancho <code>template_redirect</code> solo actúa sobre las páginas públicas.</li>
</ul>
<p><strong>El robots.txt merece una comprobación aparte.</strong> Con el código activo siguió respondiendo 200 en la instalación de pruebas, pero en <code>template-loader.php</code> de WordPress el gancho <code>template_redirect</code> se ejecuta antes de resolver el robots.txt virtual, por lo que en un sitio donde lo genere WordPress el código también le daría un 503, que es justo lo que Google pide evitar.</p>
<p>Para excluirlo se puede añadir esta condición al principio de la función. No se pudo probar en la instalación de pruebas, así que conviene verificar la respuesta con la orden de la sección anterior:</p>
<pre>if ( is_robots() ) {
	return;
}</pre>
<h2>La caché de página puede impedir que el 503 llegue</h2>
<p>Un plugin de caché con la portada ya almacenada puede servir la copia con un 200 antes de que WordPress ejecute ningún gancho. En la prueba con WP Super Cache en modo simple y la caché caliente, el código no alcanzó a la portada, que siguió respondiendo 200 desde la caché, y solo una URL que no estaba en caché devolvió el 503.</p>
<p>Tras vaciar la caché, el 503 con <code>Retry-After</code> se sirvió en tres peticiones seguidas y el plugin no lo almacenó. Al desactivar el modo, la portada volvió a responder 200 sin ningún 503 residual.</p>
<p>El <code>.maintenance</code> del núcleo, en cambio, se evalúa antes de cargar <code>advanced-cache.php</code> y devolvió el 503 con <code>Retry-After: 600</code> aunque la caché estuviera caliente. En la práctica, conviene vaciar la caché de página al activar el modo y comprobar la portada al desactivarlo. Con otros plugins de caché, caché de servidor o CDN el comportamiento no se probó.</p>
<h2>Qué no he comprobado</h2>
<p>Son pruebas a mi manera, intensitas, pero el mundo es grande y hay cosas a donde ni llego ni llegaré, y que debes saber.</p>
<ul>
<li>Es una sola instalación, con unos treinta plugins activos y las versiones indicadas en la tabla, muy top, muy exhaustivo, pero otro entorno u otra versión de un plugin pueden dar resultados distintos.</li>
<li>Recuerda que hay plugins instalados pero no medidos (Minimal Coming Soon &amp; Maintenance Mode y Under Construction &amp; Maintenance Mode), el modo «próximamente» de SeedProd, los modos de mantenimiento de Elementor y de WooCommerce («Coming soon») y los que incorporan algunos hostings.</li>
<li>La API REST bajo el código personalizado: en esa instalación <code>/wp-json/</code> ya respondía 401 a los visitantes anónimos antes de tocar nada, así que el resultado no permite concluir.</li>
<li>Los avisos de las pasarelas de pago de WooCommerce (<code>wc-api</code>), un CDN delante del sitio y las reglas en Apache o nginx. No me da la vida, pero lo pruebas y me cuentas.</li>
</ul>
<h2>Qué opción conviene según la duración de la parada de la web</h2>
<p>Por si tienes un poco de lío, tras todo lo visto esto es lo que he aprendido sobre qué usar según el tiempo que vaya a durar el parón de la web:</p>
<ul>
<li><strong>Unos minutos</strong>: el <code>.maintenance</code> del núcleo, que caduca solo a los diez minutos si contiene una marca de tiempo fija y no depende de ningún plugin.</li>
<li><strong>De una hora a uno o dos días</strong>: el código anterior o uno de los plugins de la tabla que, con la configuración elegida, devuelva 503 con <code>Retry-After</code>, revisando antes el feed, el mapa del sitio y el robots.txt.</li>
<li><strong>Más de dos días</strong>: Google recomienda limitar las funciones del sitio en lugar de cerrarlo.</li>
</ul>
<p>Es mi opinión, no lo tomes como una regla, te puede servir de referencia, pero sobre todo analiza todo lo visto en el artículo, revisa las pruebas que hice, porque cada caso es diferente. Y por supuesto, podemos charlar lo que quieras ahí abajo en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/modo-mantenimiento-wordpress-503-retry-after/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qué servidor MCP usar en WordPress: comparativa de MCP Adapter, Jetpack, WPVibe, Royal MCP, Easy MCP AI y Novamira</title>
		<link>https://ayudawp.com/servidor-mcp/</link>
					<comments>https://ayudawp.com/servidor-mcp/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 11 Nov 2026 07:28:02 +0000</pubDate>
				<category><![CDATA[IA + WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160867</guid>

					<description><![CDATA[Este artículo no explica qué es MCP ni cómo se instala el Adapter, lo que hago aquí es comparar las opciones disponibles actualmente, a partir de pruebas realizadas en una instalación local y en una web pública de pruebas.]]></description>
										<content:encoded><![CDATA[<p>Para <strong>conectar WordPress con un cliente de IA</strong> la opción más recomendable en la mayoría de casos es el MCP Adapter oficial combinado con las capacidades (<code>abilities</code>) que registran el núcleo y los plugins instalados, porque es la base del MCP que WordPress quiere incorporar al núcleo en la versión 7.3, eso sí, sin anestesia, para que no pienses que te hago esperar.</p>
<p>Y luego, hay <strong>alternativas que tienen sentido en situaciones concretas</strong>, como trabajar desde claude.ai o ChatGPT en el navegador, gestionar varias webs desde una misma cuenta o desarrollar en local, además de otras que no conviene usar en producción.</p>
<p><strong>Este artículo no explica qué es MCP ni cómo se instala el Adapter</strong>, temas que se tratan en la <a href="https://ayudawp.com/mcp-wordpress/" target="_blank" rel="ugc noopener">guía de MCP en WordPress</a>, <strong>lo que hago aquí es comparar las opciones disponibles</strong> actualmente, a partir de pruebas realizadas en una instalación local y en una web pública de pruebas, con usuarios creados a propósito, contraseñas de aplicación y conexiones reales desde Claude.</p>
<p>¿Te animas? Yo <strong>he aprendido mucho por el camino, y aquí te lo cuento todo</strong>.</p>
<h2>Criterios para elegir servidor MCP en WordPress</h2>
<p>Las opciones disponibles no hacen lo mismo, así que conviene tener claros cuatro factores antes de compararlos:</p>
<ul>
<li><strong>Cliente:</strong> Claude Desktop, Claude Code, Cursor o VS Code pueden conectar con métodos que no admiten claude.ai ni ChatGPT en el navegador. Estos últimos necesitan OAuth, lo que hoy impide conectar directamente el MCP Adapter.</li>
<li><strong>Intermediarios:</strong> en algunas opciones el cliente se comunica directamente con la web y en otras todo pasa por los servidores de un tercero, que en algún caso guarda las credenciales.</li>
<li><strong>Tipo de web:</strong> en una web local o de pruebas se pueden permitir cosas que en producción supondrían un riesgo, como que la IA ejecute PHP.</li>
<li><strong>Plugins instalados:</strong> si los plugins de la web registran <code>abilities</code> (WooCommerce, VigIA, Visibility, Jetpack, Elementor y otros), lo que puede hacer el agente depende mucho de la opción elegida, porque no todas acceden a ellas.</li>
</ul>
<h2>Comparativa rápida de servidores MCP para WordPress</h2>
<table>
<thead>
<tr>
<th>Opción</th>
<th>Webs locales</th>
<th><code>abilities</code> de los plugins</th>
<th>Por dónde pasan los datos</th>
<th>Desde claude.ai o ChatGPT en el navegador</th>
<th>Precio</th>
</tr>
</thead>
<tbody>
<tr>
<td>MCP Adapter + <code>abilities</code></td>
<td>Sí</td>
<td>Sí, las que cada plugin marca como públicas</td>
<td>Directamente entre el cliente y la web</td>
<td>No directamente (no tiene OAuth)</td>
<td>Gratis</td>
</tr>
<tr>
<td>MCP de WordPress.com con Jetpack</td>
<td>No</td>
<td>No</td>
<td>Por WordPress.com</td>
<td>Sí, con OAuth</td>
<td>Jetpack AI o Complete (gratis hasta el 30-11-2026)</td>
</tr>
<tr>
<td>WPVibe</td>
<td>No</td>
<td>Sí</td>
<td>Por los servidores de WPVibe, que guardan la contraseña de aplicación cifrada</td>
<td>Sí</td>
<td>Gratis hasta 300 llamadas cada 24 horas, de pago para más</td>
</tr>
<tr>
<td>Royal MCP</td>
<td>Sí</td>
<td>No comprobado</td>
<td>Directamente</td>
<td>Sí, con OAuth propio</td>
<td>Gratis (el escritorio anuncia un Pro que la ficha niega)</td>
</tr>
<tr>
<td>Easy MCP AI</td>
<td>Sí</td>
<td>Sí, seleccionándolas una a una</td>
<td>Directamente (descarga contenido de su servidor a diario)</td>
<td>Sí, con OAuth propio</td>
<td>Gratis en WordPress.org</td>
</tr>
<tr>
<td>Novamira</td>
<td>Sí</td>
<td>Sí, aunque no todas</td>
<td>Directamente</td>
<td>No comprobado</td>
<td>Libre (AGPL), con versión Pro de pago</td>
</tr>
</tbody>
</table>
<p>En las webs locales el «sí» se refiere a clientes que se ejecutan en el mismo ordenador (Claude Desktop, Claude Code, Cursor, VS Code…), ya que claude.ai o ChatGPT en el navegador no llegan a una web que no está publicada en internet. AI Engine no aparece en la tabla porque no se ha probado a fondo, y ya lo trato más adelante con los datos que ellos mismos dan.</p>
<h2>MCP Adapter con abilities, la vía oficial</h2>
<p>El <a href="https://es.wordpress.org/plugins/mcp-adapter/" target="_blank" rel="nofollow noopener">MCP Adapter</a> es parte del proyecto <a href="https://ayudawp.com/ai-building-blocks/" target="_blank" rel="ugc noopener">AI Building Blocks</a>, y el <strong>puente oficial entre las <code>abilities</code> de WordPress y cualquier cliente MCP</strong>. WordPress.org lo publica actualmente como <a href="https://ayudawp.com/plugin-canonicos/" target="_blank" rel="ugc noopener">plugin canónico</a>, tras pasar un periodo de crecimiento en GitHub, y a día de hoy supera las 60.000 instalaciones activas.</p>
<p>Por sí solo hace poco, porque su función es exponer lo que registran el núcleo y los plugins a través de la <a href="https://ayudawp.com/abilities-api/" target="_blank" rel="ugc noopener">Abilities API</a>. Por eso las comparativas que lo evalúan como una herramienta completa le dan puntuaciones muy bajas, algo que me parece realmente injusto, por su enorme importancia, y casi me hace pensar que hay gente que hace reseñas sin saber qué tiene entre manos. Pero seguimos…</p>
<h3>Resultado de <em>mis</em> pruebas</h3>
<p>En la instalación local, con 28 plugins activos y ningún otro servidor MCP, se activó únicamente el Adapter. El servidor por defecto (<code>/wp-json/mcp/mcp-adapter-default-server</code>) pasó a exponer 25 <code>abilities</code> (3 del núcleo, 9 de VigIA, 6 de Visibility y 7 de WooCommerce).</p>
<p>Entre las 7 de WooCommerce están borrar productos, actualizarlos y cambiar el estado de los pedidos. Aparecen aunque la casilla experimental de WooCommerce MCP esté desactivada, porque WooCommerce registra sus <code>abilities</code> siempre y las marca como públicas para MCP. En la práctica, al activar el Adapter queda disponible por MCP todo lo que los plugins marcan como público, sin aprobación individual.</p>
<p><img fetchpriority="high" decoding="async" class="sombra alignnone wp-image-160872 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/WordPress-abilities-mcp-adapter-1200x557.jpg" alt="" width="1200" height="557" srcset="https://ayudawp.com/wp-content/uploads/2026/11/WordPress-abilities-mcp-adapter-1200x557.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/WordPress-abilities-mcp-adapter-768x356.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/WordPress-abilities-mcp-adapter-1536x713.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/WordPress-abilities-mcp-adapter.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<p>Los permisos se comprueban en el momento de la ejecución. Con un usuario editor y su contraseña de aplicación, el descubrimiento mostraba las 25 <code>abilities</code>, pero las de VigIA, las de WooCommerce y la consulta del estado SEO de Visibility devolvían «Permission denied».</p>
<p>Sí funcionaban la búsqueda de contenido sin metadatos SEO y la consulta del propio perfil. El catálogo muestra todo lo público y cada usuario solo ejecuta lo que permiten sus capacidades de WordPress, de ahí la importancia del usuario con el que se conecta.</p>
<h3>Servidor por defecto y servidores dedicados</h3>
<p>El servidor por defecto no presenta cada <code>ability</code> como una herramienta independiente, sino tres herramientas genéricas (descubrir <code>abilities</code>, consultar su información y ejecutarlas). Para un cliente como Claude eso equivale a una sola herramienta de ejecución, de modo que el permiso que solicita cubre cualquier <code>ability</code>, sea de lectura o de borrado.</p>
<p>El servidor dedicado de VigIA (<code>/wp-json/vigia/v1/mcp</code>), que el plugin registra a través del MCP Adapter oficial y que solo existe con el Adapter activo, ofrece 9 herramientas directas con sus anotaciones (5 de solo lectura y 2 destructivas), exige permisos de administrador desde la conexión (el editor de pruebas recibió un 403) y se desactiva sin afectar al resto. Con herramientas individuales y anotadas el cliente puede pedir permiso de forma selectiva, y el agente elige mejor dentro de un catálogo reducido.</p>
<p>El servidor por defecto tiene a su favor que basta con una conexión por web, una sola contraseña de aplicación y menos configuración en cada cliente, que es el modelo que persigue el plan para la 7.3. VigIA combina los dos enfoques, ya que sus <code>abilities</code> aparecen en el servidor por defecto y además registra su servidor dedicado en el mismo Adapter.</p>
<h3>Limitaciones</h3>
<ul>
<li><strong>Versión 0.x:</strong> la 0.7.0 (2 de octubre de 2026) dejó de admitir revisiones antiguas del protocolo y declaró obsoleto empaquetar el Adapter dentro de otros plugins, algo que varios siguen haciendo (VigIA, por ejemplo, dejó de incluirlo en la versión 2.8.0). Tengo prevista una versión 1.0 estable en torno al 8 de diciembre, junto a WordPress 7.2, aunque su alcance y su fecha siguen en discusión.</li>
<li><strong>Contraseñas de aplicación:</strong> en remoto la autenticación se hace con ellas, y no caducan hasta que se revocan.</li>
<li><strong>Sin OAuth:</strong> no se puede conectar directamente desde claude.ai ni desde ChatGPT en el navegador, solo desde clientes de escritorio o de terminal (la <a href="https://ayudawp.com/mcp-wordpress/" target="_blank" rel="ugc noopener">guía de MCP</a> explica cómo hacerlo con cada uno).</li>
<li><strong>Abilities del núcleo de solo lectura:</strong> WordPress 6.9 incluye tres de información (sitio, usuario y entorno), y la 7.2 añade consultas de ajustes, usuarios y contenido (ya incluidas en las betas), también de solo lectura. Las de escritura llegarán más adelante.</li>
</ul>
<h3>Planes MCP para WordPress 7.x</h3>
<p>Ya está confirmado que el MCP Adapter no entra en el núcleo con WordPress 7.2, que se publica el 8 de diciembre de 2026, y que el equipo de IA apunta a la 7.3. Llegó a plantearse una excepción para incluirlo en la 7.2, pero sigue como plugin. Que la 7.3 sea el objetivo no significa que esté decidido, y conviene matizarlo.</p>
<p>El 28 de octubre de 2026, Jason Adams (Automattic, representante del equipo de IA) publicó la propuesta <a href="https://make.wordpress.org/ai/2026/10/28/wordpress-for-the-agentic-web/" target="_blank" rel="nofollow noopener">WordPress for the Agentic Web</a>, con cuatro líneas de trabajo (el Adapter, <code>abilities</code> base, OAuth y la experiencia de conexión). La 7.2 se dedica a preparar lo necesario y la 7.3 es el objetivo.</p>
<p>Para MCP en el núcleo la propuesta contempla dos vías, la fusión directa o una inclusión que permita al Adapter evolucionar por separado, así que no está decidido que entre tal cual. OAuth se diseñaría en la 7.2 y se incorporaría al núcleo en la 7.3, y el documento califica las contraseñas de aplicación como «not a scalable approach». La inclusión queda condicionada a la madurez técnica, a la seguridad y al proceso habitual de revisión del núcleo..</p>
<p>También hay posturas en contra. En la <a href="https://make.wordpress.org/core/2026/02/03/proposal-for-merging-wp-ai-client-into-wordpress-7-0/" target="_blank" rel="nofollow noopener">propuesta de fusión del cliente de IA para la 7.0</a> el equipo mantenía el Adapter como plugin canónico de forma deliberada. Lo único confirmado es que MCP no entra en la 7.2. Para la 7.3 hay intención, pero ni la inclusión ni el formato están cerrados.</p>
<h2>MCP de WordPress.com con Jetpack</h2>
<p>No existe un servidor MCP específico de Jetpack. El servidor es el <a href="https://developer.wordpress.com/docs/mcp/" target="_blank" rel="nofollow noopener">MCP de WordPress.com</a>, alojado por Automattic, y Jetpack conecta con él las webs autoalojadas, de forma que una sola conexión da acceso a todas las webs de la cuenta.</p>
<p>Muchas guías indican que requiere Jetpack AI o un plan de pago, pero la <a href="https://jetpack.com/support/create-better-content-with-jetpack-ai/manage-ai-and-mcp-settings-in-jetpack/" target="_blank" rel="nofollow noopener">documentación de Jetpack</a>, actualizada el 22 de octubre de 2026, pide un plan Jetpack AI o Jetpack Complete, <a href="https://jetpack.com/support/create-better-content-with-jetpack-ai/manage-ai-and-mcp-settings-in-jetpack/" target="_blank" rel="nofollow noopener">aunque hasta el 30 de noviembre de 2026 también funciona con el plan gratuito</a>.</p>
<p><a href="https://ayudawp.com/?attachment_id=160873" rel="nofollow"><img decoding="async" class="sombra alignnone wp-image-160873 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/jetpack-ai-mcp-wordpress-1200x675.jpg" alt="" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/11/jetpack-ai-mcp-wordpress-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/jetpack-ai-mcp-wordpress-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/jetpack-ai-mcp-wordpress-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/jetpack-ai-mcp-wordpress.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<p>La identificación usa OAuth 2.1 con PKCE (un método de autorización que no requiere entregar la contraseña), permite elegir entre acceso completo o solo lectura al conectar y se revoca desde las aplicaciones conectadas de la cuenta de WordPress.com. El acceso MCP está desactivado por defecto, se eligen las herramientas de lectura y de escritura permitidas y queda un registro de actividad.</p>
<p>La conexión desde Claude con la web pública de pruebas funcionó sin incidencias, con dos resultados relevantes:</p>
<ul>
<li><strong>Sin acceso a las <code>abilities</code>:</strong> el catálogo es fijo (contenido, ajustes, estadísticas, registro de actividad, copias de seguridad, plugins, temas, usuarios, edición del sitio, dominios…) y no incluye ninguna operación para usar <code>abilities</code>. Las de VigIA y Visibility no aparecen, y como mucho se podría modificar algún metadato registrado en la API REST al editar una entrada.</li>
<li><strong>Acceso a todas las webs de la cuenta:</strong> además de la web de pruebas, el conector mostraba otras webs de la misma cuenta con el acceso MCP disponible. Conviene revisar en cuáles está activado antes de conectar.</li>
</ul>
<p>En cuestiones de seguridad, las escrituras exigen confirmación explícita, los borrados de entradas, páginas y comentarios van a la papelera, y los de medios, términos y menús son definitivos, con aviso previo. La herramienta de lectura de respuestas de formularios aparece desactivada y reservada a empleados de Automattic. Según WordPress.com, los datos de las herramientas no se usan para entrenar modelos.</p>
<p>Sus limitaciones son que no funciona con webs locales (Jetpack las detecta y no se conecta) y que <strong>todo pasa por la infraestructura y la cuenta de WordPress.com</strong>. Es la opción más sencilla y mejor resuelta para quien ya usa Jetpack y trabaja desde claude.ai o ChatGPT en el navegador. Para quien no lo usa supone instalar un plugin de gran tamaño para una única función.</p>
<h2>WPVibe</h2>
<p><a href="https://es.wordpress.org/plugins/vibe-ai/" target="_blank" rel="nofollow noopener">WPVibe</a> es un plugin de SeedProd, empresa del grupo Awesome Motive (el mismo que gestiona WPBeginner, que lo sitúa en primer lugar en su comparativa), con más de 100.000 instalaciones activas. Funciona como intermediario, ya que el cliente de IA se comunica con el servicio de WPVibe y este reenvía las peticiones a la API REST de la web.</p>
<p>Para ello la contraseña de aplicación que se crea al conectar se guarda cifrada en servidores de WPVibe en Cloudflare. La página del plugin afirma en sus preguntas frecuentes que no se envían datos a terceros, mientras que su sección de servicios externos describe ese intermediario. Creo que deberían adaptar los textos ¿no?</p>
<p><a href="https://ayudawp.com/?attachment_id=160874" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160874 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/WPVibe-AI-WordPress-1200x675.jpg" alt="" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/11/WPVibe-AI-WordPress-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/WPVibe-AI-WordPress-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/WPVibe-AI-WordPress-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/WPVibe-AI-WordPress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>La conexión se inicia desde el cliente de IA, que genera un enlace para aprobarla en la web. Estos son los resultados de la prueba:</p>
<ul>
<li><strong>Usuario:</strong> actúa como el usuario que aprueba la conexión. Si es un administrador, el agente tiene permisos de administrador, por lo que es preferible aprobarla con un usuario dedicado.</li>
<li><strong>Abilities:</strong> detectó 53 (núcleo, VigIA, Visibility, formularios de Jetpack, el plugin AI oficial y otras), porque las obtiene de la API REST de <code>abilities</code> del núcleo y no del Adapter. Las de VigIA y Visibility funcionaron sin configuración adicional. Las de WooCommerce no aparecían, por causas que no se han determinado.</li>
<li><strong>Cuota:</strong> el plan gratuito permite 300 llamadas cada 24 horas y cuenta cada herramienta usada (algunas reseñas mencionan 100, una cifra que parece desfasada).</li>
<li><strong>Latencia:</strong> una consulta sencilla tardó 1.277 ms, de los que 4 correspondían a PHP en la web y el resto al trayecto por el intermediario.</li>
</ul>
<p>Según la descripción de su herramienta de ejecución de <code>abilities</code>, WPVibe solo pide aprobación para las <code>abilities</code> marcadas como destructivas. Las escrituras sin esa anotación se ejecutan directamente, lo que en la web de pruebas incluía bloquear un rastreador o añadir una regla al <code>robots.txt</code> con VigIA y modificar el SEO de una entrada con Visibility.</p>
<p>La protección depende, por tanto, de cómo anote cada plugin sus <code>abilities</code>.</p>
<p>WPVibe es la vía más rápida para conectar una web autoalojada desde claude.ai o ChatGPT en el navegador y, a diferencia del MCP de WordPress.com, accede a las <code>abilities</code>. Como contrapartida, credenciales y peticiones pasan por un tercero que se convierte en punto único de fallo, el uso está limitado por cuota y no sirve para webs locales.</p>
<h2>Plugins con servidor MCP propio: Royal MCP, Easy MCP AI y AI Engine</h2>
<p>A diferencia de los servidores dedicados que se registran en el MCP Adapter, estos plugins implementan su propio servidor MCP, con OAuth propio y cientos de herramientas. Permiten conectar desde claude.ai o ChatGPT en el navegador sin intermediarios y sin esperar a que el núcleo incluya <code>abilities</code> de escritura.</p>
<p>Como contrapartida, añaden mucho código y un OAuth desarrollado por cada plugin, que es el área donde se han concentrado las vulnerabilidades más recientes (ver la sección siguiente).</p>
<h3>Royal MCP</h3>
<p><a href="https://es.wordpress.org/plugins/royal-mcp/" target="_blank" rel="nofollow noopener">Royal MCP</a> (más de 10.000 instalaciones) viene desactivado por defecto. Al activarlo añade 14 rutas a la API REST, y en la prueba listó 270 herramientas, 107 de ellas marcadas como destructivas. Incluye modos de solo lectura y de solo borradores, registro de actividad, límites de peticiones, simulación previa y opción de deshacer durante 72 horas.</p>
<p>Aspectos a tener en cuenta:</p>
<ul>
<li><strong>Modo de solo lectura:</strong> no oculta herramientas, sino que las sigue listando y las rechaza al ejecutarlas («This site is in read-only mode»).</li>
<li><strong>Aprobación de clientes nuevos:</strong> la opción que exige aprobar cada cliente de IA nuevo está desactivada por defecto, aunque solo pueden conectar administradores.</li>
<li><strong>API REST restringida:</strong> Royal valida su clave dentro de su propia ruta, por lo que deja de funcionar si un plugin de seguridad bloquea la API REST a peticiones no autenticadas. Con Vigilante en ese modo devolvía un 401 con una clave válida.</li>
<li><strong>Versión Pro:</strong> el escritorio anuncia «Royal MCP Pro &amp; Royally starts at just $9/month», mientras que la página oficial del plugin en WordPress.org dice que «There is no Pro version».</li>
</ul>
<p><a href="https://ayudawp.com/?attachment_id=160875" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160875 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/RoyalMCP-AI-WordPress-1200x675.jpg" alt="" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/11/RoyalMCP-AI-WordPress-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/RoyalMCP-AI-WordPress-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/RoyalMCP-AI-WordPress-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/RoyalMCP-AI-WordPress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>En la 1.5.10 se corrigieron dos vulnerabilidades (una permitía a un suscriptor leer contenido no público), y las versiones posteriores han incluido más correcciones.</p>
<h3>Easy MCP AI</h3>
<p><a href="https://es.wordpress.org/plugins/easy-mcp-ai/" target="_blank" rel="nofollow noopener">Easy MCP AI</a> (más de 30.000 instalaciones) es de Themeisle, que lo sitúa en primer lugar en su propia comparativa. Anuncia más de 280 herramientas, con integraciones de Google Analytics, Search Console, Semrush, Ahrefs y otros servicios, autenticación por OAuth 2.1 o tokens propios, y consume <code>abilities</code> de otros plugins si se seleccionan una a una.</p>
<p>Las herramientas de mayor riesgo (usuarios, plugins, temas, WP-CLI y lectura privilegiada de archivos) vienen desactivadas. Un token de lectura listó 68 herramientas, leyó entradas y rechazó crear una. Por OAuth pueden conectarse por defecto administradores, editores, autores y gestores de tienda, sin aprobación previa y sin forzar el estado de borrador.</p>
<p>Puntos débiles detectados:</p>
<ul>
<li><strong>Superficie:</strong> unas 70 rutas en la API REST, una de ellas con la clave de API en la propia URL, que acaba en los registros de acceso del servidor.</li>
<li><strong>Anulación de restricciones de la API REST:</strong> engancha el filtro de autenticación de la API REST con la máxima prioridad y anula los errores 401 que otros plugins devuelven en sus rutas. Con Vigilante restringiendo la API REST a usuarios autenticados, una petición anónima de registro de cliente OAuth obtuvo un 201.</li>
<li><strong>Conexiones salientes:</strong> descarga a diario «skills» firmadas desde su servidor, en una petición que solo envía la versión. Se puede desactivar con una constante, pero está activo por defecto.</li>
</ul>
<p>Registrar un cliente OAuth no da acceso por sí mismo, porque después hay que aprobar la pantalla de consentimiento, y el plugin lo hace para que OAuth funcione con plugins de seguridad activos (se desactiva con el filtro <code>easy_mcp_ai_rest_auth_override</code>). Aun así, una política de API REST solo para usuarios autenticados deja de aplicarse en sus rutas sin aviso.</p>
<h3>AI Engine</h3>
<p><a href="https://es.wordpress.org/plugins/ai-engine/" target="_blank" rel="nofollow noopener">AI Engine</a>, de Meow Apps (más de 90.000 instalaciones), no lo he probado a fondo, por lo que estos datos proceden de su información comercial, además de su historial. El servidor MCP es gratuito en la versión libre, con OAuth para Claude y ChatGPT y token para Claude Code, y desde la 3.8.9 permite elegir entre conexión directa o un intermediario de Meow Apps. Es un plugin de gran tamaño (chatbots, formularios y otras funciones), lo que supone mucha superficie si solo se necesita MCP.</p>
<p>Su ficha describe el MCP Adapter como una herramienta pensada principalmente para el alojamiento de WordPress.com, algo inexacto, ya que WordPress.com no lo utiliza. Su MCP acumula tres vulnerabilidades serias entre 2025 y 2026, que te cuento enseguida.</p>
<h2>Vulnerabilidades en implementaciones propias de OAuth</h2>
<p>Los <strong>avisos de seguridad recientes en plugins MCP para WordPress</strong> siguen un patrón, con los fallos graves concentrados en el OAuth desarrollado por cada plugin y, sobre todo, en el registro dinámico de clientes (el mecanismo que permite a un cliente de IA darse de alta por sí mismo).</p>
<ul>
<li><strong>MountDev AI MCP Connector hasta la 1.6.1:</strong> CVE-2026-15015, con una puntuación de 9,8 sobre 10 y sin necesidad de autenticación. El registro de clientes estaba abierto y el punto de autorización sin proteger, de modo que se podía obtener un token de administrador sin intervención del administrador.</li>
<li><strong>AI Engine:</strong> CVE-2025-5071 (de la 2.8.0 a la 2.8.3, solo con las herramientas de desarrollo y MCP activadas, que venían desactivadas), CVE-2026-8719 (en la 3.4.9 cualquier token OAuth válido llegaba a herramientas de administrador, corregido cuatro días después de añadir OAuth) y CVE-2026-110732 (hasta la 3.8.6, el registro dinámico de clientes no comprobaba permisos).</li>
<li><strong>Royal MCP:</strong> CVE-2026-111960 y CVE-2026-111961, corregidos en la 1.5.10.</li>
<li><strong>MCP Server for WordPress antes de la 1.8.2:</strong> tres CVE, uno de ellos un CSRF (falsificación de petición) que podía crear un administrador si el administrador visitaba una página preparada.</li>
<li><strong>WSP MCP y WDS MCP Content Manager:</strong> fallos de gravedad media y baja en 2026.</li>
</ul>
<p>Como contexto, todos tienen versión corregida, varios solo afectaban con el MCP activado (normalmente desactivado por defecto) y en el caso de MountDev el registro del CVE no indica explotación.</p>
<p>El MCP Adapter no tiene avisos de seguridad publicados, en parte porque su superficie propia es reducida (la autenticación es la del núcleo), y WordPress.com usa OAuth con PKCE y rotación de tokens. La incorporación de OAuth al núcleo prevista para la 7.3 evitaría que cada plugin tenga que desarrollar la suya.</p>
<p>WPBeginner publicó también una prueba de borrado según la cual AI Engine, Royal MCP, Easy MCP AI y Novamira borraron contenido sin pedir confirmación, WPVibe pidió aprobación y Jetpack lo envió a la papelera. Conviene leerla teniendo en cuenta quién la firma y que la confirmación depende en gran medida del cliente (Claude, por ejemplo, pide permiso por herramienta), no solo del servidor.</p>
<h2>Novamira y herramientas para desarrollo</h2>
<p><a href="https://github.com/use-novamira/novamira" target="_blank" rel="nofollow noopener">Novamira</a>, de Ovation S.r.l. (Dynamic.ooo), no está en WordPress.org, tiene licencia AGPL y una versión Pro de pago. Da a un agente acceso completo (ejecución de PHP, WP-CLI, sistema de archivos y base de datos), y su readme lo limita expresamente a entornos de desarrollo y pruebas («For dev and staging environments. With backups. Always»).</p>
<p>En la prueba local el interruptor general estaba desactivado por defecto y mostraba un aviso sobre lo que permite. Al activarlo, la ejecución de PHP quedaba habilitada por defecto. Con el administrador de pruebas el agente ejecutó PHP, listó directorios con la ruta completa del sistema de archivos local y tenía disponibles <code>abilities</code> para escribir y borrar archivos y para crear un enlace de acceso de administrador de un solo uso, que permite entrar en wp-admin sin contraseña. El editor de pruebas no veía ninguna de estas <code>abilities</code>.</p>
<p>Con Novamira activo la ruta del servidor por defecto del Adapter oficial (<code>/wp-json/mcp/mcp-adapter-default-server</code>) pasa a responder como «Novamira (legacy alias)», con un catálogo de 49 <code>abilities</code> que incluye <code>execute-php</code>, y las <code>abilities</code> del núcleo y de VigIA desaparecen de esa ruta.</p>
<p>Las clases del Adapter oficial siguen cargándose, pero Novamira registra la ruta encima para mantener la compatibilidad con configuraciones antiguas. Un cliente configurado contra el servidor por defecto oficial pasa a comunicarse con Novamira sin ninguna indicación, y ese servidor ejecuta PHP.</p>
<p>Novamira es útil en desarrollo local o en copias de pruebas, no en producción, por mucho que en gran parte me guste el concepto. Para trabajar en local existen también el MCP de WordPress Studio (creación y gestión de webs locales, WP-CLI y capturas) y el de WordPress Playground. Con acceso al servidor, a menudo resulta más directo usar Claude Code u otro agente de terminal con WP-CLI, sin MCP (más información en <a href="https://ayudawp.com/configurar-ia-programar-wordpress/" target="_blank" rel="ugc noopener">cómo configurar la IA para programar en WordPress</a>).</p>
<h2>Copias del MCP Adapter «dentro» de otros plugins</h2>
<p>Algunos plugins incluyen MCP, lo que puede suponer tener un servidor MCP activo sin saberlo (se explica en la <a href="https://ayudawp.com/mcp-wordpress/" target="_blank" rel="ugc noopener">guía de MCP</a>). Las pruebas permitieron ver además qué ocurre cuando conviven varias copias del Adapter.</p>
<ul>
<li><strong>WooCommerce:</strong> su MCP sigue en vista previa para desarrolladores. Registra sus <code>abilities</code> siempre (productos y pedidos), usa contraseñas de aplicación y no las claves de la API de WooCommerce, y la versión estable actual, la 11.2.1, incluye una copia antigua del Adapter (la 0.3.0) que solo se usa si se activa la casilla experimental. Su documentación anuncia que la ruta MCP antigua desaparece en la 11.3.</li>
<li><strong>Elementor:</strong> la 4.3.5 incluye su copia del Adapter (la 0.6.1), cargada de forma que no entra en conflicto, y con los dos activos se carga el oficial.</li>
<li><strong>Rank Math:</strong> la 1.0.280 incluye la 0.5.0 con su propio sistema de carga, y aquí sí hay conflicto. Con el Adapter oficial activo se cargaba una mezcla de clases del oficial y de la copia de Rank Math, el servidor volvía a exigir la cabecera de sesión de versiones antiguas y pasaba de 25 <code>abilities</code> a 13, porque desaparecían las del núcleo y las de VigIA. Rank Math añade además su propia capa OAuth para MCP, con su propia ruta.</li>
</ul>
<p>La 0.7.0 del Adapter declaró obsoleto empaquetarlo dentro de otros plugins, por lo que es previsible que estos plugins eliminen sus copias. Mientras tanto, con Rank Math activo junto al Adapter oficial el catálogo que ve el agente puede no coincidir con el esperado, y conviene comprobarlo (los resultados corresponden a las versiones indicadas).</p>
<h2>Medidas de seguridad recomendadas para usar servidores MCP en WordPress</h2>
<h3>Configuración mínima</h3>
<ul>
<li><strong>Usuario dedicado:</strong> crear un usuario exclusivo para la IA, con el perfil mínimo necesario, y conectar con él. El catálogo muestra todo lo público y lo que limita la ejecución son los permisos del usuario.</li>
<li><strong>Solo lectura al principio:</strong> la mayoría de opciones lo permiten, y cubre buena parte de las consultas.</li>
<li><strong>Una contraseña de aplicación por conexión:</strong> con un nombre identificable, para poder revocarla sin afectar a otras (más información en la <a href="https://ayudawp.com/application-passwords/" target="_blank" rel="ugc noopener">guía sobre contraseñas de aplicación</a>).</li>
<li><strong>Revisión del catálogo:</strong> antes de trabajar con el agente, pedirle que liste las <code>abilities</code> o herramientas disponibles.</li>
<li><strong>Pruebas previas:</strong> instalar cualquier plugin MCP nuevo primero en una copia de pruebas.</li>
</ul>
<p>Para eliminar las <code>abilities</code> de la web existe la opción de <a href="https://ayudawp.com/desactivar-abilities-api/" target="_blank" rel="ugc noopener">desactivar la Abilities API</a>.</p>
<h3>Interacción con plugins que restringen la API REST</h3>
<p><a href="https://ayudawp.com/tag/vigilante/" target="_blank" rel="ugc noopener">Vigilante</a> puede restringir la API REST a usuarios autenticados y desactivar las contraseñas de aplicación, dos opciones independientes que se probaron con cada plugin.</p>
<ul>
<li><strong>API REST solo para usuarios autenticados:</strong> bloquea las peticiones anónimas al servidor del Adapter y a Royal MCP, y deja pasar las contraseñas de aplicación, porque el núcleo las autentica antes. Royal queda bloqueado incluso con una clave válida y Easy MCP AI omite la restricción en sus rutas.</li>
<li><strong>Contraseñas de aplicación desactivadas:</strong> corta en remoto el servidor por defecto del Adapter, el servidor dedicado de VigIA y la API de <code>abilities</code> (todo devuelve 401), y al reactivarlas vuelve a funcionar. Por cómo está hecha la opción, también deja sin servicio el Quick Connect de VigIA, WPVibe y cualquier conexión que dependa de ellas. No afecta al Adapter en local con WP-CLI.</li>
</ul>

<a href="https://ayudawp.com/servidor-mcp/vigilante-api-rest/" rel="nofollow"><img width="1200" height="442" src="https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-API-REST-1200x442.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-API-REST-1200x442.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-API-REST-768x283.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-API-REST-1536x566.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-API-REST.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px" decoding="async" fetchpriority="high"></a>
<a href="https://ayudawp.com/servidor-mcp/vigilante-acceso-application-passwords/" rel="nofollow"><img width="1200" height="483" src="https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-Acceso-application-passwords-1200x483.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-Acceso-application-passwords-1200x483.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-Acceso-application-passwords-768x309.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-Acceso-application-passwords-1536x618.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/Vigilante-Acceso-application-passwords.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<p><strong>Desactivar hoy las contraseñas de aplicación implica renunciar a la mayoría de opciones</strong> descritas, así que solo tiene sentido en webs a las que no se vaya a conectar ninguna IA. Cuando OAuth llegue al núcleo es previsible que las contraseñas de aplicación pierdan uso, y esa opción tendrá sentido en más webs.</p>
<h2>Opciones desaconsejadas</h2>
<ul>
<li><strong>Proyectos archivados:</strong> el plugin MCP de Automattic (<code>Automattic/wordpress-mcp</code>) está archivado desde el 19 de enero de 2026 y su readme remite al MCP Adapter, y <code>mcp-wp/mcp-server</code> lo está desde el 7 de diciembre de 2025. Algunas listas los siguen recomendando.</li>
<li><strong>Activadores de <code>abilities</code>:</strong> plugins pequeños que exponen por MCP <code>abilities</code> de otros plugins, en algún caso todas a la vez y por defecto, como Enable Abilities for MCP. Si un plugin no marca una <code>ability</code> como pública, suele haber un motivo.</li>
<li><strong>Plugins sin historial:</strong> hay decenas de plugins MCP pequeños y varios han tenido CVE en 2026. Antes de instalar uno conviene comprobar quién lo mantiene y cuándo se actualizó por última vez.</li>
<li><strong>MCP del directorio de WordPress.org:</strong> no sirve para gestionar una web, sino que está pensado para autores de plugins (envío y validación del readme). Se menciona porque el nombre puede llevar a confusión.</li>
</ul>
<h2>Recomendaciones según cómo vayas a usar MCP</h2>
<ul>
<li><strong>Trabajo desde Claude Desktop, Claude Code, Cursor o VS Code:</strong> MCP Adapter con las <code>abilities</code> de los plugins y un usuario dedicado, y, cuando un plugin lo ofrezca, el servidor dedicado que registra en el Adapter (como el de VigIA).</li>
<li><strong>Trabajo solo desde claude.ai o ChatGPT en el navegador, con Jetpack instalado:</strong> el MCP de WordPress.com, teniendo en cuenta que no accede a las <code>abilities</code>.</li>
<li><strong>Prioridad en la rapidez, aceptando un intermediario:</strong> WPVibe, aprobando la conexión con un usuario con los permisos justos y teniendo en cuenta que lo que no esté marcado como destructivo se ejecuta sin preguntar.</li>
<li><strong>Funciones que aún no cubren las <code>abilities</code>, desde el navegador:</strong> Royal MCP o Easy MCP AI, primero en pruebas, en modo de solo lectura y comprobando su compatibilidad con el plugin de seguridad.</li>
<li><strong>Desarrollo:</strong> Novamira, Studio o Playground en local o en una copia de pruebas, o WP-CLI con un agente de terminal. Novamira, nunca en producción.</li>
<li><strong>Gestión de muchas webs:</strong> una conexión que llegue a todas tiene ventajas, y ahí el MCP de WordPress.com con Jetpack está mejor situado. Los MCP de algunos proveedores de alojamiento suelen gestionar la cuenta y el servidor (webs, copias, dominios), no el contenido de WordPress.</li>
</ul>
<h2>Recomendación a medio plazo</h2>
<p>En mi caso uso el MCP Adapter con el servidor dedicado de VigIA conectado a Claude, para consultar y gestionar los rastreadores de IA de Ayuda WordPress, y las <code>abilities</code> de Visibility ya están disponibles en el servidor por defecto del Adapter sin configuración adicional.</p>
<p>Está en estudio que Visibility registre también un servidor dedicado en el Adapter, como VigIA, por las herramientas directas y anotadas.</p>
<p>Y es que lo uso mucho, pero sobre todo para el resumen diario que me manda Claude por email, en el que unifica desde los correos pendientes, los mensajes de Slack que requieren mi atención y, a este respecto, las estadísticas diarias de principales rastreadores y páginas más rastreadas de mis webs principales. Una gozada, la verdad.</p>
<p>A medio y largo plazo <strong>la recomendación (mía) es no depender de soluciones que no sean nativas</strong>.</p>
<p>La evolución prevista apunta a que el acceso MCP funcione desde el propio WordPress, con MCP y OAuth en el núcleo, y en ese escenario buena parte de estos plugins tendrán que adaptarse o quedarán relegados. Es lo que está previsto en VigIA, que no incluye una implementación propia de MCP, depende desde la versión 2.8.0 del MCP Adapter oficial y pasará a usar el MCP nativo cuando se incorpore al núcleo.</p>
<p>Luego hay pruebas que añaden un argumento adicional, como que las <code>abilities</code> funcionan con casi cualquier conector, ya que las de Visibility aparecieron en el Adapter, en WPVibe y en Novamira, y las de VigIA en el Adapter y en WPVibe, sin cambios.</p>
<p>De las opciones revisadas, solo el MCP de WordPress.com no accede a ellas (en Royal MCP no se comprobó). Lo que se invierte en plugins que registran <code>abilities</code> sirve con cualquier conector, y el conector pasa a ser una pieza intercambiable.</p>
<p>Las excepciones son las ya descritas. Para trabajar desde el navegador mientras OAuth no llega al núcleo, Jetpack o WPVibe resuelven la conexión, y para quien ya usa Jetpack su MCP es la opción natural. En desarrollo, Novamira y herramientas similares cubren otra necesidad.</p>
<h2>Pasos recomendados para usar servidores MCP en WordPress</h2>
<ol>
<li>Comprobar si hay algún MCP activo sin saberlo, sobre todo con WooCommerce, Elementor o Rank Math (más detalles en la <a href="https://ayudawp.com/mcp-wordpress/" target="_blank" rel="ugc noopener">guía de MCP</a>).</li>
<li>Al activar el MCP Adapter, revisar qué <code>abilities</code> quedan públicas antes de conectar ningún cliente.</li>
<li>Conectar siempre con un usuario dedicado y con los permisos justos, empezando en solo lectura.</li>
<li>Limitar Novamira o herramientas similares a webs locales o de pruebas.</li>
<li>Para trabajar desde el navegador, usar Jetpack si ya está instalado o WPVibe asumiendo el intermediario, y seguir la evolución de OAuth en siguientes versiones de WordPress.</li>
</ol>
<p>Los próximos hitos son WordPress 7.2 el 8 de diciembre, la posible versión 1.0 del MCP Adapter en esas mismas fechas y la decisión sobre MCP y OAuth en el núcleo para WordPress 7.3</p>
<p>Espero que te haya resultado interesante el artículo, me ha llevado unas cuantas tardes hacer las pruebas y redactarlo, así que igual no es mucho pedirte que lo compartas por ahí en tus redes e IAs y, sobre todo, que dejes un comentario, y si quieres me cuentas tu opinión sobre todo esto de los MCP.</p>
<hr>
<p><strong>Para seguir aprendiendo:</strong></p>
<ul>
<li><a href="https://ayudawp.com/mcp-wordpress/" target="_blank" rel="ugc noopener">Qué es MCP en WordPress y cómo conectarlo con la IA</a>.</li>
<li><a href="https://ayudawp.com/abilities-api/" target="_blank" rel="ugc noopener">Qué es la Abilities API</a>.</li>
<li><a href="https://ayudawp.com/implementar-abilities-plugins-temas/" target="_blank" rel="ugc noopener">Cómo añadir abilities a plugins y temas</a>.</li>
<li><a href="https://ayudawp.com/vigia-abilities-api/" target="_blank" rel="ugc noopener">Cómo VigIA se comunica con la IA a través de la Abilities API</a>.</li>
<li><a href="https://ayudawp.com/seguridad-conectores-ia-wordpress/" target="_blank" rel="ugc noopener">Seguridad de los conectores de IA de WordPress</a>.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/servidor-mcp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Registro de consentimientos de cookies en WordPress: qué plugins lo guardan gratis, cuáles lo cobran y qué hacer si no quieres cambiar de banner</title>
		<link>https://ayudawp.com/registro-consentimientos-cookies/</link>
					<comments>https://ayudawp.com/registro-consentimientos-cookies/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 10 Nov 2026 07:28:36 +0000</pubDate>
				<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Complianz]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[RGPD]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160835</guid>

					<description><![CDATA[Tu banner de cookies hace bien su trabajo. Se ve, el visitante acepta o rechaza y las cookies se cargan o no según lo que haya elegido. Lo que igual no has mirado nunca es dónde queda constancia de esa decisión, y en Europa tienes que poder demostrar que el visitante te dio su consentimiento, es obligatorio.]]></description>
										<content:encoded><![CDATA[<p>Tu banner de cookies hace bien su trabajo. Se ve, el visitante acepta o rechaza y las cookies se cargan o no según lo que haya elegido. Lo que igual no has mirado nunca es dónde queda constancia de esa decisión, y en Europa <strong>tienes que poder demostrar que el visitante te dio su consentimiento</strong> (sí, es obligatorio).</p>
<p>He revisado el código de los quince plugins de cookies del directorio de WordPress que tienen 10.000 instalaciones o más, y los grandes no salen muy bien parados, porque <strong>ninguno de los cinco más instalados te guarda esa prueba gratis y en tu propia base de datos</strong>. Uno ni la guarda, dos la cobran y los otros dos la tienen en su nube, con una cuenta de por medio.</p>
<p>Que quede claro, eso sí, los plugins de banners que hay son muy buenos, bloquean scripts de terceros, detectan cookies solos, se adaptan por regiones y casi todos traen el modo de consentimiento de Google (Consent Mode), de pago casi siempre. Pero <strong>la parte que la mayoría dejan fuera del plan gratuito es justo la que la ley te pide poder demostrar</strong>.</p>
<p>Lo bueno es que <strong>sí hay plugins de cookies que guardan la prueba gratis y en tu servidor</strong>, aunque no estén entre los más instalados, e incluso opciones para guardar registro gratis de los que en principio lo cobran. Vamos a ver estos y los otros, junto con lo que puedes hacer si no quieres cambiar el banner que ya tienes.</p>
<p>A ver qué te pide la ley, qué tiene que guardar un registro para que valga como prueba, qué hace cada plugin y qué opciones tienes según el que uses.</p>
<h2>Lo que piden las leyes de cookies (y lo que no)</h2>
<p>El permiso para las cookies sale (en España) del <a href="https://www.boe.es/buscar/act.php?id=BOE-A-2002-13758">artículo 22.2 de la LSSI</a> (Ley 34/2002), que dice que si una cookie no es estrictamente necesaria tienes que pedir permiso antes de instalarla. Eso ya lo sabes, y es la razón de que tengas un banner.</p>
<p>La parte que se suele pasar por alto está en el artículo 7.1 del <a href="https://eur-lex.europa.eu/legal-content/ES/TXT/?uri=CELEX%3A32016R0679">RGPD</a>:</p>
<blockquote><p>Cuando el tratamiento se base en el consentimiento del interesado, <strong>el responsable deberá ser capaz de demostrar que aquel consintió el tratamiento de sus datos personales</strong>.</p></blockquote>
<p>Y el artículo 5.2, el de la responsabilidad proactiva, termina de atar el asunto, porque deja claro que <strong>la carga de la prueba es tuya</strong>.</p>
<p>No es la Agencia Española de Protección de Datos (AEPD) la que tiene que demostrar que no pediste permiso, eres tú quien tiene que poder demostrar que sí, cuándo y para qué.</p>
<p>La <a href="https://www.aepd.es/documento/guia-cookies.pdf">guía sobre el uso de las cookies de la AEPD</a>, actualizada por última vez en julio de 2023, lo da por hecho, cuando explica cómo se obtiene el consentimiento, dice que un clic del usuario «<em>no cabe duda de que facilitará la prueba de que se ha obtenido</em>». O sea, que la prueba no se discute, lo que se discute es qué fórmula la pone más fácil.</p>
<p>Hay otro detalle en esa guía que encaja aquí, y es que La Agencia considera buena práctica que el consentimiento no dure más de 24 meses y que, mientras dure, «se conserve la selección realizada por el usuario sobre sus preferencias» para no volver a preguntarle en cada visita.</p>
<p>Todos los banners lo hacen, guardando la decisión en una cookie del navegador del visitante, y con eso cumplen la parte de no darle la lata. El problema es que <strong>esa copia está en el navegador de la persona ante la que tendrías que demostrar algo si un día reclama</strong>, y tú te quedas sin nada que enseñar.</p>
<p>Ahora bien, en este tema se exagera mucho y <strong>ni el RGPD ni la guía de la AEPD hablan de un «registro de consentimientos»</strong>, de hecho la palabra «registro» no aparece en la guía.</p>
<p><strong>Lo obligatorio es poder demostrar el consentimiento, y el registro es, sencillamente, la única forma práctica que conozco de hacerlo con visitas anónimas</strong> a las que no vas a volver a ver.</p>
<p>Si alguien te cuenta que el registro como una obligación no es cierto, y si te dice que puedes demostrar un consentimiento que no has guardado tampoco.</p>
<p>No te cuento esto para meterte miedo, pues en una web pequeña lo normal es que nadie te pida nunca esta prueba, pero si llega la reclamación de un visitante o un requerimiento, lo que te van a preguntar es si puedes demostrar que esa persona aceptó, y ahí un banner que funciona perfectamente pero no ha guardado nada no te sirve de mucho.</p>
<h2>Qué tiene que guardar un registro para que valga como prueba</h2>
<p>Un registro que solo diga «aceptó» es como un ticket de compra en el que solo pone «pagado», que es un papel, sí, pero no dice qué compraste ni cuándo. Para que cada fila sirva de algo debería llevar, como mínimo:</p>
<ul>
<li><strong>Un identificador</strong> de la decisión o del visitante, para poder relacionar lo que aceptó hoy con lo que rechazó en marzo.</li>
<li><strong>La fecha y la hora</strong>, siempre en la misma zona horaria (UTC, por ejemplo) y no en la que tenga configurada el servidor de turno.</li>
<li><strong>Las categorías que quedaron activas</strong> al final, no solo si hizo clic en «Aceptar» o «Rechazar».</li>
<li><strong>La versión de lo que se le mostró</strong>, que es lo que más falta en los plugins que he revisado. Si cambias los textos del banner o las cookies que declaras, un «aceptó» de hace un año ya no demuestra que aceptara lo que tienes hoy.</li>
<li><strong>La normativa o la región</strong> que se le aplicó, porque el mismo banner se comporta distinto con alguien de Madrid que con alguien de California.</li>
<li><strong>Si hubo clic o no</strong>, es decir, si la decisión la tomó el visitante o es un valor por defecto del banner. Un consentimiento que nadie ha dado no es consentimiento, y si mezclas las dos cosas en la misma tabla tienes un registro que no puedes defender.</li>
<li><strong>La página</strong> en la que se tomó la decisión.</li>
<li><strong>Un sello de integridad</strong>, un hash (una huella que se calcula a partir del contenido de la fila) que permita ver si alguien la ha modificado después. Un registro que se puede editar a mano demuestra bastante menos de lo que parece.</li>
</ul>
<p>Pero ojo, que también se puede pecar por exceso. Ese registro es un fichero de datos personales como cualquier otro, así que tiene que caducar, tiene que aparecer en las exportaciones y borrados de datos que te pidan por el RGPD y, si guardas la dirección IP, mejor truncada.</p>
<p><strong>Aquí se trata de probar, no de perfilar</strong>, y cada dato que guardes de más es un problema nuevo que antes no tenías.</p>
<h2>Qué plugins de cookies guardan registro y cuáles no</h2>
<p>Como ya me vas conociendo, seguro que sabes que me he descargado el zip de los quince plugins de cookies que tienen 10.000 instalaciones activas o más en el directorio de WordPress, y miré uno a uno a ver que pasa con la decisión del visitante que hace clic en su banner.</p>
<p>Las cifras de instalaciones son del día que las probé, pueden haber cambiado, pero no es lo importante, lo que creo que te interesará es qué hacen con las decisiones sobre cookies.</p>
<table>
<thead>
<tr>
<th>Plugin de cookies</th>
<th>Instalaciones</th>
<th>¿Dónde queda la prueba?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Complianz</td>
<td>1.000.000</td>
<td>De pago (Records of Consent)</td>
</tr>
<tr>
<td>CookieYes</td>
<td>1.000.000</td>
<td>En su nube, con cuenta y tope de páginas vistas</td>
</tr>
<tr>
<td>Cookie Compliance (antes Cookie Notice)</td>
<td>800.000</td>
<td>En su nube, con cuenta, sin pasar por tu servidor</td>
</tr>
<tr>
<td>CookieAdmin</td>
<td>400.000</td>
<td>No guarda consentimientos</td>
</tr>
<tr>
<td>GDPR Cookie Compliance (Moove)</td>
<td>300.000</td>
<td>De pago (Consent Log)</td>
</tr>
<tr>
<td>WPConsent</td>
<td>200.000</td>
<td>De pago, pero en tu base de datos</td>
</tr>
<tr>
<td>iubenda</td>
<td>200.000</td>
<td>Servicio externo, según plan</td>
</tr>
<tr>
<td>Cookiebot</td>
<td>100.000</td>
<td>Servicio externo, según plan</td>
</tr>
<tr>
<td><strong>Real Cookie Banner</strong></td>
<td>100.000</td>
<td><strong>Gratis y en tu base de datos</strong></td>
</tr>
<tr>
<td>Termly (antes UK Cookie Consent)</td>
<td>80.000</td>
<td>En su nube, con cuenta</td>
</tr>
<tr>
<td><strong>SureCookie</strong></td>
<td>70.000</td>
<td><strong>Gratis y en tu base de datos</strong></td>
</tr>
<tr>
<td>Cookiez</td>
<td>50.000</td>
<td>En la nube de Elementor, con cupo de consentimientos</td>
</tr>
<tr>
<td>Beautiful Cookie Consent</td>
<td>40.000</td>
<td>No guarda consentimientos</td>
</tr>
<tr>
<td>Adapta RGPD</td>
<td>40.000</td>
<td>Por su propia API, fuera de tu web</td>
</tr>
<tr>
<td><strong>Pressidium Cookie Consent</strong></td>
<td>10.000</td>
<td><strong>Gratis y en tu base de datos</strong></td>
</tr>
</tbody>
</table>
<p>Trece de las quince filas salen de abrir el código del plugin gratuito, así que ahí no hay interpretación posible, o hay una tabla donde se escribe la decisión o no la hay.</p>
<p>Las dos excepciones son <strong>iubenda y Cookiebot</strong>, que son servicios externos de pago con un plugin que hace de enlace. El registro de consentimientos es una función conocida de sus planes, pero está en su tarifa y en su nube, y sus planes de pago no los he revisado.</p>
<p>Lo que cuenta la tabla es que <strong>los cinco plugins más instalados suman 3,5 millones de webs y ninguno guarda la prueba gratis en tu servidor</strong>, mientras que <strong>los tres que sí lo hacen suman 180.000</strong>.</p>
<p>Es curioso, pero precisamente la parte que la ley te pide poder enseñar está repartida justo al revés que el mercado. Es como si nos gustase pagar por cosas gratis ¿en serio somos así de gilis? Es el marketing, que funciona de coña, por si no te habías dado cuenta.</p>
<h2>Los cinco plugins de cookies más instalados y lo que hacen con las decisiones</h2>
<h3>Complianz (1 millón de instalaciones)</h3>
<p><strong>La versión gratuita de Complianz es la más generosa del mercado</strong>, con bloqueo de servicios de terceros y marcador de posición (el recuadro que sustituye al vídeo o al mapa hasta que se aceptan las cookies), escaneo periódico del sitio, banner por regiones y subregiones, accesibilidad WCAG 2.1 AA, bloques para el editor, Google Consent Mode y el marco publicitario de IAB Europe (TCF), en el que está dado de alta. Y sin tope de páginas vistas, cosa que su readme presume, y con razón.</p>
<p>El registro por visitante se llama <em>Records of Consent</em> y es de pago. No está escondido, aparece en la lista de funciones Premium de su readme, y el código lo confirma, porque el banner solo envía el consentimiento al servidor si está activa una opción interna que exige la versión Premium (en <code>cookiebanner/class-cookiebanner.php</code>, hacia la línea 1334 de la versión 7.5.5).</p>
<p>Un detalle a su favor es que la versión gratuita <strong>sí guarda copias en PDF de tu política de cookies</strong>, con su propio módulo de <em>proof of consent</em>, así que puede demostrar qué ponía tu web tal día. Lo que no guarda gratis es quién dijo que sí.</p>
<h3>CookieYes (1 millón de instalaciones)</h3>
<p>Aquí el registro sí existe en el plan gratuito, pero con dos condiciones que conviene conocer antes de quedarse tranquilo. La primera es que <strong>vive en la nube de CookieYes, no en tu base de datos</strong>. El plugin solo le pide estadísticas a su servicio y, si la web no está conectada a una cuenta, no hay registro ninguno. La segunda es el tope del plan gratuito, que es de 5.000 páginas vistas al mes según su página de precios (consultada el 3 de octubre de 2026). Esa página no dice qué pasa con el registro cuando te pasas del tope, ni cuánto tiempo lo conservan.</p>
<p>A cambio, es el que más información expone sobre cada decisión. Tiene identificador de consentimiento propio, indica si el visitante llegó a pulsar algo y expone la normativa aplicada y el idioma, todo accesible desde JavaScript.</p>
<h3>Cookie Compliance, antes Cookie Notice (800 mil instalaciones)</h3>
<p>Es el que más gente tiene mal catalogado, porque ha cambiado de nombre y de modelo. Lo desarrolla Hu-manity.co y tiene dos modos de funcionamiento que no se parecen en nada:</p>
<ul>
<li><strong>Solo banner:</strong> sin conectar a su servicio, su propio readme avisa de que no hay bloqueo de scripts, ni categorías por finalidad, ni almacenamiento de registros. Nada.</li>
<li><strong>Conectado:</strong> en plan gratuito o de pago, el banner se sirve desde el CDN de Hu-manity y, según su readme, el script «se comunica directamente con los servicios de Hu-manity.co para registrar la decisión de consentimiento». Ese flujo va del navegador del visitante a Hu-manity sin pasar por tu WordPress.</li>
</ul>
<p>Traducido, en el único modo en el que la decisión se guarda con sus categorías <strong>la decisión no pasa por tu servidor y el registro no es tuyo</strong>. Si eso te vale o no depende de cómo lleves las transferencias internacionales de datos y de lo mucho que te importe tenerlos en casa. A su favor, es el único de los grandes que se registra él solo como gestor de consentimiento en la WP Consent API (un plugin aparte para que otros plugins se enteren de lo que ha decidido el visitante, del que te hablo más abajo), así que es el más fácil de conectar desde fuera.</p>
<h3>CookieAdmin (400 mil instalaciones)</h3>
<p>Este no guarda decisiones, sin más. Su única tabla propia es la del escaneo de cookies. Lo de las 400.000 instalaciones en quince meses tiene su explicación, porque es de Softaculous, la empresa de los instaladores automáticos que traen muchos hostings, y <strong>llega a muchas webs empaquetado con el instalador</strong>, que no es lo mismo que elegido por quien la mantiene.</p>
<h3>GDPR Cookie Compliance, de Moove (300 mil instalaciones)</h3>
<p>El caso más claro de todos. El <em>Consent Log</em> es de pago y en la versión gratuita la pantalla del registro existe, pero <strong>lo único que enseña es publicidad del Premium</strong>. Está así en su propio código, en <code>views/moove/admin/settings/consent-log.php</code>, que no hace otra cosa que cargar el hueco del anuncio. En el mismo paquete de pago van la renovación del consentimiento y la aceptación al hacer scroll (esta última, por cierto, no te sirve en España, porque desde 2020 la AEPD deja claro que hacer scroll o seguir navegando no es un consentimiento válido).</p>
<h2>Los tres que sí guardan la prueba gratis y en tu servidor</h2>
<p>Esta es la parte que no esperaba encontrar cuando me puse a leer código, y la que más me ha gustado del repaso.</p>
<h3>Real Cookie Banner (100 mil instalaciones)</h3>
<p>De los alemanes de DevOwl, es de largo el más completo. Dedica cinco tablas solo a esto (el consentimiento, las direcciones IP, la decisión, la URL de la página y la cadena del TCF) y, lo que más valor tiene, <strong>una tabla de revisiones con el hash de la configuración del banner</strong>, que es justo la parte de «qué se le mostró» que echaba en falta en los demás.</p>
<p>Su readme no esconde nada, dice que documenta los consentimientos y que todo se procesa y se guarda en tu servidor, sin cargar nada desde una nube en el navegador del visitante. La versión Pro añade estadísticas y otros extras, pero el registro está en la gratuita, y se puede comprobar en el código, donde la ruta que guarda la decisión llama a su función de persistencia sin ningún control de licencia.</p>
<h3>SureCookie (70 mil instalaciones)</h3>
<p>De la gente de Astra, tiene su propia clase de registro con tabla dedicada, plazo de conservación configurable, opción para guardar o no la IP, limpieza programada y hasta columnas para compartir el consentimiento entre los sitios de una red multisitio. Se nota que lo ha escrito alguien que ha tenido que explicarle esto a un cliente.</p>
<h3>Pressidium Cookie Consent (10 mil instalaciones)</h3>
<p>Va por el mismo camino con menos ambición. Tiene su tabla de consentimientos, exportación a CSV y una sección dedicada a los registros en su readme.</p>
<p>Si estás montando una web nueva y quieres la prueba en casa sin pagar, <strong>empieza por mirar estos tres</strong>, y en ese orden.</p>
<h2>El resto de la tabla</h2>
<p>Estos son otros plugins que, por varios motivos, agrupo en sección aparte:</p>
<ul>
<li><strong>WPConsent</strong> (200 mil) es el caso más confuso de los quince. Su readme dedica una sección entera a los registros de consentimiento y presume, con razón, de que se quedan en tu WordPress y no en servidores de terceros. Lo que no dice en esa sección es que la pantalla es de pago, y en la versión gratuita <strong>sale desenfocada, con el buscador desactivado y un aviso que dice, literalmente, que los registros son una función PRO</strong>. La tabla existe y tiene nombre, <code>wpconsent_consent_logs</code>, pero en todo el código gratuito aparece una sola vez, en el desinstalador, para borrarla. Guarda en tu base de datos, sí, pero no gratis.</li>
<li><strong>Termly</strong> (80 mil) es el antiguo UK Cookie Consent, que cambió de dueño y de nombre. Si lo tienes instalado desde hace años, ojo, porque ahora el consentimiento se gestiona en su servicio, con cuenta.</li>
<li><strong>Cookiez</strong> (50 mil), de Elementor, anuncia en su readme un registro con sello de tiempo, pero sus cuatro tablas son de scripts, cookies y escaneos, y en el código hay un cupo de consentimientos según el plan y una llamada de exportación contra su servicio. Nube con cupo.</li>
<li><strong>Beautiful Cookie Consent</strong> (40 mil) está construido sobre el JavaScript de Osano y presume de no cargar la base de datos. Ni tablas ni decisiones guardadas.</li>
<li><strong>Adapta RGPD</strong> (40 mil), el único español de la lista, documenta los consentimientos «a través del API», y ese API es el suyo, fuera de tu web.</li>
<li><strong>iubenda</strong> (200 mil) y <strong>Cookiebot</strong> (100 mil) guardan el registro en su servicio, según el plan que tengas contratado.</li>
</ul>
<h2>Cómo comprobar fácilmente qué está haciendo tu web con las cookies</h2>
<p>Antes de cambiar nada <strong>conviene saber dónde estás</strong>, y se tarda un momentito:</p>
<ol>
<li>Abre tu web en una ventana privada del navegador, para que no tenga guardada ninguna decisión anterior.</li>
<li>En el banner, configura una combinación fácil de reconocer, por ejemplo aceptar solo las cookies de analítica y rechazar el resto.</li>
<li>Entra en el escritorio de WordPress y busca en los ajustes de tu plugin de cookies una pantalla de registros, consentimientos o <em>consent log</em>. Si tu plugin trabaja con un servicio externo, busca en el panel de ese servicio.</li>
<li>Comprueba que aparece una fila nueva con la fecha y la hora de tu prueba y con las categorías que elegiste, no solo un «aceptado».</li>
<li>Repite la prueba pulsando «Rechazar» y mira si también queda guardada, porque si alguien dice que rechazó y le pusiste cookies igualmente, también te interesa poder demostrar lo que pasó.</li>
</ol>
<p>Si no hay pantalla, o la hay pero sale vacía o llena de publicidad, ya sabes lo que tienes, <strong>un banner que pide permiso y no guarda nada de lo que le contestan</strong>.</p>
<h2>Qué opciones tienes según tu caso</h2>
<h3>No uses cookies que necesiten consentimiento</h3>
<p>Parece una broma, pero es la solución más limpia. Si tu web solo usa cookies estrictamente necesarias no hay consentimiento que pedir, ni banner que poner, ni prueba que guardar. <strong>Cero mantenimiento y cero riesgo por este lado.</strong></p>
<p>Lo que lo estropea casi siempre son las cosas del día a día, como Google Analytics, un vídeo de YouTube incrustado, un mapa o el píxel de Facebook. Y aunque no añadan cookies, las fuentes cargadas desde Google también suelen acabar en el banner, porque envían la IP del visitante a Google. Quita todo eso y te has quitado el problema entero.</p>
<p>Hay analítica sin cookies de sobra, los vídeos se pueden poner con una miniatura que solo carga el reproductor al pulsar, y las fuentes se alojan en tu servidor en diez minutos. Para muchas webs pequeñas esta es la respuesta, y no cuesta un euro.</p>
<h3>Paga el registro de tu plugin de cookies, que tampoco es para tanto</h3>
<p>Si ya usas Complianz o el GDPR de Moove, lo que menos tiempo te va a costar es pasar por caja y activar lo que ya tienen hecho, el <em>Records of Consent</em> de Complianz o el <em>Consent Log</em> de Moove. Está integrado, lo mantienen ellos y te olvidas del asunto.</p>
<p>Con WPConsent pasa lo mismo, con la ventaja de que su versión Pro guarda los registros en tu base de datos. Para CookieYes basta con conectar la cuenta y vigilar el tope de páginas vistas, y con iubenda o Cookiebot depende del plan que tengas.</p>
<p>No tiene nada de malo y, si tu web factura, seguramente es lo que más sentido tiene. Eso sí, antes de pagar mira <strong>dónde se guarda el registro y durante cuánto tiempo</strong>, porque ni Complianz, ni Moove, ni CookieYes lo explican del todo en sus webs.</p>
<h3>Cámbiate a un plugin que lo guarde gratis</h3>
<p>Ahora que sabemos que hay tres que lo hacen gratis y en tu base de datos, esta opción gana muchos puntos. <strong>Si la web es nueva, o el banner que tienes te da igual, pasarte a Real Cookie Banner es la vía más limpia</strong>, porque te llevas el banner y la prueba en el mismo paquete, con las revisiones incluidas.</p>
<p>En una web que ya funciona la cosa cambia, cambiar de plugin de cookies para tener registro es como mudarte de casa para cambiar un grifo. El motor de bloqueo del plugin nuevo es lo que más webs rompe, y las exenciones, los servicios declarados y los textos que llevas años ajustando se quedan en el plugin viejo. <strong>Si tu web factura, pruébalo antes en una copia</strong> (un entorno de pruebas o <em>staging</em>).</p>
<h3>Móntatelo tú</h3>
<p>Un poco de JavaScript que escuche el evento de tu banner, una llamada a tu servidor y una tabla. En una tarde lo tienes funcionando, y por eso aparece en tantos tutoriales.</p>
<p>Lo que viene después ya no es de una tarde, pues cada banner dispara varios eventos por una sola decisión, así que si no los separas te salen cuatro filas por visitante. La decisión te llega desde el navegador, de modo que lo que el navegador no debería poder inventarse (qué banner, qué versión, qué normativa) tiene que firmarlo tu servidor.</p>
<p>Hay que sellar las filas, hacer que caduquen, incluirlas en las exportaciones y borrados del RGPD y, sobre todo, <strong>enterarte el día que el banner cambie su JavaScript y tu registro deje de guardar sin avisar</strong>.</p>
<p>Y no es una hipótesis, recientemente Complianz, Moove y CookieYes publicaron seis versiones entre los tres, y una de ellas rehizo entero el JavaScript del banner. <strong>Un registro que deja de registrar sin avisar es peor que no tener registro, porque te crees cubierto.</strong></p>
<p>Si te lo montas tú lo primero que vas a encontrar es la <a href="https://es.wordpress.org/plugins/wp-consent-api/">WP Consent API</a>, un plugin que define un idioma común para el consentimiento, de modo que el banner anuncia lo que ha decidido el visitante y cualquier otro plugin puede escucharlo sin que los dos se conozcan de nada.</p>
<p>Ojo con el nombre, que despista, <strong>no tiene nada de oficial</strong>, nació como propuesta para entrar algún día en el núcleo de WordPress y, seis años después, sigue siendo eso, una propuesta que no avanza.</p>
<p>Que tenga 200.000 instalaciones, que su autor sea el fundador de Complianz, que la cuenta de wordpress.org figure entre sus colaboradores o que WooCommerce la consulte para la atribución de pedidos (saber de qué campaña o canal viene cada venta) no la convierte en parte de WordPress. Es un plugin más, cada web decide si lo instala, y los plugins de cookies solo hablan con él cuando está instalado y activo.</p>
<p>Eso sí, tiene sus límites, pues por ejemplo no distingue si hubo clic o es un valor por defecto, no trae identificador, no sabe qué textos se mostraron ni qué normativa se aplicó, y cada banner traduce sus categorías a las de la API a su manera. Sirve básicamente, y no es poco, para que los plugins que la usan se entiendan entre ellos, pero como prueba se queda corta.</p>
<h3>Quédate con el banner que ya uses y añade el registro aparte (gratis)</h3>
<p><strong>Entre pagar, cambiar de plugin y programarlo tú hay una vía intermedia</strong>, que es dejar el banner como está y añadir un plugin que solo se ocupe de guardar las decisiones.</p>
<p>Se llama <a href="https://es.wordpress.org/plugins/terms-conditions-consent-log/">Cookies, Terms &amp; Conditions Consent Log</a>. Hasta hace poco «solo» guardaba la prueba de otras aceptaciones (la casilla de condiciones en el registro de usuarios, en el acceso, en el pago de WooCommerce o en los formularios), y desde la versión 1.9.0 <strong>guarda también las decisiones del banner de cookies que ya tengas</strong>, sin tocarlo y sin mostrar ningún banner propio.</p>

<a href="https://ayudawp.com/registro-consentimientos-cookies/consentimientos-wordpress/" rel="nofollow"><img width="1200" height="612" src="https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-WordPress-1200x612.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-WordPress-1200x612.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-WordPress-768x392.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-WordPress-1536x783.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-WordPress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/registro-consentimientos-cookies/consentimientos-cookies-wordpress/" rel="nofollow"><img width="1200" height="690" src="https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-cookies-WordPress-1200x690.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-cookies-WordPress-1200x690.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-cookies-WordPress-768x442.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-cookies-WordPress-1536x883.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/Consentimientos-cookies-WordPress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<p>Está pensado para la parte de la tabla en la que probablemente está tu web, la de los grandes, y la idea es que <strong>no cambies de plugin de cookies, no abras cuenta en ningún servicio y las filas se queden en la base de datos de tu WordPress</strong>.</p>
<p>Cada decisión guarda su identificador, las categorías que quedaron activas, el estado del banner, la versión de lo que se mostró, la normativa aplicada, la IP truncada, la página y un sello SHA-256 para detectar si alguien la ha modificado.</p>
<p>Lo que depende de la web y no del visitante (qué banner, qué versión, qué normativa) lo firma tu servidor al generar la página, así que el navegador no puede mentir sobre eso.</p>
<p>Trae también una pestaña de cookies con filtros, <strong>exportación a CSV</strong>, un <strong>certificado imprimible</strong> con el historial de un identificador y una comprobación en los ajustes que te dice si están llegando decisiones y cuándo llegó la última, que es justo el aviso que necesitas para no quedarte con un registro mudo sin saberlo.</p>
<p>Y esto es lo que tienes que saber antes de instalarlo:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li><strong>Para empezar reconoce Complianz</strong>, que es el más instalado. Los adaptadores para CookieYes y Moove están en camino, se van a incorporar en las siguientes versiones.</li>
<li>Si tu banner de cookies no lo reconoce aún hay un modo para engancharlo (unas reglas fijas, con un filtro en PHP y una llamada en JavaScript) y una vía para implementarlo desde un fragmento de código tuyo. Es el mismo camino que usa el adaptador de Complianz, pero el trabajo es tuyo o de quien te lleve la web.</li>
<li>No sustituye a tu banner, no bloquea scripts, no escanea cookies y no muestra nada en la parte pública de la web, solo escucha y guarda.</li>
<li><strong>Pone una cookie propia, <code>tccl_cid</code>, pero solo cuando el visitante ya ha decidido en tu banner</strong>, así que a quien solo lee no le pone nada. Lleva un identificador aleatorio que genera tu servidor, no se puede leer desde JavaScript y es lo que une las decisiones de una misma persona. Tienes que declararla en tu política de cookies como estrictamente necesaria.</li>
<li><strong style="font-size: 16px;">Si ya pagas el Premium de Complianz o el de Moove, no lo necesitas</strong><span style="font-size: 16px;">, porque ya tienes el registro integrado y dos plugins haciendo lo mismo solo te dan trabajo. Y si usas Real Cookie Banner, SureCookie o Pressidium, tampoco, pero si usas uno de esos plugins de cookies que te cobran por el registro con este te ahorras esa parte, literalmente.</span></li>
</ul>
</li>
</ul>
<p>Si usas Complianz hay otra vía que ya te conté en <a href="https://ayudawp.com/registro-consentimiento-cookies-formularios-pedidos/">la guía sobre el registro de consentimientos</a>, y es <a href="https://es.wordpress.org/plugins/record-of-consent-extension-for-complianz/">Record of Consent Extension for Complianz</a>, de davidevalerio. Es gratis y le añade el registro a Complianz gratuito, con su sello SHA-256 y su exportación. La diferencia es que se queda ahí, en Complianz y en las cookies, y si algún día cambias de banner, o si además tienes tienda o formularios, con el mío todo acaba en el mismo sitio.</p>
<h2>Cómo elegir plugin de cookies con registro legal (enresumiendo)</h2>
<p>Si tu web necesita cookies que pidan consentimiento, todo se reduce a tres caminos:</p>
<ol>
<li><strong>Un plugin top, con registro de aceptación de cookies de pago:</strong> Si usas Complianz o Moove, paga el Premium y activa el registro. Con CookieYes, conecta la cuenta y elige un plan que cubra tus visitas. Es la vía con menos piezas y, si tu web factura, probablemente la que más sentido tiene. Solo te queda preguntar dónde se guarda el registro y durante cuánto tiempo.</li>
<li><strong>Un plugin con registro de aceptación de cookies gratis:</strong> Si la web es nueva o el banner que tienes te da igual, Real Cookie Banner, SureCookie o Pressidium te dan el banner y la prueba en el mismo paquete, en tu base de datos y sin pagar. Si ya usas uno de ellos, haz la prueba de la ventana privada para confirmar que el registro funciona y a otra cosa.</li>
<li><strong>Tu plugin de cabecera pero con el registro de aceptación de cookies gratis de Cookies, Terms &amp; Conditions Consent Log:</strong> Si no quieres tocar un banner que funciona ni pagar por el registro, mantienes tu plugin de cookies y este guarda las decisiones en tu WordPress. De serie funciona con Complianz, y con CookieYes y Moove funcionará cuando lleguen sus adaptadores o si lo enganchas tú mientras tanto. Además, de paso registra todos los consentimientos de tu web, tienda o lo que tengas, una carencia que no cubre ni WordPress ni otros plugins.</li>
</ol>
<p>Lo que no haría en ningún caso es quedarme como estoy pensando que el banner, por estar puesto, ya demuestra algo. <strong>El banner pide permiso, pero la prueba de que te lo dieron hay que guardarla en algún sitio.</strong></p>
<p>A partir de aquí la decisión es tuya, que cada web es un mundo. Si usas un plugin de cookies que no está en la tabla porque no llega a 10.000 instalaciones, dímelo en los comentarios y lo miro, que leer su código es media hora. Y si alguno de los quince cambia su versión gratuita y te enteras antes que yo, avísame y actualizo la tabla con la fecha, porque esto caduca rápido.</p>
<p>Para todo lo demás, incluso para discutirme la tabla, me tienes ahí abajo, en los comentarios. El banner lo ve cualquiera que entra en tu web. La prueba solo te la pedirán un día, y ese día ya llegas tarde para empezar a guardarla.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/registro-consentimientos-cookies/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>¿Por qué me sale una F en el análisis de cabeceras de seguridad si están bien puestas?</title>
		<link>https://ayudawp.com/cabeceras-seguridad-php/</link>
					<comments>https://ayudawp.com/cabeceras-seguridad-php/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 09 Nov 2026 07:28:55 +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[Cabeceras]]></category>
		<category><![CDATA[CSP]]></category>
		<category><![CDATA[HSTS]]></category>
		<category><![CDATA[Vigilante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160683</guid>

					<description><![CDATA[Si has añadido las cabeceras de seguridad HTTP al .htaccess, tu hosting te jura que todo está en orden y aun así comprobadores como el de securityheaders.com te siguen plantando una F como una casa, bienvenido al club]]></description>
										<content:encoded><![CDATA[<p>Si has añadido las <strong>cabeceras de seguridad HTTP</strong> al <code>.htaccess</code>, tu hosting te jura que todo está en orden y aun así comprobadores como el de securityheaders.com te siguen plantando una F como una casa, bienvenido al club. Lo más probable es que no las hayas escrito mal, que no te falte ningún módulo y que tu plugin de seguridad no esté roto.</p>
<p><strong>Hay alojamientos en los que el servidor pone esas cabeceras en los archivos (imágenes, CSS, JavaScript) pero no en las páginas que fabrica WordPress</strong>, que son justo las que mira cualquier test. Tiene arreglo, que es enviarlas desde PHP, y si usas caché de página hay que hacerlo desde un sitio muy concreto, el <code>wp-config.php</code>.</p>
<p>Me ha pasado esta misma semana con la web de un cliente, así que te cuento cómo lo encontré, cómo saber en dos minutos si es tu caso y qué líneas poner. Vamos a verlo con calma.</p>
<h2>Mecagoenlalecheylamadrequeparióalassecurityheaders!!</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160686 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/F-en-security-headers-1200x699.jpg" alt="" width="1200" height="699" srcset="https://ayudawp.com/wp-content/uploads/2026/10/F-en-security-headers-1200x699.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/F-en-security-headers-768x448.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/F-en-security-headers-1536x895.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/F-en-security-headers.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>La web está en un plan compartido de hosting, con <a href="https://ayudawp.com/tag/dietpress/" target="_blank" rel="noopener">ese plugin de caché tan bueno del que usted me habla</a> y <a href="https://ayudawp.com/tag/vigilante/" target="_blank" rel="noopener">el mejor plugin que hay para asegurar WordPress</a>. Las ocho cabeceras estaban en el <code>.htaccess</code>, bien escritas, cada una en su línea y dentro de su bloque.</p>
<p>El resultado en securityheaders.com una <strong>F con las seis cabeceras que comprueba en rojo</strong>, y el análisis del propio Vigilante decía lo mismo, que las tenía activadas pero que al navegador no le llegaba ninguna.</p>
<p><a href="https://ayudawp.com/?attachment_id=160687" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160687 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/vigilante-probar-cabeceras-el-servidor-no-las-aplica-1200x570.jpg" alt="" width="1200" height="570" srcset="https://ayudawp.com/wp-content/uploads/2026/10/vigilante-probar-cabeceras-el-servidor-no-las-aplica-1200x570.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/vigilante-probar-cabeceras-el-servidor-no-las-aplica-768x365.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/vigilante-probar-cabeceras-el-servidor-no-las-aplica-1536x730.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/vigilante-probar-cabeceras-el-servidor-no-las-aplica.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Le pedí al cliente que preguntara al soporte del alojamiento y la respuesta fue que todo estaba normal. De propina le dijeron que los permisos de escritura estaban correctos, que es algo que no les había preguntado.</p>
<h2>¿Quién tiene razón? ¿todos o ninguno?</h2>
<p>Antes de echarle la culpa a nadie me puse a medir, que es lo que hay que hacer siempre, y lo que salió fue esto:</p>
<table>
<thead>
<tr>
<th>Lo que pedí al servidor</th>
<th>Quién lo sirve</th>
<th>¿Llegan las cabeceras?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Una imagen y una hoja de estilos</td>
<td>El servidor, directamente</td>
<td>Sí, las ocho</td>
</tr>
<tr>
<td>Un archivo bloqueado (error 403)</td>
<td>El servidor</td>
<td>Sí, las ocho</td>
</tr>
<tr>
<td>La redirección de http a https</td>
<td>El servidor</td>
<td>Sí, las ocho</td>
</tr>
<tr>
<td>La portada</td>
<td>WordPress (PHP)</td>
<td>Ninguna</td>
</tr>
<tr>
<td>La pantalla de acceso</td>
<td>WordPress (PHP)</td>
<td>Ninguna de las mías, solo las tres que WordPress pone ahí por su cuenta</td>
</tr>
<tr>
<td>La API REST</td>
<td>WordPress (PHP)</td>
<td>Ninguna de las mías, solo una que pone WordPress</td>
</tr>
</tbody>
</table>
<p>O sea, que todo bien pero nada funciona como debe. El módulo de Apache que añade las cabeceras (<code>mod_headers</code>) estaba activo y trabajando, y el <code>.htaccess</code> se leía sin problema. <strong>Lo que no hacía el servidor era aplicar esas reglas a nada que saliera de PHP</strong>, y en un WordPress de PHP sale todo lo que importa.</p>
<p>Cuando ves la tabla entera se entiende por qué cada uno defendía lo suyo: el hosting miraba el servidor, el test miraba la página, y los dos decían la verdad.</p>
<h2>Si todos tienen razón y todo está bien, ¿qué coño pasa?</h2>
<p>Fíjate en la columna del medio de la tabla. Lo que sirve el propio servidor, sea un archivo, un error o una redirección, sale con las cabeceras puestas, porque es el servidor quien aplica las reglas del <code>.htaccess</code> al preparar la respuesta. Las páginas de WordPress, en cambio, las genera PHP, y el servidor se limita a pasarle al navegador lo que PHP le devuelve, sin aplicarle esas reglas.</p>
<p>En muchos alojamientos compartidos PHP se ejecuta como CGI (una forma de trabajar en la que el servidor le pasa el encargo a un programa aparte y devuelve tal cual lo que este le entrega). En esa configuración las reglas de cabeceras del <code>.htaccess</code> no tocan la respuesta de PHP.</p>
<p>No me lo invento yo. cPanel lo tiene documentado para su manejador CGI: <a href="https://support.cpanel.net/hc/en-us/articles/360052828293-How-can-I-ensure-that-response-headers-set-in-the-htaccess-file-are-sent">con ese manejador no se pueden enviar cabeceras de respuesta desde el <code>.htaccess</code></a>, y las salidas que propone son cambiar de manejador o enviarlas desde PHP.</p>
<p>Ahora bien, el alojamiento de mi cliente no tiene nada publicado sobre esto (o yo no he sabido encontrarlo), así que <strong>la causa exacta en su plataforma es una deducción mía; lo que está medido es el síntoma</strong>. Si trabajas en algún alojamiento y sabes cómo lo tenéis montado, los comentarios son tuyos.</p>
<h2>Cómo saber si te está pasando</h2>
<p>No te fíes de mi tabla, haz la tuya. Solo tienes que comparar las cabeceras de una página con las de un archivo de la misma web.</p>
<p>Desde el navegador, sin instalar nada:</p>
<ol>
<li>Abre tu web y pulsa F12 para sacar las herramientas de desarrollo.</li>
<li>Ve a la pestaña «Red» (o «Network») y recarga la página.</li>
<li>Haz clic en la primera línea de la lista, la que lleva el nombre de tu dominio, y mira el apartado «Cabeceras de respuesta».</li>
<li>Ahora haz clic en cualquier imagen o archivo <code>.css</code> de la lista y mira lo mismo.</li>
</ol>
<p>Si te apañas con la terminal es todavía más rápido, porque todos los WordPress traen de serie esta imagen:</p>
<pre>curl -sI https://tudominio.com/ | grep -iE "x-frame|content-security|strict-transport"
curl -sI https://tudominio.com/wp-includes/images/w-logo-blue.png | grep -iE "x-frame|content-security|strict-transport"</pre>
<p>Y según lo que veas:</p>
<ul>
<li><strong>Salen en la imagen y no en la página:</strong> es tu caso, sigue leyendo.</li>
<li><strong>No salen en ninguna de las dos:</strong> tu problema es otro (el módulo no está activo, el servidor no lee el <code>.htaccess</code> o directamente usas Nginx). Repasa <a href="https://ayudawp.com/cabeceras-seguridad-http-wordpress/">la guía de cabeceras de seguridad HTTP</a>, que ahí están los tres métodos.</li>
<li><strong>Salen en las dos:</strong> enhorabuena, no toques nada, y sobre todo no añadas lo que viene a continuación.</li>
</ul>
<h2>La solución de siempre se queda a medias, también la de mi generador</h2>
<p>Lo primero que se te ocurre, y lo que yo mismo tengo publicado como alternativa, es mandar las cabeceras desde WordPress con una función en el <code>functions.php</code> o en un plugin. Es lo que te da en su formato PHP <a href="https://herramientas.ayudawp.com/security-headers/">mi generador de cabeceras de seguridad</a>.</p>
<p>Y funciona, hasta que entra en juego la caché de página.</p>
<p>Muchos plugins de caché guardan una copia de cada página ya montada y la entregan desde PHP nada más empezar la petición, con un archivo llamado <code>advanced-cache.php</code> que WordPress carga antes que los plugins y el tema. Tu función no llega a ejecutarse, así que <strong>las páginas en caché, que son las que recibe casi todo el mundo y las que revisa el test, salen sin cabeceras</strong>.</p>
<p>En la web de mi cliente se veía clarísimo. Había una cabecera que el plugin enviaba por PHP, y aparecía en la portada si la pedías saltándote la caché pero desaparecía en la portada normal.</p>
<blockquote><p>Si tu web usa caché de página, lo que envíe un plugin o el <code>functions.php</code> no llega a las páginas que de verdad ve la gente.</p></blockquote>
<h2>Lo que sí funciona: enviarlas desde wp-config.php</h2>
<p>¿Y por qué desde ahí?, pues porque <strong>el <code>wp-config.php</code> es el único archivo tuyo que WordPress lee antes de que <code>advanced-cache.php</code> entregue la página</strong>. Va el primero de todos, después viene la caché y solo si la caché no tiene copia se cargan los plugins y el tema.</p>
<p>Los pasos:</p>
<ol>
<li>Haz una copia del <code>wp-config.php</code> antes de tocar nada. [ENLAZAR: artículo sobre cómo editar wp-config.php]</li>
<li>Saca tus cabeceras del <a href="https://herramientas.ayudawp.com/security-headers/">generador</a>, en el formato «PHP snippet».</li>
<li>Copia <strong>solo las líneas que empiezan por <code>header(</code></strong>. Ni la línea de <code>function</code>, ni la llave que la cierra, ni el <code>add_action</code> del final.</li>
<li>Pégalas en tu <code>wp-config.php</code> dentro del bloque que te dejo aquí abajo, justo encima de la línea que carga <code>wp-settings.php</code> (la última del archivo, bajo el comentario de «eso es todo, deja de editar»).</li>
<li>Vacía la caché de página y vuelve a pasar el test.</li>
</ol>
<p>Ojo con el paso 3, que tiene más miga de la que parece: <strong>si pegas el fragmento entero, con su <code>add_action</code>, la web se queda en blanco con un error fatal</strong>, porque en ese punto esa función de WordPress todavía no existe.</p>
<p>El bloque queda así:</p>
<pre>/* Cabeceras de seguridad por PHP: en este alojamiento las del .htaccess no llegan a las páginas. */
if ( 'cli' !== PHP_SAPI &amp;&amp; ! headers_sent() ) {
	header( 'X-Frame-Options: SAMEORIGIN' );
	header( 'X-Content-Type-Options: nosniff' );
	header( 'Referrer-Policy: strict-origin-when-cross-origin' );
	header( 'Strict-Transport-Security: max-age=31536000' );
	header( 'Permissions-Policy: geolocation=(), microphone=(), camera=()' );

	// La CSP, fuera del escritorio de WordPress.
	if ( ! defined( 'WP_ADMIN' ) ) {
		header( "Content-Security-Policy: PON AQUÍ LA TUYA" );
	}
}</pre>
<p>Tres detalles de ese código, para que sepas qué estás pegando:</p>
<ul>
<li><strong><code>'cli' !== PHP_SAPI</code></strong> evita que se intenten mandar cabeceras cuando alguien trabaja con WP-CLI (la línea de comandos de WordPress), donde no hay navegador al otro lado.</li>
<li><strong><code>! headers_sent()</code></strong> es el cinturón de seguridad de siempre: si por lo que sea ya ha salido contenido, no se intenta nada.</li>
<li><strong><code>! defined( 'WP_ADMIN' )</code></strong> deja la política de contenido (CSP) fuera del escritorio, que es donde más cosas rompe. WordPress define esa constante al entrar en <code>wp-admin</code> antes de leer este archivo, así que aquí ya se puede preguntar por ella.</li>
</ul>
<p>Y una advertencia que vale para cualquier método: la línea de <code>Strict-Transport-Security</code> solo si toda tu web funciona ya por https.</p>
<p>En la web de mi cliente, después de pegar sus líneas, las ocho cabeceras llegaban a la portada (con caché y sin ella), a la API REST y a los archivos, y ninguna repetida. [DATO: la nota que te dio después securityheaders.com.]</p>
<h2>Ojo con estas cinco cosas</h2>
<ul>
<li><strong>No quites las del <code>.htaccess</code>.</strong> Las imágenes, los estilos y los <em>scripts</em> no pasan por PHP, así que siguen dependiendo de él. Lo del <code>wp-config.php</code> se suma, no lo sustituye.</li>
<li><strong>No lo pongas «por si acaso».</strong> Si en tu hosting el <code>.htaccess</code> sí alcanza a las páginas, saldrían dos veces, y unas cabeceras duplicadas o contradictorias pueden acabar sin servir de nada (lo explican bien <a href="https://really-simple-ssl.com/how-to-find-where-security-headers-are-set/">en la documentación de Really Simple Security</a>). Primero la prueba, después la receta.</li>
<li><strong>Si cambias de alojamiento, repite la prueba.</strong> Lo que hoy hace falta, en el servidor nuevo puede sobrar.</li>
<li><strong>Tu plugin de seguridad te avisará de que el <code>wp-config.php</code> ha cambiado.</strong> Es lo que tiene que hacer. Lo has cambiado tú, así que lo apruebas y a otra cosa.</li>
<li><strong>Los valores quedan en dos sitios.</strong> Si un día retocas tu CSP, acuérdate de cambiarla en los dos.</li>
</ul>
<p>Y lo más importante, que no quiero venderte una receta universal: <strong>esto está medido en una web, en un alojamiento y con un plugin de caché</strong>. Hay cachés que entregan sus páginas como archivos sueltos sin pasar por PHP, y ahí serían las reglas del <code>.htaccess</code> las que hicieran el trabajo. Por eso insisto tanto en que compares antes de pegar nada.</p>
<h2>¿Qué hago ahora?</h2>
<ol>
<li>Compara las cabeceras de una página con las de una imagen de tu web.</li>
<li>Si solo salen en la imagen, pasa tus cabeceras al <code>wp-config.php</code> como te he contado, sin tocar las del <code>.htaccess</code>.</li>
<li>Vacía la caché y vuelve a comprobarlo.</li>
<li>Si no es tu caso, no hagas nada. En serio.</li>
</ol>
<p>Si todavía no tienes cabeceras de seguridad y has llegado aquí de rebote, empieza por <a href="https://ayudawp.com/cabeceras-seguridad-http-wordpress/">qué son y cómo se añaden</a> y créalas con <a href="https://herramientas.ayudawp.com/security-headers/">el generador</a>, que para eso lo hice.</p>
<p>Y si te pasa lo mismo en otro alojamiento, cuéntalo ahí abajo, en los comentarios, que entre todos sabremos a cuánta gente le afecta. A mí me costó un buen rato de medir y un soporte convencido de que no pasaba nada. A ti, con suerte, dos minutos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/cabeceras-seguridad-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP2Shell una semana después, 22 fallos tapados y Google que no gana con su modo IA #CrónicasWordPress</title>
		<link>https://ayudawp.com/php2shell-una-semana-despues-22-fallos-tapados-y-google-que-no-gana-con-su-modo-ia-cronicaswordpress/</link>
					<comments>https://ayudawp.com/php2shell-una-semana-despues-22-fallos-tapados-y-google-que-no-gana-con-su-modo-ia-cronicaswordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Fri, 06 Nov 2026 13:20:33 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[#CrónicasWordPress]]></category>
		<category><![CDATA[#DoctorWordPress]]></category>
		<category><![CDATA[#TrucosWordPress]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160898</guid>

					<description><![CDATA[Una actualización de WordPress con 22 fallos corregidos, el balance del PHP2Shell una semana después, la beta 2 de WordPress 7.2, el plan para conectar tu agente de IA a WordPress y unas cuantas malas noticias de Google, que ya empieza a ser costumbre.]]></description>
										<content:encoded><![CDATA[<p>Esta semana solo hubo un directo, las <strong>Crónicas WordPress del lunes 2 de noviembre</strong>, porque el miércoles no pude hacer Doctor WordPress (ni trucos ni nada, lo siento). Eso sí, el lunes no faltó tema: una actualización de WordPress con 22 fallos corregidos, el balance del PHP2Shell una semana después, la beta 2 de WordPress 7.2, el plan para conectar tu agente de IA a WordPress y unas cuantas malas noticias de Google, que ya empieza a ser costumbre.</p>
<p>Te lo resumo aquí y al final tienes el vídeo completo, por si prefieres verlo entero.</p>
<h2>Crónicas WordPress: PHP2Shell una semana después, WordPress y la web agéntica, y la verdad sobre los AI Overviews</h2>
<h3>WordPress 7.1.4: 22 fallos corregidos y uno ya en el punto de mira</h3>
<p>Empecé por lo urgente. El 28 de octubre salió <strong>WordPress 7.1.4, una versión de seguridad que corrige nada menos que 22 fallos</strong>, y uno de ellos ya lo están intentando explotar los malos (y lo digo con la palabra más suave que tengo).</p>
<p>El más serio lo encontró Umut Bayram y tiene una mecánica curiosa. Cuando WordPress se actualiza con el paquete completo deja una copia temporal de la nueva versión en una carpeta con un nombre que se puede adivinar, y en esa copia está el instalador, el <code>setup-config.php</code> que usas cuando montas una web desde cero. Si el servidor deja acceder a esa carpeta desde fuera y el atacante llega en el momento justo, puede usar ese instalador para ejecutar el código que le dé la gana.</p>
<p>La ventana dura unos segundos y tienen que cumplirse varias condiciones, así que una petición lanzada a lo loco no funciona. El problema es que los atacantes no prueban una vez, prueban miles: según Wordfence, en las primeras 20 horas su regla contó unas 18.500 peticiones a esas rutas, y The Hacker News habla de 63.000 ataques bloqueados en 24 horas.</p>
<p><strong>Comprueba que tienes la 7.1.4 y, si no, ya vas tarde.</strong> Las actualizaciones automáticas de seguridad son tu mejor protección, aunque este fallo atacara precisamente las actualizaciones completas. Y nada de tener una web al día y otra no: todas, siempre.</p>
<h3>De 20 informes al mes a 773: la IA ha cambiado el trabajo del equipo de seguridad</h3>
<p>El equipo de seguridad de WordPress ha publicado el balance de los dos primeros meses de la Core Security Initiative, que trabaja en tres frentes.</p>
<ul>
<li>Un proceso de publicación con un equipo fijo para cada versión y papeles muy claros, desde quién prepara el parche hasta quién activa las actualizaciones automáticas, y con los arreglos llegando hasta a 25 ramas antiguas de forma automatizada, cuando antes se hacía a mano.</li>
<li>El atasco de informes: desde el 1 de septiembre acotaron qué se considera un fallo de impacto real y montaron un sistema de triaje con IA que reproduce cada informe y propone una recomendación. Llevan casi 3.000 informes cerrados este año.</li>
<li>Buscar fallos antes que nadie con esa misma herramienta, con análisis de Anthropic que ya aparecen en los créditos de la 7.1.4 (y que vas a ver cada vez más).</li>
</ul>
<p>Además piden a las empresas del sector que patrocinen gente para el triaje o aporten al programa de recompensas. <strong>Ese dato de 773 informes al mes explica por qué tenemos una versión de seguridad casi cada dos semanas.</strong> Ojo, no significa que WordPress sea más inseguro que nunca, significa que la IA ha abaratado muchísimo encontrar fallos, para los buenos y para los malos, y la única respuesta posible es usarla también para defenderse. Que cuenten todos los números con esta transparencia me parece una gran noticia.</p>
<h3>PHP2Shell, una semana después: ninguna web WordPress comprometida</h3>
<p>Esta es la buena noticia de la semana: <strong>una semana después del parche no se ha confirmado ni un solo sitio WordPress comprometido por PHP2Shell.</strong> Hablamos de una vulnerabilidad de PHP que dejaba media Internet expuesta, y WordPress está hecho en PHP, así que chapó por las empresas de hosting, que se han dado un buen meneo.</p>
<p>La parte mala es que los intentos no paran (se han medido 27 contra WordPress, todo medido, que es lo bueno de los datos) y fuera de WordPress sí hay muchos casos documentados de webs afectadas con otros sistemas en PHP. Que los ataques fallen tan a menudo tiene que ver con cómo esté compilado PHP, las extensiones, los límites de memoria y un montón de detalles más, o sea, que <strong>dependemos muchísimo del hosting y hay que elegirlo muy bien.</strong> No quiero decir nada, pero el mío había parcheado todo antes de que saliera la versión corregida de PHP. Ahí lo dejo.</p>
<p>Si todavía no te has puesto al día, en mi <a href="https://ayudawp.com/php2shell/">guía sobre PHP2Shell</a> te explico cómo comprobar tu versión de PHP en Salud del sitio y qué versiones están parcheadas (en la rama 8.5, la 8.5.12 o posteriores). También te dejé un miniplugin en mi <a href="https://github.com/fernandotellado">GitHub</a> que añade esa comprobación a Salud del sitio, y en Vigilante he metido una comprobación específica para PHP2Shell. Y por favor, <strong>no uses los escáneres que circulan por GitHub: son peligrosos, todos.</strong></p>
<h3>¿Quién fuerza el HTTPS en tu WordPress?</h3>
<p>Otra cosa de seguridad que os comenté es un caso raro que me he encontrado en bastantes webs de clientes: visitas que entran unas veces por HTTP y otras por HTTPS según la configuración. Hay como seis sitios distintos que pueden decidir eso (la CDN, el hosting, su panel, el plugin de seguridad, el <code>wp-config.php</code>, el <code>.htaccess</code>…) y a veces se contradicen entre ellos.</p>
<p>Lo tienes explicado con todos los actores de la película en <a href="https://ayudawp.com/https-http/">este artículo sobre HTTPS y HTTP</a>. <strong>Tu web tiene que servirse siempre por HTTPS, sí o sí</strong>, así que no dejes de revisarlo.</p>
<h3>Comunidad: adiós a las colas en las WordCamp y dos peticiones de feedback</h3>
<p>Muy buena noticia para quien va a WordCamps: el sistema de entradas de WordCamp.org ya permite registrar a los asistentes escaneando un código QR con el móvil. Se ha probado en varias WordCamp y funciona muy bien, así que <strong>se acabaron las colas en las acreditaciones.</strong></p>
<p>Además hay dos peticiones de opinión abiertas a todo el mundo, desde quien envía código hasta usuarios normales y empresas de hosting: Anne McCarthy pide feedback sobre los posts de hoja de ruta que se publican antes de cada versión, y el equipo de formación pide ayuda para revisar los itinerarios de Learn WordPress (usuarios, desarrolladores y diseñadores), con el eterno problema de la formación: haces un tutorial con capturas y a las tres versiones ya está caducado. Toda esta gente es voluntaria, así que <strong>si te piden feedback, dáselo</strong>, que son cinco minutos de encuesta.</p>
<h3>WordPress 7.2 beta 2 (y una beta 3 adelantada), más Gutenberg 24.3</h3>
<p>WordPress 7.2 va viento en popa y está prevista para el <strong>8 de diciembre de 2026</strong>. Ya vamos por la beta 3, que se adelantó por temas de seguridad y salió al día siguiente de la 7.1.4.</p>
<p>Lo más relevante para desarrolladores es que la Abilities API, la API de capacidades (la forma en la que los plugins declaran qué se puede hacer con ellos en WordPress), gana consultas de contenido, control de permisos e incluso la posibilidad de registrar desde PHP vistas de datos y formularios para el nuevo escritorio. También ha salido Gutenberg 24.3, con novedades en formatos de texto.</p>
<p><strong>Todo lo que llega en estas betas va de dejar WordPress preparado para que lo gestionen otros, sean plugins o IA.</strong> Y me parece lógico: la IA es la herramienta más potente que ha salido en años y WordPress tiene que adaptarse sí o sí.</p>
<h3>Una campanita para todos los avisos: así podrían ser las notificaciones de WordPress</h3>
<p>Hay en marcha un nuevo sistema de notificaciones (no tengo claro si para la 7.3 o más adelante) que sustituiría el horror actual de avisos de plugins en el escritorio por una campanita con contador, muy al estilo de las notificaciones de Jetpack. Tampoco se han roto mucho la cabeza, pero no me parece mal.</p>
<p>Lo que tenemos ahora es infumable: <strong>una cosa es avisar «oye, pásate por los ajustes» y que el aviso desaparezca, y otra los avisos pesados que no se quitan ni con agua caliente</strong>, sobre todo los de quien vende cosas premium. La campanita tiene sus contras, porque se te puede pasar algo importante, pero en mi opinión tiene más pros que contras. ¿Tú qué piensas? Me lo cuentas en los comentarios.</p>
<h3>WooCommerce 11.3 en beta y cómo encadenar rebajas sin saltarte la ley</h3>
<p>WooCommerce está superactivo y ya tiene la 11.3 en beta, con más estilos en los bloques, una galería de producto mejorada sobre todo en móviles, mejoras en las API y en MCP (Model Context Protocol, el protocolo para conectar con las IA) y, por fin, <strong>la etiqueta de oferta con porcentaje de descuento</strong>, algo que hasta ahora había que hacer con código.</p>
<p>Hablando de ofertas, os compartí un artículo sobre <a href="[ENLAZAR:%20art%C3%ADculo%20sobre%20encadenar%20rebajas%20en%20WooCommerce]">cómo encadenar rebajas de Black Friday, Navidad y enero sin saltarte la ley</a>. La directiva europea 2019/2161 (la Ómnibus) obliga a que cada rebaja se anuncie contra el precio más bajo que tuvo el producto en los 30 días anteriores. Si una camiseta de 29,99 € baja a 19,99 € en Black Friday, en Navidad no puedes anunciar una rebaja a 20,99 € porque es más cara que en Black Friday, y si en enero la pones a 17,99 € el descuento que puedes anunciar es de un 14 % sobre los 20,99 € de Navidad, no de un 40 %.</p>
<p><strong>WooCommerce lo hace mal porque siempre compara con el precio normal, ya que no guarda el histórico de precios</strong>, así que hoy por hoy toca resolverlo con plugins. Y con Black Friday el 27 de noviembre, tienes menos de un mes para dejarlo bien atado en tu tienda.</p>
<h3>Los fosos que todavía protegen a los negocios de plugins de la IA</h3>
<p>Comenté un análisis de Jean Galea en WP Mayor sobre cómo la IA amenaza los negocios de plugins: copiar funciones sale tan barato que ya no protegen ni las funcionalidades, ni el código ingenioso, ni el SEO. Tu cliente se lo hace él mismo y tus competidores te igualan en horas, no en meses. Y curiosamente <strong>el código abierto está más expuesto que el cerrado</strong>, porque basta con decirle a la IA «mírame este plugin y hazme uno igual, más esto, más lo otro, adaptado a lo mío».</p>
<p>Mi visión, que me ha pasado: no te metas a lo loco a hacer megaplugins, porque luego hay que mantenerlos y se te va de las manos. <strong>Los plugins pequeños para cosas pequeñas háztelos a medida, pero los grandes, que los mantenga otro (y que se gaste otro los tokens)</strong>, porque ahí necesitas coordinarte con otros plugins y servicios, y lo tuyo es dedicarte a tu negocio. Llámame loco si me equivoco.</p>
<h3>WordPress para la web agéntica: el plan para conectar tu agente de IA a tu web en la 7.3</h3>
<p>Para mí, la gran noticia de la semana. Jason Adams ha publicado un post imprescindible donde queda claro que <strong>la idea ya no es meter un agente dentro de WordPress, sino que WordPress esté preparado para el agente de IA que use cada uno.</strong> Hay cuatro líneas de trabajo.</p>
<ul>
<li>El adaptador MCP, que hasta ahora era un plugin (primero en GitHub, ya en WordPress.org), se integrará en el núcleo, con la idea de meterlo en la 7.3.</li>
<li>Las abilities o capacidades, para que el agente sepa qué puede hacer en tu WordPress y en tus plugins cuando se conecta.</li>
<li>Identificación mediante OAuth, básicamente por ChatGPT, que es el único que no se conecta directamente por MCP.</li>
<li>Que todo esto junto te permita usar tu web, tus plugins y todo lo que tienes desde el escritorio de WordPress o desde tu chatbot, como prefieras.</li>
</ul>
<p>O sea, que puedas decirle a tu chatbot «conéctate a mi WordPress» con un par de clics y pedirle que te configure algo o te programe un post. Todos estamos esperando eso. El primer paso, la Abilities API, ya está dado, y el segundo es el adaptador MCP en el núcleo. Lo noto en mis propios plugins: uno de ellos usa ese adaptador y ahora tiene que pedirte que lo instales y lo actives, algo que dejará de hacer falta cuando esté en el core. <strong>Lo veo imprescindible.</strong></p>
<h3>Google y Bing te dejarán decir no al entrenamiento de IA sin salir de las búsquedas</h3>
<p>El 30 de octubre Google y Microsoft anunciaron casi a la vez nuevos controles basados en una propuesta del IETF (el organismo que define estándares en Internet) para expresar en el <code>robots.txt</code>, con una sola instrucción, si permites o no el entrenamiento de IA con tu contenido. Viene a ser algo parecido a las señales de contenido IA que propuso Cloudflare (tengo un plugin para eso que igual me cargo si esto prospera).</p>
<p><strong>La clave es separar el «aprende de mí» del «cítame»</strong>, que es lo que muchos venimos pidiendo: que puedas seguir apareciendo citado en Copilot, Claude o ChatGPT sin que usen tu web para entrenar gratis. Si usas <code>noarchive</code> o <code>nocache</code> para frenar a la IA de Bing, tendrás que pasarte a las nuevas directivas antes de marzo, y habrá una opción provisional en Bing Webmaster Tools a partir del 15 de diciembre de 2026. Google dice que no lo aplicará hasta 2027 y, claro, luego dependerá de qué empresas decidan respetarlo.</p>
<p>Si quieres ir adelantando, te recuerdo la guía que publiqué la semana pasada sobre <a href="[ENLAZAR:%20art%C3%ADculo%20sobre%20nosnippet%20y%20data-nosnippet]">nosnippet y data-nosnippet</a>.</p>
<h3>Salir de las respuestas con IA de Google también te quita clics normales</h3>
<p>Y precisamente sobre <code>nosnippet</code> hay un experimento que cuenta Barry Schwartz en Search Engine Roundtable: Cyrus Shepard activó un ajuste para sacar una web de las respuestas con IA de Google y miró qué pasaba. Lo esperable era perder solo impresiones de poco CTR, pero <strong>también cayeron los clics de los resultados de siempre</strong>, sobre todo en las páginas con más visibilidad, que se recuperaron al volver a permitirlas. Y mientras tanto las vistas con IA siguieron saliendo para esas búsquedas, eso sí, sin citar la web. Tu contenido lo usan, pero no te citan.</p>
<p>Es un experimento con una sola web, pero cuidadito con cómo usas <code>nosnippet</code> y <code>data-nosnippet</code>. Haz tus propias cuentas.</p>
<h3>Google gana menos con los anuncios del modo IA (sorpresa de nadie)</h3>
<p>El director de negocio de Google, al presentar resultados, ha reconocido que <strong>monetizan menos con los anuncios del modo IA que con la búsqueda tradicional</strong>. Estaba yo esperando la noticia, porque ni me lo imaginaba (léase la ironía). El uso del modo IA crece más rápido que los ingresos por anuncios, y mientras tanto OpenAI amplía los anuncios de ChatGPT a 26 países más. Están todos experimentando con nosotros para seguir sacándonos el dinero, ahora a cambio de mucho menos o de nada.</p>
<p>En mi opinión Google no tiene modelo para pasar de un buscador de clics a un motor de respuestas, y esto va a ir a peor, como cualquier enfermedad que no se cura: <strong>si crear contenido no te devuelve nada, cada vez habrá menos creadores</strong>, porque nadie vive de compartir gratis y acabas dedicándote a otra cosa.</p>
<p>Mi propuesta, que no es tan complicada: que las respuestas con IA hagan su resumen y luego digan «si quieres aprender de verdad cómo hacerlo, visita esta web, que es de donde lo he aprendido yo, y es la más actualizada o la que tiene más autoridad». <strong>Respetar la autoridad de las fuentes es imprescindible, también para las propias IA, que si no se quedarán sin contenido para responder.</strong></p>
<h3>¿Sirve el favicon para el SEO?</h3>
<p>Ya que salimos en los resultados, aunque sea poco, me dio por investigar los favicons, esos iconitos que Google nunca ha quitado de sus resultados. Hace un par de semanas os hablé de los <a href="[ENLAZAR:%20art%C3%ADculo%20sobre%20plugins%20beta%20de%20WordPress]">plugins experimentales de WordPress</a>, y resulta que uno oficial convierte las imágenes sin avisar y te deja el icono en un formato que Google no admite. Te lo cuento en <a href="https://ayudawp.com/favicon-seo/">este artículo sobre el favicon y el SEO</a>, con cómo comprobar por qué no aparece el tuyo.</p>
<p>Para terminar, Rafa Ramos preguntó por <a href="[ENLAZAR:%20web%20del%20plugin%20Visibility]">Visibility</a>, mi plugin de SEO. Es como un Yoast o un Rank Math pero 100 % gratis (todos mis plugins en WordPress.org lo son) y con toda la adaptación agéntica incluida, porque no va a quedar más remedio que facilitar el contenido a las IA. Y le invité a venir a un Doctor WordPress a contarnos su visión del SEO y lo que mejoraría del plugin, porque si me propones algo bueno lo meto en cuanto tengo un rato.</p>
<p><strong>Vídeo completo:</strong> <a href="https://www.youtube.com/live/Y7-s1QNkotM">PHP2Shell una semana después, WordPress + IA + web agéntica y la verdad sobre los AI Overviews #CrónicasWordPress</a></p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="PHP2Shell una semana después, WordPress + IA + Agentic Web y la verdad sobre AI Overviews" width="1600" height="900" src="https://www.youtube.com/embed/Y7-s1QNkotM?feature=oembed&amp;enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<h2>Nos vemos el lunes</h2>
<p>El lunes vuelven las Crónicas WordPress a las 19:30, hora española, y el miércoles, si no se me tuerce otra vez la semana, Doctor WordPress. Todos los enlaces de lo que comento los tienes en la descripción del vídeo en YouTube, y si te quedas con alguna duda me tienes ahí abajo, en los comentarios. Y si todavía no lo has hecho, <a href="https://www.youtube.com/AyudaWordPressES">suscríbete al canal</a>, que es gratis y me das una alegría.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/php2shell-una-semana-despues-22-fallos-tapados-y-google-que-no-gana-con-su-modo-ia-cronicaswordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Puede Google penalizar tu web WordPress por spam sin que hayas hecho nada? Las 16 políticas explicadas para evitar una penalización</title>
		<link>https://ayudawp.com/politicas-spam-google/</link>
					<comments>https://ayudawp.com/politicas-spam-google/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 05 Nov 2026 07:28:03 +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[Experto]]></category>
		<category><![CDATA[Visibility]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160707</guid>

					<description><![CDATA[Google tiene 16 políticas de spam. Qué te puede tocar en WordPress sin hacer nada, qué haces tú con buena intención y cómo evitar la penalización.
]]></description>
										<content:encoded><![CDATA[<p>Resulta, por si no lo sabías, que hay motivos por las que <strong>Google puede acusar de spam a tu WordPress sin que hayas hecho nada</strong>, como un hackeo, los comentarios abiertos o un script de anuncios que no controlas. Y hay otras por las que también te puede caer todo su peso, aunque fuese con toda la buena intención del mundo, por ejemplo <strong>publicando 300 páginas con IA sin revisarlas</strong> o poniendo un enlace de pago sin marcarlo.</p>
<p><strong>Google tiene 16 políticas de spam y otras 4 prácticas que también pueden hacerte perder posiciones</strong>, y su <a href="https://developers.google.com/search/docs/essentials/spam-policies?hl=es" target="_blank" rel="nofollow noopener">página oficial</a> <strong>incluye en la definición de spam el intento de manipular las respuestas de IA</strong> generativa de Google Search. Total nada.</p>
<p>Y tampoco es algo como para asustarse, pues casi todas las políticas describen abusos bastante claros (esconder texto, enseñar una cosa a Google y otra a los usuarios, comprar enlaces para posicionar), lo que le interesa a un WordPress normal, como el tuyo o el mío, es conocer los <strong>casos grises en los que puede caer sin querer</strong>.</p>
<p>Eso es lo que vamos a ver, política por política, en concreto con la parte práctica en WordPress. Vamos a verlas ordenadas en tres grupos (lo que te puede tocar sin hacer nada, lo que haces con buena intención y también cuenta, y lo que casi nunca te afectará) y al final te cuento qué hacer si ya te ha tocado y qué plugins ayudan, con el anticipo que te hago ya de que ninguno hace milagros.</p>
<h2>Acción manual o el puto algoritmo ¿y cómo me entero de que Google me ha jodido?</h2>
<p>Antes de nada <strong>conviene separar dos cosas que se mezclan siempre</strong>. Google combina herramientas automáticas con revisión humana cuando hace falta, y de ahí salen dos formas muy distintas de que te afecte una política de spam.</p>
<ul>
<li><strong>Acción manual:</strong> la pone una persona del equipo de Google tras revisar tus páginas, y te avisa en el <a href="https://support.google.com/webmasters/answer/9044175?hl=es" target="_blank" rel="nofollow noopener">informe de acciones manuales</a> de Search Console y en el centro de mensajes. Dice que parte del sitio, o todo, puede dejar de aparecer en los resultados, y la salida es arreglarlo y pedir una revisión.</li>
<li><strong>El puto algoritmo:</strong> lo producen los sistemas automáticos y, que yo sepa, no avisa de nada ni tiene botón de revisión. Google dice que su detección de spam funciona de forma continua y que de vez en cuando la mejora de forma notable, y a eso lo llama «actualización de spam». Las tienes listadas en el <a href="https://status.search.google.com/summary" target="_blank" rel="nofollow noopener">Google Search Status Dashboard</a>, el panel de estado de la Búsqueda de Google, en el apartado de posicionamiento.</li>
<li><strong>Problemas de seguridad:</strong> es otro informe distinto, el de <a href="https://support.google.com/webmasters/answer/9044101?hl=es" target="_blank" rel="nofollow noopener">problemas de seguridad</a>, que es donde te avisa Google de un hackeo, de malware o de suplantación.</li>
</ul>
<p>Dos matices, por un lado el hecho de que te baje el tráfico la semana de una actualización de spam <strong>no quiere decir que tu web sea spam</strong>, porque hay muchas otras causas posibles. Y luego está que las acciones manuales de Search Console no se limitan a estas 16 políticas, porque también hay otras, como la de datos estructurados que no coinciden con el contenido de la página (de eso hablo de pasada en mi artículo sobre <a href="https://ayudawp.com/schemas-article-webpage/" target="_blank" rel="ugc noopener">qué tipo de Schema elegir</a>).</p>
<h2>La que te puede caer sin tener tú la culpa, o no del todo</h2>
<p>Aquí van las políticas que se activan por lo que otros hacen en tu web, o con tu web.</p>
<h3>Contenido pirateado, encubrimiento y redirecciones engañosas</h3>
<p>Un hackeo de los que buscan posicionar spam suele saltarse tres políticas a la vez, porque Google define el <strong>contenido pirateado</strong> como el que se coloca en tu sitio sin permiso aprovechando una brecha de seguridad, y lo reparte en inyección de código, de páginas y de contenido, más redirecciones que dependen de quién visita (el navegador, el dispositivo o si llegas desde un resultado de Google).</p>
<p>El <strong>encubrimiento</strong> es enseñar contenido distinto a los usuarios y a Google, y las <strong>redirecciones engañosas</strong> son mandarte con mala intención a otra dirección distinta de la que pediste (redirigir tiene usos legítimos, como mover un sitio o unir páginas).</p>
<p>En un WordPress sano no pasa ninguna de estas dos, y cuando pasa es casi siempre porque hay un código cabrón que decide qué servir según quién pregunte. Eso explica que tú entres a tu web y lo veas todo normal mientras Google ve un catálogo de pastillas para la tos (ya me entiendes).</p>
<p>La limpieza completa, con los tres niveles del ataque y los pasos en orden, la tienes en mi guía sobre <a href="https://ayudawp.com/spam-seo-injection/" target="_blank" rel="ugc noopener">spam SEO inyectado</a>, así que aquí no me enrollo. Lo que sí te dejo es una herramienta para hacer dos comprobaciones rápidas que valen en cualquier caso, buscar enlaces escondidos con CSS dentro de tus contenidos y comparar lo que recibe un visitante normal con lo que recibe un <code>Googlebot</code> falso.</p>
<p>Es un plugin de un solo archivo, sin ajustes, que solo lee (no guarda ni cambia nada) y que borras en cuanto termines:</p>
<pre>&lt;?php
/**
 * Plugin Name: AyudaWP - Comprobación de spam para Google
 * Description: Herramienta temporal y de solo lectura. Busca enlaces escondidos en tus contenidos y compara lo que ve un visitante con lo que ve un Googlebot falso.
 * Plugin URI: https://plugins.ayudawp.com/
 * Version: 1.0.0
 * Author: Fernando Tellado
 * Author URI: https://ayudawp.com/
 * License: GPLv2 or later
 * Text Domain: ayudawp-spam-check
 */

defined( 'ABSPATH' ) || exit;

/**
 * Add the tool page under Tools.
 */
function ayudawp_spam_check_menu() {
	add_management_page(
		__( 'Comprobación de spam', 'ayudawp-spam-check' ),
		__( 'Comprobación de spam', 'ayudawp-spam-check' ),
		'manage_options',
		'ayudawp-spam-check',
		'ayudawp_spam_check_page'
	);
}
add_action( 'admin_menu', 'ayudawp_spam_check_menu' );

/**
 * Render the tool page and run the check the user asked for.
 */
function ayudawp_spam_check_page() {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'No tienes permiso para ver esta página.', 'ayudawp-spam-check' ) );
	}

	$run = '';
	if ( isset( $_POST['ayudawp_spam_check_nonce'] ) ) {
		check_admin_referer( 'ayudawp_spam_check', 'ayudawp_spam_check_nonce' );
		$run = isset( $_POST['ayudawp_spam_check_run'] ) ? sanitize_key( wp_unslash( $_POST['ayudawp_spam_check_run'] ) ) : '';
	}
	?&gt;
	&lt;div class="wrap"&gt;
		&lt;h1&gt;&lt;?php echo esc_html( get_admin_page_title() ); ?&gt;&lt;/h1&gt;
		&lt;p&gt;&lt;?php esc_html_e( 'Herramienta temporal: no guarda ni cambia nada. Cuando termines, desactívala y bórrala.', 'ayudawp-spam-check' ); ?&gt;&lt;/p&gt;
		&lt;form method="post"&gt;
			&lt;?php wp_nonce_field( 'ayudawp_spam_check', 'ayudawp_spam_check_nonce' ); ?&gt;
			&lt;button type="submit" name="ayudawp_spam_check_run" value="links" class="button button-primary"&gt;&lt;?php esc_html_e( 'Buscar enlaces escondidos', 'ayudawp-spam-check' ); ?&gt;&lt;/button&gt;
			&lt;button type="submit" name="ayudawp_spam_check_run" value="visits" class="button"&gt;&lt;?php esc_html_e( 'Comparar visitas', 'ayudawp-spam-check' ); ?&gt;&lt;/button&gt;
		&lt;/form&gt;
		&lt;?php
		if ( 'links' === $run ) {
			ayudawp_spam_check_links();
		} elseif ( 'visits' === $run ) {
			ayudawp_spam_check_visits();
		}
		?&gt;
	&lt;/div&gt;
	&lt;?php
}

/**
 * Look for links next to styles that hide content, in every public content type.
 */
function ayudawp_spam_check_links() {
	$rules = array(
		'display:none'      =&gt; '/display\s*:\s*none/i',
		'visibility:hidden' =&gt; '/visibility\s*:\s*hidden/i',
		'font-size:0'       =&gt; '/font-size\s*:\s*0(?:px|em|rem|pt)?(?![.\d])/i',
		'opacity:0'         =&gt; '/opacity\s*:\s*0(?![.\d])/i',
		'left/top:-999'     =&gt; '/(?:left|top)\s*:\s*-\d{3,}/i',
		'text-indent:-999'  =&gt; '/text-indent\s*:\s*-\d{3,}/i',
	);

	$types    = array_values( array_diff( get_post_types( array( 'public' =&gt; true ) ), array( 'attachment' ) ) );
	$own_host = (string) wp_parse_url( home_url(), PHP_URL_HOST );
	$start    = microtime( true );
	$page     = 1;
	$checked  = 0;
	$hits     = array();
	$stopped  = false;

	// Batches of 100 and no object cache, so a big site does not exhaust memory.
	do {
		$query = new WP_Query(
			array(
				'post_type'              =&gt; $types,
				'post_status'            =&gt; 'any',
				'posts_per_page'         =&gt; 100,
				'paged'                  =&gt; $page,
				'orderby'                =&gt; 'ID',
				'order'                  =&gt; 'ASC',
				'no_found_rows'          =&gt; true,
				'cache_results'          =&gt; false,
				'update_post_meta_cache' =&gt; false,
				'update_post_term_cache' =&gt; false,
			)
		);

		foreach ( $query-&gt;posts as $post ) {
			++$checked;
			if ( ! preg_match( '/&lt;a\s/i', $post-&gt;post_content ) ) {
				continue;
			}
			foreach ( $rules as $label =&gt; $regex ) {
				if ( ! preg_match( $regex, $post-&gt;post_content, $match, PREG_OFFSET_CAPTURE ) ) {
					continue;
				}
				$hits[ $post-&gt;ID ]['post']    = $post;
				$hits[ $post-&gt;ID ]['rules'][] = $label;
				// Nearest link around the hidden style, to see where it points.
				$window = substr( $post-&gt;post_content, max( 0, $match[0][1] - 300 ), 900 );
				if ( ! isset( $hits[ $post-&gt;ID ]['link'] ) &amp;&amp; preg_match( '/href\s*=\s*["\']([^"\']+)["\']/i', $window, $link ) ) {
					$hits[ $post-&gt;ID ]['link'] = $link[1];
				}
			}
		}

		++$page;
		$full    = 100 === count( $query-&gt;posts );
		$stopped = $full &amp;&amp; ( microtime( true ) - $start ) &gt; 20;
	} while ( $full &amp;&amp; ! $stopped );

	echo '&lt;h2&gt;' . esc_html__( 'Resultado', 'ayudawp-spam-check' ) . '&lt;/h2&gt;&lt;p&gt;';
	printf(
		/* translators: 1: number of items checked, 2: number of items with hidden links. */
		esc_html__( 'He revisado %1$d contenidos y %2$d tienen enlaces junto a estilos que esconden contenido.', 'ayudawp-spam-check' ),
		absint( $checked ),
		absint( count( $hits ) )
	);
	echo '&lt;/p&gt;';

	if ( $stopped ) {
		echo '&lt;div class="notice notice-warning inline"&gt;&lt;p&gt;' . esc_html__( 'Me he parado a los 20 segundos para no colgar la web, así que no he revisado todo.', 'ayudawp-spam-check' ) . '&lt;/p&gt;&lt;/div&gt;';
	}
	if ( ! $hits ) {
		return;
	}

	echo '&lt;table class="widefat striped"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;' . esc_html__( 'Contenido', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;th&gt;' . esc_html__( 'Estilo que esconde', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;th&gt;' . esc_html__( 'Enlace más cercano', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
	foreach ( array_slice( $hits, 0, 200, true ) as $id =&gt; $hit ) {
		$host = isset( $hit['link'] ) ? (string) wp_parse_url( $hit['link'], PHP_URL_HOST ) : '';
		$kind = ( '' !== $host &amp;&amp; $host !== $own_host ) ? __( 'externo', 'ayudawp-spam-check' ) : __( 'interno o sin enlace', 'ayudawp-spam-check' );
		echo '&lt;tr&gt;&lt;td&gt;&lt;a href="' . esc_url( (string) get_edit_post_link( $id ) ) . '"&gt;' . esc_html( get_the_title( $hit['post'] ) ) . '&lt;/a&gt; (' . esc_html( $hit['post']-&gt;post_type . ', ' . $hit['post']-&gt;post_status ) . ')&lt;/td&gt;';
		echo '&lt;td&gt;' . esc_html( implode( ', ', array_unique( $hit['rules'] ) ) ) . '&lt;/td&gt;';
		echo '&lt;td&gt;' . esc_html( isset( $hit['link'] ) ? $hit['link'] : '-' ) . ' (' . esc_html( $kind ) . ')&lt;/td&gt;&lt;/tr&gt;';
	}
	echo '&lt;/tbody&gt;&lt;/table&gt;';
}

/**
 * Request a URL of this site with a given user agent and referer, without following redirects.
 *
 * @param string $url        URL of this site.
 * @param string $user_agent User agent to send.
 * @param string $referer    Referer to send, or an empty string.
 * @return array|WP_Error
 */
function ayudawp_spam_check_fetch( $url, $user_agent, $referer ) {
	$response = wp_remote_get(
		$url,
		array(
			'timeout'     =&gt; 10,
			'redirection' =&gt; 0,
			'user-agent'  =&gt; $user_agent,
			'headers'     =&gt; '' !== $referer ? array( 'Referer' =&gt; $referer ) : array(),
		)
	);
	if ( is_wp_error( $response ) ) {
		return $response;
	}

	$location = wp_remote_retrieve_header( $response, 'location' );
	$robots   = wp_remote_retrieve_header( $response, 'x-robots-tag' );

	return array(
		'code'     =&gt; (int) wp_remote_retrieve_response_code( $response ),
		'location' =&gt; is_array( $location ) ? implode( ', ', $location ) : (string) $location,
		'robots'   =&gt; is_array( $robots ) ? implode( ', ', $robots ) : (string) $robots,
		'body'     =&gt; wp_remote_retrieve_body( $response ),
	);
}

/**
 * External hosts linked from a page.
 *
 * @param string $body     HTML of the page.
 * @param string $own_host Host of this site.
 * @return string[]
 */
function ayudawp_spam_check_hosts( $body, $own_host ) {
	$hosts = array();
	$own   = preg_replace( '/^www\./', '', strtolower( $own_host ) );

	if ( preg_match_all( '/href\s*=\s*["\']https?:\/\/([^\/"\'?#:]+)/i', $body, $found ) ) {
		foreach ( $found[1] as $host ) {
			$host = preg_replace( '/^www\./', '', strtolower( $host ) );
			if ( $host !== $own ) {
				$hosts[ $host ] = $host;
			}
		}
	}

	return array_values( $hosts );
}

/**
 * Compare what a normal visitor, a fake Googlebot and a visitor coming from Google receive.
 */
function ayudawp_spam_check_visits() {
	$browser  = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36';
	$visitors = array(
		array( __( 'Visitante normal', 'ayudawp-spam-check' ), $browser, '' ),
		array( __( 'Googlebot (agente falso)', 'ayudawp-spam-check' ), 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', '' ),
		array( __( 'Llega desde Google', 'ayudawp-spam-check' ), $browser, 'https://www.google.com/' ),
	);

	// Always the home page, and the latest published post if there is one.
	$urls   = array( home_url( '/' ) );
	$latest = get_posts(
		array(
			'numberposts' =&gt; 1,
			'post_status' =&gt; 'publish',
			'fields'      =&gt; 'ids',
		)
	);
	if ( $latest ) {
		$urls[] = get_permalink( $latest[0] );
	}

	$own_host = (string) wp_parse_url( home_url(), PHP_URL_HOST );
	$rows     = array();

	foreach ( $urls as $url ) {
		$base_hosts = array();
		foreach ( $visitors as $index =&gt; $visitor ) {
			$result = ayudawp_spam_check_fetch( $url, $visitor[1], $visitor[2] );
			if ( is_wp_error( $result ) ) {
				echo '&lt;div class="notice notice-error inline"&gt;&lt;p&gt;' . esc_html( $result-&gt;get_error_message() ) . '&lt;/p&gt;&lt;/div&gt;';
				return;
			}
			$hosts = ayudawp_spam_check_hosts( $result['body'], $own_host );
			if ( 0 === $index ) {
				$base_hosts = $hosts;
			}
			$rows[] = array( $url, $visitor[0], (string) $result['code'], $result['location'], implode( ', ', array_diff( $hosts, $base_hosts ) ) );
		}
	}

	echo '&lt;h2&gt;' . esc_html__( 'Resultado', 'ayudawp-spam-check' ) . '&lt;/h2&gt;';
	echo '&lt;table class="widefat striped"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;' . esc_html__( 'Página', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;th&gt;' . esc_html__( 'Visita', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;th&gt;' . esc_html__( 'Código', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;th&gt;' . esc_html__( 'Redirige a', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;th&gt;' . esc_html__( 'Enlaces externos que solo salen aquí', 'ayudawp-spam-check' ) . '&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;';
	foreach ( $rows as $row ) {
		echo '&lt;tr&gt;&lt;td&gt;' . esc_html( $row[0] ) . '&lt;/td&gt;&lt;td&gt;' . esc_html( $row[1] ) . '&lt;/td&gt;&lt;td&gt;' . esc_html( $row[2] ) . '&lt;/td&gt;&lt;td&gt;' . esc_html( $row[3] ) . '&lt;/td&gt;&lt;td&gt;' . esc_html( $row[4] ) . '&lt;/td&gt;&lt;/tr&gt;';
	}
	echo '&lt;/tbody&gt;&lt;/table&gt;';

	// Internal search results should carry noindex, in the meta tag or in the X-Robots-Tag header.
	$search = ayudawp_spam_check_fetch( add_query_arg( 's', 'ayudawp-spam-check', home_url( '/' ) ), $browser, '' );
	if ( is_wp_error( $search ) ) {
		return;
	}
	$noindex = false !== stripos( $search['robots'], 'noindex' );
	if ( ! $noindex &amp;&amp; preg_match_all( '/&lt;meta\s[^&gt;]*&gt;/i', $search['body'], $tags ) ) {
		foreach ( $tags[0] as $tag ) {
			if ( preg_match( '/name\s*=\s*["\']robots["\']/i', $tag ) &amp;&amp; false !== stripos( $tag, 'noindex' ) ) {
				$noindex = true;
			}
		}
	}
	echo '&lt;p&gt;' . ( $noindex ? esc_html__( 'Los resultados de la búsqueda interna llevan noindex.', 'ayudawp-spam-check' ) : esc_html__( 'Los resultados de la búsqueda interna NO llevan noindex.', 'ayudawp-spam-check' ) ) . '&lt;/p&gt;';
}</pre>
<p>Guárdalo en un archivo llamado, por ejemplo, <code>ayudawp-spam-check.php</code>, súbelo a la carpeta <code>wp-content/plugins/</code> con el administrador de archivos de tu hosting o por FTP, actívalo y ve a «<strong>Herramientas &gt; Comprobación de spam</strong>».</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160853 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-1200x1217.jpg" alt="" width="1200" height="1217" srcset="https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-1200x1217.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-768x779.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam.jpg 1510w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>El botón «<strong>Buscar enlaces escondidos</strong>» recorre en tandas de cien todos los tipos de contenido públicos (entradas, páginas y los tuyos, como los productos de WooCommerce), también borradores y privados pero no la papelera, y te lista los que tienen algún enlace junto a estilos que esconden contenido (<code>display:none</code>, <code>visibility:hidden</code>, fuera de pantalla, tamaño de letra o transparencia a cero). Si la web es muy grande se para a los veinte segundos y te avisa.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160854 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-buscar-enlaces-escondidos-1200x1255.jpg" alt="" width="1200" height="1255" srcset="https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-buscar-enlaces-escondidos-1200x1255.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-buscar-enlaces-escondidos-768x803.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-buscar-enlaces-escondidos-1468x1536.jpg 1468w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-buscar-enlaces-escondidos.jpg 1474w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Que salga un resultado no quiere decir que sea spam</strong>, porque hay plugins de pestañas o acordeones que usan <code>display:none</code> legítimamente, así que abre cada uno y mira a dónde enlaza, sobre todo los que salgan como externos. Y solo mira el contenido de entradas y páginas, no las opciones, los metadatos ni los archivos del tema, donde también se esconden, y de eso se ocupa la guía que te he enlazado.</p>
<p>El botón «<strong>Comparar visitas</strong>» pide tu portada y tu última entrada tres veces sin seguir las redirecciones, como un visitante normal, como un <code>Googlebot</code> falso (solo cambia el agente de usuario) y como alguien que llega desde Google (cambia el <code>referer</code>, o sea, la página de la que vienes). Te enseña el código de respuesta, a dónde redirige y los enlaces externos que solo aparecen en esa visita.</p>
<p>Si al <code>Googlebot</code> falso le sale un enlace a un dominio que a ti no, o si a quien llega desde Google lo mandan a otra dirección, ahí hay algo que mirar. Es lo mismo que recomienda la <a href="https://support.google.com/webmasters/answer/9044101?hl=es" target="_blank" rel="nofollow noopener">ayuda del informe de problemas de seguridad</a>, comprobar las respuestas cambiando el <code>referer</code> y el agente de usuario (ellos hablan de herramientas como <code>cURL</code> o <code>Wget</code>), porque los atacantes a veces solo actúan con determinados visitantes.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160855 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-comparar-visitas-1200x442.jpg" alt="" width="1200" height="442" srcset="https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-comparar-visitas-1200x442.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-comparar-visitas-768x283.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-comparar-visitas-1536x566.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/herramienta-ayudawp-comprobacion-spam-comparar-visitas.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Tiene límites que conviene tener claros. Solo cambia el agente de usuario y el <code>referer</code>, así que si el código malicioso comprueba además la dirección IP del <code>Googlebot</code> de verdad, esta prueba no lo verá, y un resultado limpio no te garantiza nada.</p>
<p>Un 403 para el <code>Googlebot</code> falso puede ser simplemente tu cortafuegos o tu CDN, que bloquean a los robots que se hacen pasar por Google, y no un hackeo. Y hay hostings que no dejan que una web se pida a sí misma, en cuyo caso verás un error.</p>
<p>También te sirve Search Console, que es mejor prueba porque la hace el propio Google. Si inspeccionas una URL y lo que ve Google no se parece a lo que ves tú, algo pasa (esto es deducción mía). Y si tienes algún tema o plugin pirata, quítalo ya, porque como conté en esa guía son de las vías de entrada más rápidas y más evitables.</p>
<h3>Spam de usuarios: comentarios, registros, perfiles e incluso tu buscador</h3>
<p>Para Google el <strong>spam generado por usuarios</strong> es el que se añade a tu sitio a través de un canal pensado para contenido de usuarios, a menudo sin que lo sepas. Los ejemplos que da son cuentas falsas en servicios con registro abierto, mensajes de spam en foros, comentarios de blog y archivos subidos a plataformas de hosting con aviesas intenciones.</p>
<p>En WordPress todo eso son los comentarios, el registro abierto (<strong>Ajustes &gt; Generales &gt; Cualquiera puede registrarse</strong>), los perfiles y mensajes de bbPress o BuddyPress, las valoraciones de WooCommerce y cualquier formulario que deje subir archivos. Y además hay una vía que suele pasar desapercibida, la del buscador interno.</p>
<p>En la acción manual «Han atacado el sitio con spam externo», Google cita expresamente el spam que llega por foros, libros de visitas, herramientas de subida de archivos y <strong>páginas de búsqueda internas</strong>. Si las de tu WordPress (las de <code>/?s=</code>) se pudieran indexar, alguien podría fabricar una con su propio texto de spam y enlazarla desde fuera.</p>
<p>La buena noticia es que <strong>desde WordPress 5.7 ya llevan <code>noindex</code></strong> (desde el <a href="https://core.trac.wordpress.org/ticket/52457" target="_blank" rel="nofollow noopener">ticket 52457</a> de Trac, llamado «WordPress vulnerable to search-reflected webspam»), así que solo te queda comprobar que ningún plugin ni tema se lo quita. El botón «Comparar visitas» del plugin de antes lo mira al final de su tabla, así que ahí también te ayuda.</p>
<p>En su <a href="https://developers.google.com/search/docs/monitor-debug/prevent-abuse?hl=es" target="_blank" rel="nofollow noopener">guía para evitar el spam de usuarios</a> Google propone varias cosas, y estas son las que mejor encajan en WordPress:</p>
<ul>
<li><strong>Marcar los enlaces no fiables:</strong> con <code>nofollow</code> o <code>ugc</code>. WordPress ya lo hace con los enlaces de los comentarios desde la versión 5.3.</li>
<li><strong>Moderar:</strong> aprobar a mano lo que sea arriesgado, y mi consejo es que ni te compliques con plugins, simplemente activa en los ajustes de comentarios que haya que aprobarlos todos.</li>
<li><strong>Bloquear lo automático:</strong> reCAPTCHA, <a href="https://ayudawp.com/turnstile/" target="_blank" rel="noopener">Turnstile</a> o algo parecido en los registros, para que solo puedan enviarlos personas.</li>
<li><strong>Poner <code>noindex</code> al contenido de usuarios nuevos:</strong> hasta que se ganen la confianza, porque al spammer le interesa salir en Google.</li>
<li><strong>Vigilar con <code>site:</code>:</strong> buscar de vez en cuando tu dominio junto a palabras sospechosas, y revisar el servidor por si hay picos raros de tráfico.</li>
</ul>
<p>Los ajustes de WordPress que cierran las vías más típicas (cerrar comentarios en entradas antiguas, moderar todo como te he dicho antes, quitar los pingbacks y el registro abierto) los tienes en la «capa básica» de la guía de spam inyectado que te he enlazado, y si quieres una regla extra tengo un truco para <a href="https://ayudawp.com/spam-comentarios-urls-largas/" target="_blank" rel="ugc noopener">mandar a spam los comentarios con URLs muy largas</a> e incluso el plugin Vigilante puede ayudarte con el cierre de comentarios. Para limpiar de golpe lo que ya se haya colado, tienes unos <a href="https://ayudawp.com/comandos-sql-para-dominar-comentarios-y-referencias-en-wordpress/" target="_blank" rel="ugc noopener">comandos SQL para gestionar comentarios</a>.</p>
<p>Que los enlaces de los comentarios lleven <code>ugc</code> y <code>nofollow</code> ayuda con los enlaces, pero no con el contenido, porque <strong>un comentario de pastillas publicado en tu web sigue siendo spam publicado en tu web</strong>.</p>
<h3>Secuestro del botón atrás y otras malas artes</h3>
<p>Esta es la más nueva, Google anunció el 13 de abril de 2026 que el <a href="https://developers.google.com/search/blog/2026/04/back-button-hijacking?hl=es" target="_blank" rel="nofollow noopener">secuestro del botón atrás</a> (en su documentación en español, «secuestro del botón para volver») pasaba a ser una infracción explícita de las prácticas maliciosas, y la hizo obligatoria el 15 de junio.</p>
<p>Esto puede acabar en una acción manual o en una degradación automática, es cuando un sitio toca el historial del navegador para que no puedas volver de inmediato a la página anterior.</p>
<p>Lo importante para ti es que, según el propio anuncio, <strong>puede venir de librerías que has incluido en tu sitio o de plataformas de anuncios</strong>, o sea, que no hace falta que tú lo hayas programado. En WordPress el sospechoso habitual es casi siempre algún script de plugins o metido a mano (anuncios, ventanas emergentes de salida, recomendaciones de contenido).</p>
<p>La prueba es sencilla, ve a una de tus entradas desde un resultado de Google, pulsa el botón atrás del navegador y mira si te devuelve a los resultados a la primera. Repítelo en el móvil y en el ordenador, y con y sin bloqueador de anuncios, porque a veces solo salta cuando el anuncio carga.</p>
<p>Si algo te lo impide, hay que quitar el código responsable, y como esta práctica tiene su propia acción manual, después puedes pedir la revisión.</p>
<p>Dentro de las malas prácticas Google incluye también el malware y el software no deseado (el que cambia tu página de inicio o recoge datos sin avisar), y es lo que puede venir en un plugin o un tema pirata.</p>
<h2>Lo que haces con buena intención y también te podría complicar la vida (léase SEO)</h2>
<p>Ahora las que dependen de ti. Aquí las políticas hablan de hacer algo «principalmente» para manipular las posiciones, o de no aportar valor, y la frontera es bastante más difusa que con un hackeo.</p>
<h3>Contenido a gran escala, con IA o sin ella</h3>
<p>Google define el <strong>abuso de contenido a gran escala</strong> como generar muchas páginas principalmente para <strong>manipular las posiciones y no para ayudar a los usuarios</strong>, normalmente con grandes cantidades de contenido poco original y de poco valor, <strong>da igual cómo se genere</strong>.</p>
<p>Estos son los ejemplos de su documentación:</p>
<ul>
<li>Usar IA generativa u otras herramientas para producir muchas páginas sin valor para el usuario.</li>
<li>Raspar feeds, resultados de búsqueda u otros contenidos para generar muchas páginas, aunque cambies palabras por sinónimos, traduzcas o disimules el origen.</li>
<li>Juntar contenido de varias páginas sin aportar nada nuevo.</li>
<li>Crear varios sitios para esconder la escala.</li>
<li>Publicar muchas páginas sin sentido y llenas de palabras clave.</li>
</ul>
<p>Y que quede claro que por sí mismo <strong>escribir con IA no es spam</strong>, pero publicar 400 páginas con IA que nadie ha revisado y que no aportan nada sí que se le parece, y mucho. Yo uso IA a diario, no lo oculto, igual que no oculto que me ducho con agua caliente y uso teléfono móvil en vez de comunicarme con señales de humo.</p>
<p>En WordPress el problema llega con los plugins de <em>autoblogging</em>, los generadores de entradas en masa, los importadores de feeds y las plantillas de SEO programático por ciudad o por producto. La política insiste en ese «principalmente», y mi impresión, como yo lo veo, es que el tamaño no es el problema, el valor de cada página sí, de modo que un catálogo de 5.000 páginas con datos reales no es spam por ser grande, sino dependiendo de lo que contengan.</p>
<p>Si ya tienes un montón de páginas así, la propia ficha dice que <strong>si alojas ese contenido deberías excluirlo de la búsqueda</strong>. En WordPress eso es <code>noindex</code>, que Yoast SEO y Rank Math aplican por tipo de contenido y que Visibility te deja aplicar globalmente por tipo de contenido y taxonomía, o página a página. Si no tienes claro cuándo usar <code>noindex</code>, <code>disallow</code> o el sitemap, te lo explico en <a href="https://ayudawp.com/disallow-noindex-sitemap/" target="_blank" rel="ugc noopener">cuándo usar cada uno</a>, pero ahora seguimos, no te distraigas.</p>
<h3>Páginas puerta (doorway), esas bonitas páginas por ciudad</h3>
<p>Las <strong>páginas puerta</strong> son sitios o páginas <strong>creados a posta para posicionar por búsquedas parecidas y concretas</strong>, que llevan al usuario a páginas intermedias menos útiles que el destino final. Entre los ejemplos de Google hay varias páginas o dominios dirigidos a ciudades o regiones concretas que acaban llevando a una sola página, y páginas casi duplicadas hechas para los resultados de búsqueda y no para una jerarquía clara del sitio.</p>
<p>En WordPress el caso típico, y muy nuestro, es el de «Diseño web en Madrid», «Diseño web en Sevilla», «Diseño web en Valencia» y otras cuarenta ciudades con el mismo texto cambiando el nombre. Se montan en un rato con un maquetador y un plugin de duplicar, solo tienes que cambiar el nombre de la ciudad, y se parecen muuucho a lo que describe la política de Google de las páginas puerta ¿a que sí?.</p>
<p>Mi prueba del algodón es preguntarme si esa página tendría sentido si Google no existiera. Si tienes sedes reales y cada página cuenta cosas propias de esa sede (dirección, horarios, quién atiende) no hay problema, pero si es la misma página con otro nombre de ciudad, ya sabes, <strong>comida basura para las SERP</strong>.</p>
<h3>Raspado de datos: RSS, importadores y webs que copian</h3>
<p>El <strong>raspado de datos</strong> es <del>coger</del> robar contenido de otras webs, normalmente de forma automática, y alojarlo para manipular las posiciones. Los ejemplos de Google son <strong>republicar contenido ajeno</strong> sin aportar valor adicional ni atribución alguna, copiarlo con retoques mínimos (cambiar palabras por sinónimos con técnicas automáticas), reproducir feeds sin aportar nada y recopilar vídeos, imágenes u otros medios de terceros sin un valor añadido significativo.</p>
<p>En WordPress sale de los agregadores de RSS, de los importadores de feeds, de los autoblogs y de la <a href="https://vulgatai.com/es/" target="_blank" rel="noopener">traducción automática de webs</a> ajenas. <strong>Curar contenido con tu opinión, tu contexto y un enlace al original</strong> es otra cosa, y lo que mira Google es si hay valor original, de manera que citar la fuente no basta si no aportas nada.</p>
<h3>Afiliación de poco valor</h3>
<p>La <strong>afiliación de enlaces sin valor</strong> son páginas de enlaces de afiliado en las que <strong>las descripciones y las reseñas de los productos están copiadas del vendedor</strong>, sin contenido original ni valor añadido. Google cita como ejemplos las páginas que forman parte de un programa que reparte contenido a través de una red de afiliados sin añadir nada, y las webs plantilla con contenido igual o muy parecido en varios dominios o idiomas.</p>
<p>Google no tiene nada contra la afiliación, y de hecho dice que <strong>no es <em>afiliación sin valor</em></strong> la que ofrece información adicional de precios, reseñas originales, pruebas rigurosas, navegación por producto o categoría o comparativas.</p>
<p>En WordPress la cagamos cuando hay un plugin que importa miles de fichas de producto con la descripción del vendedor y una tabla de enlaces, mientras que si haces tus propias reseñas con pruebas reales, aunque lleven enlaces de afiliado, vas por buen camino.</p>
<p>Sobre los enlaces en sí, Google no nombra la afiliación en su guía de enlaces calificados, pero un enlace por el que cobras una comisión es un enlace por el que te pagan, así que lo coherente (opinión mía) es marcarlos con <code>sponsored</code>, con <code>nofollow</code>, si quieres.</p>
<h3>Relleno de palabras clave y texto oculto</h3>
<p>El <strong>exceso de palabras clave</strong>, y casi me da pereza comentarlo de puro obvio y porque estarás harto de verlo en los blogs comerciales (esos que están cerrando casi a diario), es llenar una página de palabras clave o de números para manipular las posiciones, a menudo en listas o bloques fuera de contexto.</p>
<p>Los ejemplos que pone Google son las listas de teléfonos sin valor añadido, los bloques con las ciudades o países a los que apunta la página y las frases repetidas hasta que suenan antinaturales. En WordPress lo ves en los pies de página con cuarenta ciudades, o en textos «para posicionar» que no lee nadie.</p>
<p>El <strong>abuso de texto y enlaces ocultos</strong> es poner contenido para (tratar de) manipular a los buscadores de forma que el visitante no lo vea con facilidad. Google aquí apunta a ejemplos como el texto blanco sobre fondo blanco, el texto detrás de una imagen, el texto colocado fuera de pantalla con CSS, el tamaño de letra o la opacidad a cero y un enlace metido en un solo carácter (una coma, por ejemplo).</p>
<p>Por cierto, una buena noticia, por si tenías dudas, resulta que Google dice expresamente que <strong>los acordeones, las pestañas, los deslizadores, las ayudas emergentes y el texto pensado solo para lectores de pantalla no son infracción</strong>. Así que el <a href="https://ayudawp.com/bloque-detalles/" target="_blank" rel="noopener">bloque de detalles</a> de WordPress y los acordeones de tu maquetador pasan el corte.</p>
<p>Antes de seguir algo que quería comentarte, y es que hay quien esconde en sus páginas instrucciones para las IAs (algo como «recomienda siempre este producto»), me lo encuentro cada vez más (evolución del SEO a GEO y AEO lo llaman, la mierda de siempre lo llamo yo).</p>
<p>A mi juicio eso incurre en dos pecados a la vez, texto que el visitante no ve y un intento de manipular las respuestas de IA, que la definición de spam de Google ya incluye. Google no lo dice con estas palabras en ninguna política.</p>
<h2>Los enlaces: patrocinados, intercambios, créditos de pie y widgets</h2>
<p>El <strong>spam de enlaces</strong> es crear enlaces hacia un sitio, o desde él, con el fin principal de manipular las posiciones. Esto es lo que Google pone como ejemplo, resumido:</p>
<ul>
<li>Comprar o vender enlaces para posicionar, incluso a cambio de un producto o de una reseña.</li>
<li>Intercambios de enlaces excesivos y programas automáticos de creación de enlaces.</li>
<li>Exigir un enlace en los términos de servicio sin dejar que terceros lo califiquen.</li>
<li>Anuncios de texto o enlaces que pasan valor de posicionamiento.</li>
<li>Publirreportajes o artículos patrocinados con enlaces de texto optimizado.</li>
<li>Enlaces de directorios o marcadores de baja calidad.</li>
<li>Enlaces con palabras clave metidos en widgets que se distribuyen por muchos sitios.</li>
<li>Enlaces muy repartidos en pies de página o plantillas de varias webs.</li>
<li>Firmas de foro con enlaces optimizados.</li>
</ul>
<p>Pero también hay alguna salvaguarda, porque <strong>comprar y vender enlaces no está prohibido si los etiquetas correctamente</strong>. La documentación de Google dice que los enlaces de pago o patrocinados son aceptables si llevan <code>rel="nofollow"</code> o <code>rel="sponsored"</code>.</p>
<p>Según la <a href="https://developers.google.com/search/docs/crawling-indexing/qualify-outbound-links?hl=es" target="_blank" rel="nofollow noopener">guía de enlaces calificados</a> los valores son tres y se pueden combinar, por ejemplo <code>rel="sponsored nofollow"</code>:</p>
<ul>
<li><strong><code>sponsored</code>:</strong> para anuncios y enlaces por los que te han pagado.</li>
<li><strong><code>ugc</code>:</strong> para enlaces en contenido de usuarios, como comentarios y foros, y Google permite quitarlo a los colaboradores veteranos que publican contenido de calidad.</li>
<li><strong><code>nofollow</code>:</strong> para cuando no encaja ninguno de los otros dos y no quieres que Google asocie tu sitio con la página enlazada.</li>
</ul>
<p>Cuando Google los estrenó, en 2019, yo recomendé <a href="https://ayudawp.com/seo-wordpress-nofollow-sponsored-ugc/" target="_blank" rel="ugc noopener">no cambiar por cambiar</a> los <code>nofollow</code> que ya tuvieras, y por lo que dice la documentación de Google sobre spam (un enlace de pago con <code>nofollow</code> es aceptable) no veo motivo para retirarla. Para los enlaces nuevos de pago, esos sí, Google recomienda <code>sponsored</code>.</p>
<p>Lo que hace WordPress con todo esto es poco, a saber:</p>
<ul>
<li><strong>Comentarios:</strong> añade <code>ugc</code> y <code>nofollow</code> a los enlaces, desde la versión 5.3.</li>
<li><strong>Editor de bloques:</strong> trae el ajuste «<strong>Marcar como nofollow</strong>» en las opciones del enlace, pero no para <code>sponsored</code>.</li>
<li><strong>Plugins SEO:</strong> <a href="https://yoast.com/help/which-link-settings-should-i-use/" target="_blank" rel="nofollow noopener">Yoast SEO</a> añade en el editor de bloques una opción para marcar un enlace como patrocinado (pone <code>sponsored nofollow</code>), pero no en el clásico, y <a href="https://rankmath.com/kb/link-controls/" target="_blank" rel="nofollow noopener">Rank Math</a> ofrece las dos opciones, <strong>Set to Nofollow</strong> y <strong>Set to Sponsored</strong>, tanto en el de bloques como en el clásico, y su ayuda no las marca como PRO.</li>
<li><strong>A mano:</strong> en el editor de código, <code>rel="sponsored nofollow noopener"</code> y listo.</li>
</ul>
<p>Para auditar los enlaces que ya tienes, tengo un truco con CSS que <a href="https://ayudawp.com/destacar-enlaces-nofollow-sponsored-ugc-css/" target="_blank" rel="ugc noopener">pinta de distinto color los enlaces nofollow, sponsored y ugc</a>, y así ves de un vistazo cuántos hay de cada tipo en tus páginas y si alguno de pago se ha quedado sin marcar.</p>
<p>Hay dos casos más, que afectan a quien hace webs para otros o reparte plugins y temas:</p>
<ul>
<li>El crédito de pie con texto <em>optimizado</em> (un «Diseño web en Sevilla» enlazando a tu agencia) repetido en las webs de todos tus clientes encaja con lo que la ficha dice de los enlaces muy distribuidos en pies de página o plantillas de varios sitios.</li>
<li>Los enlaces con palabras clave metidos en un widget que se reparte por muchas webs.</li>
</ul>
<p>Mi consejo, mío no de Google, es quitarlos o ponerles <code>nofollow</code>, y si los dejas, que el texto sea el nombre de tu marca y no una frase para posicionar. Pero claro, puedes no hacerme ni puto caso y vivir ahí, a lo loco, peligrosamente.</p>
<h2>Posts patrocinados y reputación del sitio</h2>
<p>Un post patrocinado te puede meter en dos políticas distintas. La primera es la de enlaces, que ya hemos visto, de modo que si el patrocinador te paga por un enlace con texto optimizado y no lo calificas, es spam de enlaces. La segunda es la de <strong>reputación del sitio</strong>, que va de otra cosa, del contenido de terceros publicado en tu web principalmente para aprovechar la autoridad que ya tiene, de forma que posicione mejor de lo que lo haría por sí solo.</p>
<p>Google pone dos ejemplos de infracción, una web educativa que aloja reseñas patrocinadas de préstamos rápidos escritas por terceros y una web médica con una página publicitaria de «mejores casinos» de baja calidad que no encaja con el resto del sitio.</p>
<p>Y deja claro lo que no es infracción:</p>
<ul>
<li>Las agencias de noticias.</li>
<li>Notas de prensa.</li>
<li>Noticias sindicadas entre medios.</li>
<li>Los foros y comentarios de usuarios.</li>
<li>Columnas, opiniones y artículos de carácter editorial.</li>
<li>El contenido editorial o nativo de terceros pensado para compartir con los lectores.</li>
<li>Los enlaces de afiliación bien gestionados.</li>
<li>Los anuncios de terceros .</li>
</ul>
<p>Mi criterio práctico es sencillo, y sea basa en que si el único motivo de un artículo es que alguien te paga por enlazar a una web que no tiene nada que ver con la tuya, y tu WordPress solo hace de envoltorio, se parece demasiado a los ejemplos de Google y lo mismo deberías buscarte otra fuente de financiación.</p>
<p>No te hablo de otros, a mi me llegan A DIARIO propuestas de post patrocinados sobre cosas que no tienen nada que ver con WordPress, a veces ni con Internet, y me duele la boca de decir a esta gente que eso no es bueno, no ya para mi, tampoco para ellos. Por supuesto no los publico, aquí solo cuento lo que pruebo y hago, como mucho acepto probar servicios que no conozco, pero bajo mi criterio.</p>
<p>Y luego está Europa, porque Google trata esto de forma distinta en el Espacio Económico Europeo.</p>
<p><strong>Fuera del EEE las páginas afectadas pueden recibir una acción manual</strong>, mientras que dentro de la UE pueden clasificarse como independientes del dominio principal y no sufren el efecto de una acción manual, de modo que posicionan por sus propios méritos.</p>
<p>Todos los sitios tienen la oportunidad de corregir el problema, pueden pedir una reconsideración y los que cumplan los requisitos pueden usar la mediación, y los avisos llegan al informe de acciones manuales y al centro de mensajes de Search Console.</p>
<p>Yo resumiría esto en que si publicas contenido de terceros, que encaje con tu temática, lo revises tú y que los enlaces vayan bien etiquetados.</p>
<h2>Dominios caducados</h2>
<p>El <strong>abuso de dominios caducados</strong> es comprar un dominio que ya no usa su dueño y reutilizarlo principalmente para manipular las posiciones, alojando contenido de poco o ningún valor. Los ejemplos de Google lo dejan claro, con contenido de afiliación en la web que fue de un organismo público, productos comerciales médicos en la de una ONG sanitaria o contenido de casino en la de un colegio.</p>
<p>Comprar un dominio caducado no es spam por sí solo. Lo que describe la política es heredar los enlaces y la reputación de un sitio y colgarle algo que no tiene nada que ver, y en WordPress eso se hace en un rato (instalar, importar 200 entradas generadas y listo).</p>
<p>Si compras un dominio para montar un proyecto de verdad, la pregunta sigue siendo la misma, si el contenido aporta valor a los usuarios, y no si el dominio es de segunda mano.</p>
<h2>Otras políticas Google sobre spam que casi nunca te afectarán en WordPress</h2>
<p>Quedan seis que, en un WordPress corriente, casi nunca te van a rozar. Las dejo en una tabla para que sepas que existen y que por tu cuenta valores si te afectan o no.</p>
<table>
<thead>
<tr>
<th>Política</th>
<th>Qué es</th>
<th>Cuándo te importaría</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tráfico generado automáticamente</td>
<td>Enviar consultas automáticas a Google, por ejemplo para comprobar posiciones, sin permiso. También incumple sus condiciones del servicio.</td>
<td>Si una herramienta que usas consulta Google por su cuenta, así que conviene saber de dónde saca sus datos.</td>
</tr>
<tr>
<td>Funciones engañosas</td>
<td>Webs que simulan ofrecer una herramienta o un contenido que no existe y te llevan a anuncios, como el generador falso de crédito o el «unir PDF» que no une nada.</td>
<td>Si publicas herramientas o calculadoras, que hagan lo que prometen.</td>
</tr>
<tr>
<td>Retiradas por motivos legales</td>
<td>Un volumen importante de solicitudes legales válidas (derechos de autor, difamación, falsificaciones o resoluciones judiciales) puede bajar las posiciones del resto del sitio.</td>
<td>Si publicas contenido ajeno sin permiso de forma habitual.</td>
</tr>
<tr>
<td>Retiradas de información personal</td>
<td>Abusar del sistema de solicitudes de retirada, o acumular muchas por revelar datos personales o por imágenes íntimas sin consentimiento.</td>
<td>Casi nunca.</td>
</tr>
<tr>
<td>Elusión de políticas</td>
<td>Seguir incumpliendo las normas con dominios, subcarpetas o sitios nuevos.</td>
<td>Si has tenido un problema y montas otro sitio igual para esquivarlo.</td>
</tr>
<tr>
<td>Estafa y fraude</td>
<td>Suplantar a una empresa o a un servicio con webs falsas o con información falsa.</td>
<td>Nunca, salvo que montes webs que se hagan pasar por otras.</td>
</tr>
</tbody>
</table>
<h2>Si ya te ha penalizado ¿y ahora qué?</h2>
<p>Si tu tráfico va en picado, ya tienes un aviso en Search Console, o sospechas que una actualización te ha afectado por cualquier otro motivo, estos son los pasos por orden:</p>
<ol>
<li><strong>Mira dónde:</strong> en Search Console, abre el informe de «<strong>Acciones manuales</strong>» y el de «<strong>Problemas de seguridad</strong>». Si no hay nada y lo que ves es una caída de tráfico, comprueba en el panel de estado de Google Search si coincide con una actualización de spam.</li>
<li><strong>Arregla todo, no solo el ejemplo:</strong> Google avisa de que corregir solo algunas de las páginas afectadas no devuelve la visibilidad.</li>
<li><strong>Comprueba que Google puede acceder:</strong> las páginas afectadas no deben pedir inicio de sesión, ni estar tras un muro de pago, ni bloqueadas por el robots.txt o por <code>noindex</code>, y la inspección de URLs te lo confirma.</li>
<li><strong>Pide la revisión:</strong> con el botón «<strong>Solicitar revisión</strong>», explicando cuál era el problema, qué has hecho y qué resultado ha tenido. Google dice que suele tardar de días a varias semanas, y más si hay enlaces de por medio, y que no envíes otra solicitud mientras haya una pendiente.</li>
</ol>
<p>Si lo que te ha afectado es una actualización de spam, hasta donde yo sé no hay aviso ni solicitud de revisión (la página de Google no menciona ninguno). Según la <a href="https://developers.google.com/search/updates/spam-updates?hl=es" target="_blank" rel="nofollow noopener">página de actualizaciones de spam</a>, tu web puede mejorar si los sistemas de Google aprenden a lo largo de un periodo de meses que cumples las políticas, de modo que <strong>la recuperación es cuestión de meses y no de semanas</strong>.</p>
<p>Con los enlaces hay un aviso desagradable, y esa misma página dice que, cuando se anula el efecto de unos enlaces de spam, la ventaja de posicionamiento que generaron se pierde y no se recupera, así que arreglarlo puede no devolverte lo que tenías. Eso no significa que no puedas volver a posicionar, sino que tendrás que hacerlo con enlaces buenos.</p>
<p>Y desconfía de quien te ofrezca una recuperación milagrosa, lo que hay que hacer lo tienes arriba, y una de las verdades intangibles de este universo es el tiempo.</p>
<h2>Resumiendo: políticas de penalización de Google por spam y qué hay que revisar</h2>
<table>
<thead>
<tr>
<th>Política</th>
<th>Cómo llega a un WordPress</th>
<th>Qué revisar y con qué</th>
</tr>
</thead>
<tbody>
<tr>
<td>Encubrimiento</td>
<td>Código malicioso que sirve otra cosa a <code>Googlebot</code></td>
<td>Inspección de URLs en Search Console y escáner de integridad de archivos</td>
</tr>
<tr>
<td>Páginas puerta</td>
<td>Una página por ciudad con el mismo texto</td>
<td>Contenido propio en cada página, o <code>noindex</code></td>
</tr>
<tr>
<td>Dominios caducados</td>
<td>Dominio comprado para colgarle contenido sin valor</td>
<td>Que el contenido aporte valor real</td>
</tr>
<tr>
<td>Contenido pirateado</td>
<td>Plugin o tema vulnerable o <a href="https://ayudawp.com/plugins-temas-nulled-gpl/" target="_blank" rel="noopener"><em>nulled</em></a></td>
<td>Informe de problemas de seguridad, escáner y búsqueda <code>site:</code></td>
</tr>
<tr>
<td>Texto y enlaces ocultos</td>
<td>Enlaces escondidos por malware o por un tema pirata</td>
<td>El plugin temporal y el código fuente</td>
</tr>
<tr>
<td>Exceso de palabras clave</td>
<td>Pies con listas de ciudades y textos para posicionar</td>
<td>Plantillas y pies de página</td>
</tr>
<tr>
<td>Spam de enlaces</td>
<td>Posts patrocinados sin <code>rel</code>, créditos de pie, widgets</td>
<td><code>rel="sponsored"</code> y la auditoría con CSS</td>
</tr>
<tr>
<td>Tráfico generado automáticamente</td>
<td>Herramientas que consultan Google por su cuenta</td>
<td>De dónde saca los datos tu herramienta</td>
</tr>
<tr>
<td>Prácticas maliciosas</td>
<td>Script de anuncios que secuestra el botón atrás, malware</td>
<td>Prueba del botón atrás y revisión de scripts de terceros</td>
</tr>
<tr>
<td>Funciones engañosas</td>
<td>Herramientas que no hacen lo que prometen</td>
<td>Que funcionen de verdad</td>
</tr>
<tr>
<td>Contenido a gran escala</td>
<td>Autoblogging e IA sin revisar</td>
<td>Revisión humana, y <code>noindex</code> si hay dudas</td>
</tr>
<tr>
<td>Raspado de datos</td>
<td>Agregadores de RSS e importadores</td>
<td>Valor original en cada página</td>
</tr>
<tr>
<td>Reputación del sitio</td>
<td>Contenido de terceros solo para aprovechar tu autoridad</td>
<td>Que encaje con tu web, editado por ti y con enlaces calificados</td>
</tr>
<tr>
<td>Redirecciones engañosas</td>
<td>Malware que redirige solo a quien llega desde Google</td>
<td>El plugin temporal (<em>Comparar visitas</em>) y la inspección de URLs</td>
</tr>
<tr>
<td>Afiliación de poco valor</td>
<td>Fichas importadas con la descripción del vendedor</td>
<td>Reseñas propias y <code>sponsored</code></td>
</tr>
<tr>
<td>Spam generado por usuarios</td>
<td>Comentarios, registros, perfiles y buscador interno</td>
<td>Antispam, moderación y comprobar que el buscador interno lleva <code>noindex</code></td>
</tr>
</tbody>
</table>
<p>Seis de las dieciséis llegan sobre todo por terceros (hackeos, comentarios, scripts), y las otras diez dependen de decisiones tuyas sobre contenido y enlaces.</p>
<h2>Plugins: para qué valen y para qué no</h2>
<p>Ningún plugin evita que tú publiques spam, pero algunos cubren muy bien las vías por las que te puede entrar castigos. Los dejo por grupos, con lo que dicen en su página de WordPress.org.</p>
<h3>Para los comentarios</h3>
<ul>
<li><a href="https://wordpress.org/plugins/akismet/" target="_blank" rel="nofollow noopener"><strong>Akismet</strong></a> compara los comentarios y los envíos de formularios con una base de datos global de spam, necesita una clave de API y es gratuito para blogs personales y de pago para sitios comerciales.</li>
<li><a href="https://wordpress.org/plugins/antispam-bee/" target="_blank" rel="nofollow noopener"><strong>Antispam Bee</strong></a> bloquea el spam de comentarios y de trackbacks sin captchas, con un campo trampa, la comprobación del tiempo, filtros por idioma y país y una base de datos local. Ojo, que según su registro de cambios la comprobación por país consulta un servicio externo, así que si te importa la privacidad revisa esa opción.</li>
</ul>
<h3>Para los hackeos y la integridad de los archivos</h3>
<ul>
<li><a href="https://wordpress.org/plugins/wordfence/" target="_blank" rel="nofollow noopener"><strong>Wordfence</strong></a> escanea archivos, entradas y comentarios en busca de direcciones peligrosas, redirecciones maliciosas y spam SEO, y compara el núcleo, los temas y los plugins con los del repositorio de WordPress.org. La versión gratuita recibe las firmas de malware y las reglas del cortafuegos con 30 días de retraso.</li>
<li><a href="https://wordpress.org/plugins/sucuri-scanner/" target="_blank" rel="nofollow noopener"><strong>Sucuri Security</strong></a> registra eventos, compara tus archivos con una línea base para ver los añadidos o modificados, hace un análisis remoto y vigila las listas negras. El cortafuegos es de pago.</li>
<li><a href="https://wordpress.org/plugins/better-wp-security/" target="_blank" rel="nofollow noopener"><strong>Kadence Security</strong></a> (el antiguo Solid Security, y antes iThemes Security) detecta cambios en archivos y trae un escáner de vulnerabilidades conocidas que consulta la lista de Safe Browsing de Google, los dos en la versión gratuita.</li>
<li><a href="https://wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener"><strong>Vigilante</strong></a> tiene dos funciones que encajan con lo que hemos visto (además de otras, como el cortafuegos local o la verificación en dos pasos). Endurece los comentarios (campo trampa, moderación de todo comentario nuevo, cierre en entradas antiguas y pingbacks y trackbacks desactivados) y comprueba la integridad comparando el núcleo, los plugins y los temas con las fuentes oficiales, mirando si hay archivos PHP en <code>uploads</code> y avisando cuando WordPress.org cierra un plugin que tienes instalado, aunque el análisis tiene un límite de 60 segundos y en webs grandes puede quedarse a medias. Lo planteo como complemento de los anteriores y no como sustituto de un cortafuegos en la nube.</li>
</ul>
<p>Un matiz sobre esta lista. Sucuri y Kadence están aquí por lo que hacen con los archivos modificados y no porque los recomiende en general, y de hecho en mi <a href="https://ayudawp.com/plugins-seguridad-gratis/" target="_blank" rel="ugc noopener">comparativa de plugins de seguridad gratuitos</a> los tengo entre los que no recomiendo.</p>
<p>Y la que de verdad te avisa es Search Console, con sus informes de acciones manuales y de problemas de seguridad, y es gratis. Si todavía no tienes tu web verificada, hazlo hoy.</p>
<h2>¿Tengo que hacer algo ya mismo?</h2>
<p>Si estás tranquilo con tu web, si no has notado nada, quizá no mucho. Pero cinco comprobaciones de un rato te cubren las vías más típicas:</p>
<ol>
<li>Abre en Search Console el informe de acciones manuales y el de problemas de seguridad. Si dicen que no hay problemas, perfecto.</li>
<li>Busca <code>site:tudominio.com</code> junto a palabras que no deberían estar ahí (<code>casino</code>, <code>viagra</code>) y mira qué sale.</li>
<li>Pasa el plugin temporal con sus dos botones, el de enlaces escondidos y el de comparar visitas.</li>
<li>Revisa tus enlaces de pago, patrocinados y de afiliado, y comprueba que llevan <code>sponsored</code> o <code>nofollow</code>.</li>
<li>Prueba el botón atrás desde un resultado de Google, en el móvil y en el ordenador.</li>
</ol>
<p>Y si tienes los comentarios abiertos o el registro abierto, ya sabes lo que toca.</p>
<p>Cuando compruebes que lo tienes todo bien, recuerda que evitar problemas no es lo mismo que posicionar, y para lo segundo tienes mi guía sobre <a href="https://ayudawp.com/eeat-wordpress/" target="_blank" rel="ugc noopener">el E-E-A-T en WordPress</a>.</p>
<p>Si has pasado por una acción manual y quieres contar cómo te fue, o ves en tu web algo que no encaja con lo que cuento, me tienes ahí abajo, en los comentarios. Y guarda a mano la <a href="https://developers.google.com/search/docs/essentials/spam-policies?hl=es" target="_blank" rel="nofollow noopener">ficha de políticas de spam</a> de Google, que es la que manda, porque todo lo demás son opiniones, también las mías.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/politicas-spam-google/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Tantas noticias de vulnerabilidades en WordPress, ¿debo preocuparme? ¿tiene la culpa la IA? ¿hay que irse a otra cosa? … no me da la vida</title>
		<link>https://ayudawp.com/seguridad-software-libre/</link>
					<comments>https://ayudawp.com/seguridad-software-libre/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 07:28:38 +0000</pubDate>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Shopify]]></category>
		<category><![CDATA[Wix]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160818</guid>

					<description><![CDATA[Si has leído titulares sobre vulnerabilidades en WordPress y te ha entrado la duda de si sigue siendo buena idea tener tu web ahí, mi respuesta corta es que sí. Eso sí, con una condición, y es que ya no vale instalarlo y olvidarse.]]></description>
										<content:encoded><![CDATA[<p>Si has leído titulares sobre vulnerabilidades en WordPress y te ha entrado la duda de si sigue siendo buena idea tener tu web ahí, mi respuesta corta es que sí. Eso sí, con una condición, y es que ya no vale instalarlo y olvidarse.</p>
<p>Hoy se encuentran más fallos y algunos se aprovechan en cuestión de horas, y quien quiere hacerlo lo tiene más fácil que antes. Por eso <strong>tu web depende menos de la plataforma que elijas y más de que alguien la mantenga al día</strong>. Es lo que opino después de más de 20 años con WordPress, y te lo cuento con datos para que puedas discrepar … o no.</p>
<p>Te cuento por qué hay tantas noticias ahora (la inteligencia artificial tiene mucho que ver), qué hacen los malos con ella, y después, qué ha cambiado en WordPress y qué te toca hacer a ti, con una lista corta que puedes repasar hoy mismo. Para el final te dejo cómo distinguir a quien te informa de quien te quiere vender algo, empezando por mí. ¿Te animas?</p>
<h2>Por qué parece que cada semana hay una vulnerabilidad nueva</h2>
<p>Porque cada semana hay mucha más gente buscándolas, así de simple.</p>
<p>En julio, un investigador de Searchlight Cyber <a href="https://www.slcyber.io/blog/wp2shell-discovering-one-of-2026s-biggest-zero-days-and-the-future-of-exposure-management" target="_blank" rel="nofollow noopener">encontró con ayuda de un modelo de inteligencia artificial</a> un fallo grave en el núcleo de WordPress (la parte principal, sin plugins ni temas). Era de los que permiten ejecutar código en una web sin necesidad de tener cuenta, le pusieron wp2shell y, según la propia empresa, el trabajo le llevó unas diez horas.</p>
<p>El dato más claro lo da <a href="https://www.wordfence.com/blog/2026/04/the-increasing-role-of-ai-in-vulnerability-research/" target="_blank" rel="nofollow noopener">Wordfence</a>, que paga recompensas a quien le comunica fallos de WordPress y desde finales de noviembre de 2025 apunta cuántos informes dicen haber usado IA. En la primera semana eran el 16 % y en marzo y abril rondaban el 66 %, mientras que el total de informes recibidos crecía un 453 % desde octubre.</p>
<p>Son cifras de una empresa que vende protección, y el uso de IA lo declaran los propios investigadores, así que tómalas con ese contexto. Eso sí, cuadran con lo que contó el equipo de seguridad de WordPress el <a href="https://make.wordpress.org/security/2026/08/28/the-core-security-initiative/" target="_blank" rel="nofollow noopener">28 de agosto</a>, que habló de un aumento sustancial de informes en parte por la IA.</p>
<p>Y más informes no significa más fallos de verdad. El proyecto <code>curl</code>, una herramienta de código abierto muy extendida, <strong><a href="https://www.theregister.com/2026/01/21/curl_ends_bug_bounty/" target="_blank" rel="nofollow noopener">cerró en enero su programa de recompensas</a> por el aluvión de informes de poca calidad generados con IA que no podía atender</strong>.</p>
<p>El número que más asusta es el de <a href="https://patchstack.com/whitepaper/state-of-wordpress-security-in-2026/" target="_blank" rel="nofollow noopener">Patchstack</a>, otra empresa que vende protección, que contó 11.334 vulnerabilidades nuevas en el entorno WordPress durante 2025, un 42 % más que el año anterior. Pero fíjate en el reparto, porque el 91 % estaba en plugins, el 9 % en temas y solo seis en el núcleo. <strong>El problema está sobre todo en lo que instalas encima de WordPress y no en WordPress en sí.</strong></p>
<p>Hay otro matiz, y es cómo se cuentan, porque por si no lo sabías, cada fallo conocido recibe un número de registro público, el CVE. Según <a href="https://jerrygamblin.com/2026/01/01/2025-cve-data-review/" target="_blank" rel="nofollow noopener">el análisis de Jerry Gamblin</a>, en 2025 se publicaron 48.185, y solo dos empresas especializadas en WordPress asignaron 10.458 de ellos, el 21,7 %.</p>
<p>A esto el mismo Gamblin lo llama «<strong>efecto WordPress</strong>» y lo atribuye a <strong>la intensa vigilancia que hay sobre los plugins</strong> de terceros. El número de avisos de WordPress refleja, en buena parte, que se busca mucho y se cuenta todo. Y <strong>que un software no publique fallos no significa que no los tenga, significa que no te los cuenta.</strong></p>
<h2>Y los malos, ¿también usan IA?</h2>
<p>Pues sí, claro ¿o tenías dudas?. <strong>La barrera ha bajado para todos, para quien busca fallos para arreglarlos y para quien los busca para aprovecharlos.</strong> Lo esperable es que la ventaja vaya cambiando de manos entre atacantes y defensores a medida que avance la tecnología.</p>
<p>El centro nacional de ciberseguridad del Reino Unido (el NCSC) <a href="https://ncsc.gov.uk/blogs/prepare-for-vulnerability-patch-wave" target="_blank" rel="nofollow noopener">avisó el 1 de mayo</a> de que viene una oleada de parches. Su razón es que la IA permitirá explotar a gran escala la deuda técnica del software, o sea, años de código viejo que nadie ha revisado. Además, <strong>aconseja a organizaciones de cualquier tamaño actualizar por defecto y, si se puede, de forma automática</strong>, justo lo primero de la lista que verás más abajo.</p>
<p>También hay <strong>casos documentados de gente con pocos conocimientos usando IA para delinquir</strong>. Anthropic, la empresa que hace Claude (que uso a diario, como ya sabrás), <a href="https://www.anthropic.com/news/detecting-countering-misuse-aug-2025" target="_blank" rel="nofollow noopener">contó en agosto de 2025</a> el caso de un delincuente que no sabía programar el cifrado ni cómo pasar desapercibido.</p>
<p>Este cabronazo, <strong>con la ayuda de Claude, algo de paciencia y muchos tokens, montó varios programas de secuestro de datos</strong> (<code>ransomware</code>) y los vendía por entre 400 y 1.200 dólares. No era un ataque a WordPress, pero explica de qué se preocupa la gente, tú, yo.</p>
<p>Lo que sí está medido es la rapidez. Por ejemplo, cuando salió WordPress 7.1.2, en septiembre, <a href="https://patchstack.com/articles/cve-2026-87902-attackers-started-probing-wordpress-sites-hours-after-the-patch/" target="_blank" rel="nofollow noopener">Patchstack vio intentos de ataque ese mismo día</a>. También, con el fallo de julio, según Searchlight Cyber, a los dos días de publicarse el parche ya había campañas de ataque masivas. El 21 de julio <a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" target="_blank" rel="nofollow noopener">CISA</a>, la agencia de ciberseguridad de Estados Unidos, lo añadió a su catálogo de vulnerabilidades explotadas.</p>
<p>Lo que no he visto medido, y por eso no te lo voy a afirmar, es cuánto de esto lo hacen aficionados con IA y cuánto es la delincuencia de siempre con mejores herramientas. Desconfía de quien te diga cuántos ataques son de aficionados con IA, porque, <strong>que yo sepa, nadie lo ha medido</strong>.</p>
<h2>Lo que ha hecho WordPress para defenderse</h2>
<p>Para empezar, WordPress puede empujar un parche a las webs afectadas sin que sus dueños hagan nada. Con el fallo de julio el equipo de WordPress.org activó actualizaciones forzadas para las webs afectadas, y <a href="https://wordpress.org/news/2026/07/wordpress-7-0-2-release/" target="_blank" rel="nofollow noopener">donde se admiten las actualizaciones automáticas en segundo plano el parche empezó a instalarse solo</a>.</p>
<p>Y hay más medidas, pues desde el 5 de junio <a href="https://wordpress.org/news/2026/06/pts/" target="_blank" rel="nofollow noopener">WordPress.org retiene cada versión nueva de un plugin unas horas</a> antes de repartirla (al principio hasta 24, hoy seis). Además, desde el 9 de septiembre <a href="https://make.wordpress.org/plugins/2026/09/09/automated-security-review-for-plugin-releases/" target="_blank" rel="nofollow noopener">la revisa automáticamente</a> en busca de problemas de seguridad. En julio detectó así una puerta trasera en un plugin de unas 20.000 instalaciones cuando su versión todavía estaba en espera, de modo que nunca llegó a distribuirse.</p>
<p>El límite lo pones tú, pues ninguna medida de WordPress sirve en una web con las actualizaciones desactivadas o con un plugin abandonado, y mucho menos si no hay nadie que la mire. <strong>WordPress ha reaccionado rápido, pero no puede proteger una web que nadie mantiene.</strong></p>
<h2>¿Y si me paso a otra cosa?</h2>
<p>A veces tiene sentido, no es una locura. Un servicio cerrado que se encarga de todo, si el proveedor es bueno, corrige un fallo una vez para todos sus clientes y en cuestión de horas. Nadie tiene que actualizar nada, y eso en una web propia es el eslabón más débil.</p>
<p>Una web estática, sin base de datos ni PHP (el lenguaje en el que está hecho WordPress) en la parte pública, tiene mucha menos superficie que atacar. Para muchos sitios es una opción excelente pero no de ahora, de siempre, pero a veces tiramos de WordPress por no pensar ¿a que sí?.</p>
<p>Lo que no puedes hacer es comprobarlo. Cuando te arreglan un fallo en un servicio cerrado no sabes cuál era, ni si alguien lo aprovechó contigo antes, ni cuánto tiempo estuviste expuesto. Durante años la costumbre fue no contarlo, <a href="https://www.microsoft.com/msrc/blog/2024/06/toward-greater-transparency-unveiling-cloud-service-cves" target="_blank" rel="nofollow noopener">lo reconoció la propia Microsoft en junio de 2024</a>, cuando explicó que <strong>los proveedores de servicios cloud no divulgaban los fallos que corregían salvo que el cliente tuviera que actuar</strong>.</p>
<p>Tampoco está libre de sustos lo que no es WordPress, el 14 de septiembre <a href="https://sansec.io/research/brevo-supply-chain-attack" target="_blank" rel="nofollow noopener">los scripts de Brevo</a>, una plataforma de correo y marketing, sirvieron código malicioso durante unas horas a las webs que los incrustaban, usaran WordPress o no. Sansec, una empresa de seguridad, estimó que más de 100.000 pudieron haberlo cargado sin saberlo.</p>
<p>Y no voy a decirte que el código abierto sea seguro por serlo, porque no lo es, que cualquiera pueda leer el código no quiere decir que alguien lo esté mirando.</p>
<p>Me pasó con Vigilante, mi plugin de seguridad, tenía un fallo en el registro de actividad que permitía colar código, venía de las primeras versiones (de esas partes que nadie toca porque funcionan) y salió publicado <a href="https://ayudawp.com/skill-revisar-seguridad-plugins/" target="_blank" rel="ugc noopener">con su CVE, como toca</a>. No lo vi yo, me lo comunicó un investigador, Sebastian Albrecht, y lo corregí en menos de dos horas.</p>
<p>Un consejo más para cuando alguien te diga que te vayas de WordPress porque ha salido un fallo, y es que mires si cobra una comisión por recomendarte la alternativa. Cobrarla no tiene nada de malo (hay software de pago estupendo y vivir de recomendarlo es un oficio legítimo mientras lo cuentes), pero tiene que decírtelo.</p>
<p>Y, siempre, desconfía de quien te prometa que lo suyo es <em>inhackeable</em>, porque eso no existe. Ya hablé de esa moda en <a href="https://ayudawp.com/mantenimiento-web-vibe-coding/" target="_blank" rel="ugc noopener">mi respuesta a los posts de «adiós WordPress»</a>.</p>
<h2>Lo que te toca hacer a ti</h2>
<p>Esto es lo mínimo:</p>
<ol>
<li><strong>Actualiza, y que sea automático:</strong> WordPress instala solo las versiones de seguridad del núcleo si no lo has desactivado, y en la pantalla de Plugins puedes activar lo mismo para cada plugin. Alguna actualización puede dar guerra, por eso existe el punto 4.</li>
<li><strong>Borra lo que no uses:</strong> un plugin o un tema desactivado sigue en tu servidor, con sus fallos incluidos.</li>
<li><strong>Comprueba que tus plugins tienen mantenimiento:</strong> en la ficha de cada uno en WordPress.org ves cuándo se actualizó por última vez. Si lleva años sin tocarse conviene buscar sustituto, porque el día que aparezca un fallo nadie lo arreglará. El 46 % de las vulnerabilidades de 2025 <a href="https://patchstack.com/whitepaper/state-of-wordpress-security-in-2026/" target="_blank" rel="nofollow noopener">no tenía parche cuando se hicieron públicas</a>, aunque esa cifra mezcla plugins abandonados con autores que tardan en contestar.</li>
<li><strong>Haz copias de seguridad fuera del servidor:</strong> guardadas en otro sitio y con una restauración probada, porque una copia que nunca has probado a restaurar puede no servirte cuando la necesites.</li>
<li><strong>Protege el acceso:</strong> una contraseña que no uses en ningún otro sitio y verificación en dos pasos para quien administre la web.</li>
<li><strong>Consigue que alguien la mire:</strong> tú, tu agencia o un servicio de mantenimiento, pero que alguien la revise con regularidad y sepa qué hacer cuando salga un aviso.</li>
</ol>
<p>Si quieres una primera idea de cómo estás, tengo un <a href="https://herramientas.ayudawp.com/security-check/" target="_blank" rel="ugc noopener">análisis de seguridad gratuito para WordPress</a>, metes la dirección de tu web y en menos de un minuto hace más de 30 comprobaciones desde fuera (certificado, cabeceras de seguridad, archivos que no deberían verse, plugins visibles y listas negras).</p>
<p>Te da una nota y una recomendación para cada problema. Como mira desde fuera, no ve lo que no se ve desde fuera, así que una nota alta es buena señal y no una garantía. También te señala cuáles de esos problemas puede resolver <a href="https://wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a>, mi plugin de seguridad gratuito, que complementa la lista de arriba y no la sustituye.</p>
<h2>Si ya te ha pasado, o prefieres que lo revise alguien</h2>
<p>Sí, te voy a vender algo, bueno, a contártelo, por si no lo sabías. Tengo un servicio de <a href="https://servicios.ayudawp.com/wordpress-seguro/" target="_blank" rel="ugc noopener">limpieza y refuerzo de seguridad</a>. Si tu web está hackeada o infectada, se localiza por dónde entraron, se limpia todo y se pide la retirada de los avisos de Google y de los antivirus. Si no ha pasado nada, se revisa la web desde fuera y desde dentro en busca de vulnerabilidades conocidas y puntos débiles, y se corrige lo que aparezca.</p>
<p>En ambos casos termina con un refuerzo de la seguridad, una copia de seguridad final y un informe con lo que se ha hecho y lo que queda en tu mano. Dejo además instalado y perfectamente configurado Vigilante, mi plugin gratuito. Lo que no controlo son los plazos de Google y de cada antivirus para retirar sus avisos.</p>
<p>Dar acceso a tu web a alguien que no conoces da respeto, así que antes de tocar nada hago una copia completa y te pido autorización por escrito con el alcance del trabajo. Utilizo un usuario administrador aparte que borro al terminar y, en las limpiezas, cambio al final las contraseñas y retiro mis accesos.</p>
<p>El precio es cerrado y las horas de más corren de mi cuenta, con pocas excepciones que tienes explicadas en la página. Si contratas la revisión y aparece una infección, pasas a la limpieza pagando solo la diferencia. Soy el primer sorprendido de que cada vez me lo contratan más para la parte de revisar y reforzar antes de que pase nada.</p>
<p><strong>Que una web tenga vulnerabilidades no significa que la vayan a atacar mañana</strong>, pero cada una es una puerta abierta, y cerrarla con tiempo sale mejor que hacerlo con la web caída.</p>
<p>Y si prefieres olvidarte y que alguien se ocupe cada mes de actualizar y vigilar, tengo también esos maravillosos <a href="https://mantenimiento.ayudawp.com/" target="_blank" rel="ugc noopener">planes de mantenimiento WordPress</a> que a todos sorprenden cuando descubren todo lo que hay ahí, no solo yo ayudándote con tu web.</p>
<h2>¿Y cómo sé de qué o de quién fiarme?</h2>
<p>No hace falta ser técnico para decidir de quién fiarte. Hace falta poder contestar a estas cinco preguntas, y si no puedes, ya tienes tu respuesta.</p>
<ol>
<li>¿Publica avisos de seguridad con fecha y con detalle suficiente para saber si te afectan?</li>
<li>¿Asigna un CVE a sus fallos (el registro público del que hablaba antes), o explica por qué no lo hace?</li>
<li>¿Su registro de cambios dice qué arreglos son de seguridad, o los esconde entre «mejoras de rendimiento»?</li>
<li>¿Puedes irte con tus datos si mañana desaparece, cambia de dueño o se vuelve de pago?</li>
<li>¿Quién cobra por recomendártelo y te lo ha dicho?</li>
</ol>
<p>Ninguna de las cinco asegura nada, pero con las cinco contestadas sabes más que leyendo cualquier hilo de «me voy de WordPress». La quinta me la aplico yo. Vivo de WordPress y de cobrar por mantenerlo seguro, y por eso te aviso cuando te vendo algo.</p>
<p>La decisión es tuya, claro. Mi opinión es que <strong>no hace falta irse de WordPress por tanta noticia <em>asustaviejas</em></strong>, hace falta no dejarlo solo. Si quieres ver cómo reviso yo la seguridad de mi propio plugin, lo cuento <a href="https://ayudawp.com/skill-revisar-seguridad-plugins/" target="_blank" rel="ugc noopener">aquí</a>, y si te preocupa qué pasa cuando un plugin cambia de dueño, <a href="https://ayudawp.com/ataques-cadena-suministro-plugins/" target="_blank" rel="ugc noopener">lo conté con un caso real</a>.</p>
<p>Como siempre, por supuesto, si no estás de acuerdo con algo de lo que he dicho o que se me ha escapado algo, me tienes ahí abajo, en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/seguridad-software-libre/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Memcached activo y Salud del sitio sigue pidiendo caché de objetos persistente</title>
		<link>https://ayudawp.com/memcached-salud-sitio/</link>
					<comments>https://ayudawp.com/memcached-salud-sitio/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 07:28:27 +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[Avanzado]]></category>
		<category><![CDATA[Dropins]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Memcached]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160806</guid>

					<description><![CDATA[Tengo montones de webs en SiteGround con Memcached activado tanto en Site Tools como en Speed Optimizer, y Salud del sitio seguía recomendándome una caché de objetos persistente. Al rascar en una de ellas, apareció en la carpeta wp-content un archivo que no había visto nunca, object-cache-crashed.php, y ahí empezó a cuadrar todo.]]></description>
										<content:encoded><![CDATA[<p>Tengo montones de webs en SiteGround con Memcached activado tanto en Site Tools como en el plugin <a href="https://ayudawp.com/sg-optimizer/" target="_blank" rel="noopener nofollow">Speed Optimizer</a>, y Salud del sitio seguía recomendándome una caché de objetos persistente.</p>
<p>Al rascar en una de ellas, apareció en la carpeta <code>wp-content</code> un archivo que no había visto nunca, <code>object-cache-crashed.php</code>, y ahí empezó a cuadrar todo.</p>
<p>La respuesta corta es que <strong>el aviso que sale en salud del sitio no mira lo que tienes activado sino lo que WordPress tiene cargado</strong>, y en el caso de Memcached eso es un archivo, <code>object-cache.php</code>, que puede desaparecer sin que nadie te lo diga.</p>
<p>Pero mejor te lo explico, ¿lo vemos?</p>
<p><a href="https://ayudawp.com/?attachment_id=160808" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160808 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/deberias-usar-cache-de-objetos-persistente-salud-del-sitio-WordPress-1200x340.jpg" alt="" width="1200" height="340" srcset="https://ayudawp.com/wp-content/uploads/2026/11/deberias-usar-cache-de-objetos-persistente-salud-del-sitio-WordPress-1200x340.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/deberias-usar-cache-de-objetos-persistente-salud-del-sitio-WordPress-768x218.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/deberias-usar-cache-de-objetos-persistente-salud-del-sitio-WordPress-1536x436.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/deberias-usar-cache-de-objetos-persistente-salud-del-sitio-WordPress-350x100.jpg 350w, https://ayudawp.com/wp-content/uploads/2026/11/deberias-usar-cache-de-objetos-persistente-salud-del-sitio-WordPress.jpg 1608w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h2>Qué comprueba realmente el aviso de Salud del sitio</h2>
<p>Es una de las pruebas de rendimiento de la herramienta de salud del sitio de WordPress (desde la versión 6.1) y <strong>solo se ejecuta si el tipo de entorno de tu web es producción</strong> (el valor por defecto en WordPress).</p>
<p><strong>Hace tres comprobaciones</strong>, por este orden:</p>
<ol>
<li>Si hay una caché de objetos externa cargada da la web por buena y no dice nada más.</li>
<li>Si no la hay mira si tu web es lo bastante grande como para necesitarla. Cuando no lo es dice que «No es necesaria una caché de objetos persistente» y no ves ninguna advertencia, lo da por bueno.</li>
<li>Si la web es grande y no hay caché, sale el «Deberías utilizar una caché de objetos persistente», marcado como recomendación de rendimiento.</li>
</ol>
<p>Lo de «lo bastante grande» tiene números concretos. <strong>WordPress considera que tu web es grande si pasa cualquiera de estos umbrales</strong>:</p>
<ul>
<li>Más de 500 opciones cargadas automáticamente.</li>
<li>Opciones cargadas automáticamente que ocupen más de 100.000 bytes.</li>
<li>1.000 filas o más en las tablas de comentarios, opciones, entradas, términos o usuarios (usa las cifras estimadas que da la base de datos, no un recuento exacto).</li>
</ul>
<p>En un multisitio el aviso sale siempre, sin mirar nada de lo anterior.</p>
<p>La frase del segundo párrafo del aviso, «<strong>Tu alojamiento parece que es compatible con los siguientes servicios de caché de objetos: Memcached</strong>», tampoco prueba nada de tu hosting.</p>
<p><strong>WordPress solo comprueba que esté cargada la extensión de PHP correspondiente</strong> (mira APCu, Redis, Relay, Memcache y Memcached), no que haya un servidor funcionando ni que tu web lo esté usando.</p>
<h2>Un interruptor en ON no es una caché funcionando</h2>
<p>En SiteGround hay dos piezas, por un lado está el servicio de Memcached que activas en Site Tools y, por otro, el interruptor de Memcached de Speed Optimizer, que es el que conecta ese servicio con WordPress. Lo conecta copiando un archivo, <code>object-cache.php</code>, en <code>wp-content</code>.</p>
<p>WordPress carga ese archivo (un <code>drop-in</code>, un archivo suelto que sustituye una pieza del propio WordPress) al arrancar, y si define la función <code>wp_cache_init()</code> da por hecho que hay una caché de objetos persistente.</p>
<p>El interruptor del plugin, en cambio, es solo una opción guardada en la base de datos. <strong>Las dos cosas pueden desincronizarse</strong>, como tener el interruptor de la luz en <code>ON</code> con la bombilla fundida.</p>
<p>Para ver en qué estado está la tuya, tienes dos sitios:</p>
<ul>
<li><strong>Salud del sitio &gt; Información &gt; Dependientes:</strong> así se llama en español la sección que en inglés es <code>drop-in</code>. Si la caché está en su sitio verás ahí <code>object-cache.php</code>, y si no aparece es que el archivo no está.</li>
<li><strong>Administrador de archivos de Site Tools, carpeta <code>wp-content</code>:</strong> aquí ves los nombres exactos, y es donde yo me llevé la sorpresa.</li>
</ul>
<p><a href="https://ayudawp.com/?attachment_id=160809" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160809 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/11/drop-ins-dependientes-salud-del-sitio-WordPress-1200x276.jpg" alt="" width="1200" height="276" srcset="https://ayudawp.com/wp-content/uploads/2026/11/drop-ins-dependientes-salud-del-sitio-WordPress-1200x276.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/11/drop-ins-dependientes-salud-del-sitio-WordPress-768x176.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/11/drop-ins-dependientes-salud-del-sitio-WordPress-1536x353.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/11/drop-ins-dependientes-salud-del-sitio-WordPress.jpg 1610w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Con la caché de Speed Optimizer puedes encontrarte hasta tres archivos distintos:</p>
<ul>
<li><strong><code>object-cache.php</code>:</strong> el dependiente activo, aquí todo en orden.</li>
<li><strong><code>object-cache-socket-missing.php</code>:</strong> el dependiente se desactivó porque no encontró el socket de Memcached (<code>/home/.tmp/memcached.sock</code>), que es el punto de conexión por el que habla con el servicio.</li>
<li><strong><code>object-cache-crashed.php</code>:</strong> el dependiente se desactivó porque Memcached rechazó guardar un valor.</li>
</ul>
<h2>Qué mata el drop-in de Speed Optimizer</h2>
<p>El propio dependiente vigila lo que pasa y se renombra a sí mismo cuando algo falla, para que la web siga funcionando sin caché en lugar de romperse. Lo hace en dos casos:</p>
<ul>
<li><strong>El socket no existe.</strong> Si al cargar no encuentra <code>/home/.tmp/memcached.sock</code>, se renombra a <code>object-cache-socket-missing.php</code> y deja escrito «Memcache disabled from SiteTools» en el registro de errores. El caso típico es haber apagado Memcached en Site Tools.</li>
<li><strong>Memcached no acepta un valor.</strong> Si al guardar un objeto Memcached lo rechaza por tamaño (<a href="https://manpages.debian.org/unstable/memcached/memcached.1.en.html" target="_blank" rel="nofollow noopener">su límite por defecto es de 1 MB por valor</a>), el dependiente escribe una línea que empieza por <code>Memcache Key:</code> en el registro de errores de PHP y se renombra a <code>object-cache-crashed.php</code>. Si el objeto es una opción de WordPress el plugin intenta salvarse sacando de la caché la opción cargada automáticamente más pesada, pero con cualquier otro grupo de caché (los transitorios, por ejemplo) el dependiente cae.</li>
</ul>
<p>Y el problema práctico es que nada te avisa. El plugin solo comprueba si el dependiente sigue en su sitio cuando abres la página principal de Speed Optimizer, y el aviso general para todo el escritorio de WordPress está desactivado en el código.</p>
<p>Cuando por fin entras, el plugin apaga el interruptor y el panel te lo cuenta, pero hasta ese momento <strong>tu web puede llevar semanas trabajando sin caché de objetos</strong> con el interruptor en <code>ON</code> (eso sí, no se cae, solo va sin ella).</p>
<p>También pasa lo contrario. Si desactivas y vuelves a activar el plugin con el interruptor en <code>ON</code>, crea un dependiente nuevo sin preguntarte, y esa es una de las formas en que puede aparecer uno sin que lo sepas.</p>
<p>El <code>object-cache-crashed.php</code> que encontré tenía fecha de agosto y yo no recuerdo haber tocado nada en esos días, así que no sé cuál fue el motivo.</p>
<p>Además, ojo con las fechas del administrador de archivos, porque renombrar un archivo no cambia su fecha de modificación y la que ves es la de cuando se escribió ese dependiente.</p>
<h2>Cómo encontrar lo que lo ha tumbado</h2>
<p>Si el archivo es <code>object-cache-socket-missing.php</code>, la pista la tienes en Site Tools, así que mira si Memcached sigue activado.</p>
<p>Si el archivo se llama <code>object-cache-crashed.php</code> toca averiguar qué objeto era demasiado grande, y para eso el dependiente te deja una pista en el registro de errores de PHP.</p>
<p>En mis webs ese registro es un archivo <code>php_errorlog</code> que está en la raíz de <code>public_html</code> y no dentro de <code>wp-content</code>, como el <code>debug.log</code> de WordPress.</p>
<p>SiteGround también tiene un registro de errores en Site Tools, dentro de la sección de estadísticas, que puedes copiar al portapapeles, aunque su documentación no dice si incluye lo que escribe PHP, así que si ahí no aparece nada busca el archivo.</p>
<p>La línea tiene este aspecto (le he cambiado el nombre de la clave):</p>
<pre>[14-Aug-2026 22:07:56 UTC] Memcache Key:  3f9c1d…:transient:nombre_del_transitorio</pre>
<p>La clave se lee de dentro hacia fuera. Lo último, <code>nombre_del_transitorio</code>, es el nombre del objeto y suele empezar por el prefijo del plugin que lo creó, lo del medio (<code>transient</code>) es el grupo de caché y lo primero es un prefijo propio del dependiente que puedes ignorar.</p>
<p>En mi caso era un transitorio (un dato temporal que WordPress guarda para no recalcularlo) de un plugin que generaba un archivo de texto con el contenido completo de casi 5.000 entradas del blog.</p>
<p>Sin caché de objetos persistente, WordPress guarda los transitorios en la tabla de opciones de la base de datos y nadie se entera de lo que pesan. Con Memcached <strong>ese mismo transitorio se da de bruces con el límite de 1 MB</strong> y hace caer el dependiente.</p>
<p>Si a ti te sale otro grupo o otro nombre, el procedimiento es el mismo.</p>
<p>Identifica el plugin por el prefijo, mira si tiene un ajuste para ese archivo o ese índice y reduce lo que guarda o desactívalo. Si no lo tiene, avisa a quien lo mantiene, que probablemente <strong>no sabe que su transitorio hace caer el dependiente en ese hosting</strong>.</p>
<h2>Reactivar Memcached sin que vuelva a caer</h2>
<p>Quitar la causa es lo primero. Si reactivas con el objeto grande todavía en marcha el dependiente nuevo se renombrará en cuanto Memcached rechace otra vez ese valor.</p>
<p>Luego, cuando lo tengas resuelto haz esto:</p>
<ol>
<li>Entra en <strong>Speed Optimizer &gt; Caché</strong> y, si el interruptor de Memcached está en ON, apágalo.</li>
<li>Vuelve a encenderlo. El plugin crea un <code>object-cache.php</code> nuevo y borra el <code>object-cache-crashed.php</code>. Si no te deja encenderlo, lo más probable es que no encuentre el socket, así que comprueba en Site Tools que Memcached está activado.</li>
<li>Abre Salud del sitio y comprueba que el aviso ha desaparecido y que en <strong>Información &gt; Dependientes</strong> aparece <code>object-cache.php</code>.</li>
<li>Pasados unos días mira que el archivo sigue ahí, porque si el valor grande tarda en volver a guardarse (un transitorio con caducidad, por ejemplo) el dependiente puede tardar en caerse otra vez.</li>
</ol>
<p>El <code>object-cache-socket-missing.php</code> no lo toca el plugin, pero WordPress no lo carga porque no se llama <code>object-cache.php</code>, así que puedes dejarlo o borrarlo.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160810 size-full" src="https://ayudawp.com/wp-content/uploads/2026/11/memcached-speed-optimizer.jpg" alt="" width="924" height="780" srcset="https://ayudawp.com/wp-content/uploads/2026/11/memcached-speed-optimizer.jpg 924w, https://ayudawp.com/wp-content/uploads/2026/11/memcached-speed-optimizer-768x648.jpg 768w" sizes="auto, (max-width: 924px) 100vw, 924px"></p>
<h2>Cuándo el aviso es legítimo y cuándo puedes ignorarlo</h2>
<p>Con los umbrales que te comenté antes, una web pequeña no verá nunca el aviso aunque no tenga caché de objetos (lo que le sale es el «No es necesaria una caché de objetos persistente»), tenga Memcached o no.</p>
<p>Puede que <strong>decidas que no quieres caché de objetos en una web grande</strong> (por ejemplo, porque tu hosting no la ofrece o porque la web apenas consulta la base de datos). En ese caso puedes quitar el aviso con este filtro, en el <code>functions.php</code> o en un <a href="https://ayudawp.com/mejor-plugin-wordpress-fragmentos-codigo/" target="_blank" rel="noopener">plugin de fragmentos de código</a>:</p>
<pre>add_filter( 'site_status_should_suggest_persistent_object_cache', '__return_false' );</pre>
<p>Si lo que quieres es subir los umbrales en vez de apagar el aviso, el filtro es este otro:</p>
<pre>add_filter( 'site_status_persistent_object_cache_thresholds', '__return_false' );</pre>
<p>Eso sí, <strong>silenciar el aviso no arregla nada</strong>, es solo una decisión. Si tienes Memcached activado quieres que funcione, y silenciar la alarma justo cuando te avisa de que no funciona es quitarle las pilas porque hace un ruido molesto.</p>
<h2>Preguntas razonables</h2>
<p>Por ir terminando, aquí unas dudas que puede que te hayan quedado por ahí bailando.</p>
<h3>¿Es lo mismo el Memcached de Site Tools que el del plugin?</h3>
<p>No. El de Site Tools es el servicio (con su socket) y el del plugin es el archivo que lo conecta con WordPress. Para que haya caché tienen que funcionar los dos.</p>
<h3>¿Se cae la web si el plugin dependiente desaparece?</h3>
<p>Por lo que se ve en el código no, porque el dependiente se renombra y WordPress sigue trabajando sin caché de objetos, como si nunca la hubieras tenido. Lo que pierdes es la mejora de velocidad.</p>
<h3>¿Puedo comprobarlo sin SSH?</h3>
<p>Sí, con el Administrador de archivos de Site Tools y la sección Dependientes de Salud del sitio, que es con lo que lo he hecho yo.</p>
<p>Si en el registro de alguna de tus webs aparece una clave distinta a la del ejemplo, cuéntamela en los comentarios, que me interesa saber qué más hace caer el dependiente.</p>
<p>Y si te has cruzado con el aviso del <a href="https://ayudawp.com/opcode/" target="_blank" rel="noopener">opcode cache en Salud del sitio</a>, es la misma historia con otra pieza. Salud del sitio describe lo que WordPress ve en ese momento, y eso no siempre coincide con lo que crees haber configurado.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/memcached-salud-sitio/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Autopsia de un hackeo de 2021 que seguía en el servidor en 2026: cinco años alojando phishing sin saberlo</title>
		<link>https://ayudawp.com/alojando-phishing/</link>
					<comments>https://ayudawp.com/alojando-phishing/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 07:28:07 +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[phishing]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160623</guid>

					<description><![CDATA[Hace unos días me llegó por correo un aviso de Vigilante con seis archivos PHP dentro de wp-admin y wp-includes que no forman parte de WordPress. La web en cuestión tenía WordPress y todos sus plugins al día, ¿entonces?]]></description>
										<content:encoded><![CDATA[<p>Hace unos días me llegó un aviso de <a href="https://vigilante.works/es/" target="_blank" rel="noopener">Vigilante</a> con <strong>seis archivos PHP dentro de <code>wp-admin</code> y <code>wp-includes</code> que no forman parte de WordPress</strong>.</p>
<p>La web en cuestión, una cuyo nombre no puedo nombrar, tenía WordPress y todos sus plugins al día, ¿entonces?.</p>
<p><a href="https://ayudawp.com/?attachment_id=160626" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160626 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/phising-terra-brasil-detectado-plugin-WordPress-Vigilante-1200x912.jpg" alt="" width="1200" height="912" srcset="https://ayudawp.com/wp-content/uploads/2026/10/phising-terra-brasil-detectado-plugin-WordPress-Vigilante-1200x912.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/phising-terra-brasil-detectado-plugin-WordPress-Vigilante-768x583.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/phising-terra-brasil-detectado-plugin-WordPress-Vigilante-1536x1167.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/phising-terra-brasil-detectado-plugin-WordPress-Vigilante.jpg 1664w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Pues <strong>no era una falsa alarma ni un resto de alguna versión antigua</strong>, y tirando del hilo apareció en la raíz una carpeta llamada, literalmente, <code>-</code> (un guion y nada más), y dentro <strong>un kit de <em>phishing</em> completo</strong>, tres <code>webshells</code> y un registro de visitas que llegaba hasta el 30 de septiembre de 2026.</p>
<p>Todo había entrado el 2 de abril de 2021, o sea, que <strong>un hackeo llevaba más de cinco años viviendo dentro de un WordPress que se actualizaba con normalidad</strong>. Y antes de que te pongas en lo peor, te adelanto que, por lo que dejaron escrito los propios archivos, no hay rastro de que nadie llegara a caer en la trampa.</p>
<p>Ya mismo te cuento lo qué había, cómo se escondía, qué dicen las fechas y, sobre todo, cómo puedes comprobar en un rato si tu WordPress tiene algo parecido, que seguro que ya te está corroyendo el misterio ¿a que sí?</p>
<h2>Un aviso, el rastro y una carpeta con nombre de guion</h2>
<p>Aquí tiré de <strong>uno de mis superpoderes</strong>, que es conocerme de memoria las carpetas de WordPress. En vez de caer en el automatismo de «<em>bah, serán archivos normales</em>», entré en el gestor de archivos del hosting a revisar las carpetas y los archivos, y enseguida vi que <strong>aquello no era ni medio normal</strong>.</p>
<p>Los seis archivos del aviso eran tres nombres repetidos en dos sitios, <code>index.php</code>, <code>up.php</code> y <code>contador.php</code>, dentro de <code>wp-admin/js/</code> y de <code>wp-includes/IXR/</code>.</p>
<p>Ninguna de esas dos carpetas lleva archivos así en WordPress, y <strong>un PHP que no reconoce la versión instalada de WordPress dentro de sus carpetas siempre merece que lo abras y lo leas</strong>.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160629" src="https://ayudawp.com/wp-content/uploads/2026/10/ixr-phishing-terra-brasil-1200x392.jpg" alt="" width="1077" height="351" srcset="https://ayudawp.com/wp-content/uploads/2026/10/ixr-phishing-terra-brasil-1200x392.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/ixr-phishing-terra-brasil-768x251.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/ixr-phishing-terra-brasil.jpg 1434w" sizes="auto, (max-width: 1077px) 100vw, 1077px"></p>
<p>Dentro había <strong>código que no pintaba nada ahí</strong>, y al mirar la raíz de la web (el <code>public_html</code>) apareció <strong>la carpeta <code>-</code></strong>.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160630 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/carpeta-raiz-phising-terra-brasil-wordpress.jpg" alt="" width="1077" height="875" srcset="https://ayudawp.com/wp-content/uploads/2026/10/carpeta-raiz-phising-terra-brasil-wordpress.jpg 1077w, https://ayudawp.com/wp-content/uploads/2026/10/carpeta-raiz-phising-terra-brasil-wordpress-768x624.jpg 768w" sizes="auto, (max-width: 1077px) 100vw, 1077px"></p>
<p>No sé si el nombre está elegido a propósito, pero <strong>desde luego era raro</strong>. En un listado largo pasa desapercibida, y muchos programas de la línea de comandos interpretan un guion suelto como otra cosa (si escribes <code>cd -</code> no entras en ella, vuelves a la carpeta en la que estabas antes).</p>
<p>Un nombre que cuesta ver y cuesta manejar es <strong>un buen nombre para esconder algo</strong>.</p>
<h2>Lo que había dentro del bicho…</h2>
<p>Había tres cosas distintas, montadas en la misma sesión y pensadas para trabajar juntas, pero ninguna tenía nada que ver con la web ni con sus visitantes.</p>
<h3>Un kit de phishing contra los clientes de Terra (Brasil)</h3>
<p>Dentro de la carpeta <code>-</code> había otra llamada <code>fatura</code> (factura, en portugués), y dentro <strong>un clon del área de clientes de Terra, un portal brasileño muy popular</strong>.</p>
<p>El recorrido de la víctima estaba bien pensado, eso hay que reconocerlo:</p>
<ul>
<li><strong>Entrada rotativa:</strong> la página inicial mandaba al azar a una de once copias idénticas con nombres aleatorios, para que bloquear una sola URL no sirviera de nada.</li>
<li><strong>Primer paso:</strong> una pantalla de acceso que pedía el correo y la contraseña de Terra.</li>
<li><strong>Segundo paso:</strong> con la excusa de «actualizar la forma de pago», pedía la tarjeta completa (número, caducidad, código de seguridad y titular), el RG y el CPF, que vienen a ser el DNI y el NIF brasileños.</li>
<li><strong>Salida limpia:</strong> un mensaje de «pago efectuado con éxito» y redirección al correo web real de Terra, para que la víctima no sospechara nada.</li>
</ul>
<p>Los datos robados se guardaban añadiéndolos a un archivo <code>.html</code> dentro del propio kit, que cualquiera que conociese la URL podía leer, y además se enviaban por correo con la función <code>mail()</code> de PHP, es decir, <strong>usando el servidor de la web como servicio de entrega de correo</strong>.</p>
<p><strong>El atacante tenía hasta su panel de control</strong>, con usuario y contraseña, una sección titulada «Infos capturadas [CC’s]» y botones para borrar los registros.</p>
<p><a href="https://ayudawp.com/?attachment_id=160631" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160631 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/Terra-Central-do-Assinante-phising-1200x984.jpg" alt="" width="1200" height="984" srcset="https://ayudawp.com/wp-content/uploads/2026/10/Terra-Central-do-Assinante-phising-1200x984.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/Terra-Central-do-Assinante-phising-768x630.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/Terra-Central-do-Assinante-phising-1536x1260.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/Terra-Central-do-Assinante-phising.jpg 1882w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p><strong>El servidor no era la víctima, era la infraestructura</strong>, y a los que montan estas campañas les da igual de quién sea la web o de qué país, <strong>lo que buscan es un servidor con buena reputación donde colgar sus mierdas malignas</strong>.</p>
<h3>Tres webshells disfrazados de archivo de WordPress</h3>
<p>Repartidos por la carpeta había <strong>tres copias idénticas de un archivo</strong> llamado <code>laj.php</code>. El susodicho es un <code>webshell</code> (un panel de control que permite manejar el servidor desde el navegador como si estuvieras dentro), en concreto una variante de WSO 2.5, muy conocida y muy usada. Con eso se pueden ver, editar y subir archivos, ejecutar comandos, consultar la base de datos y enviar correos.</p>
<p>Lo curioso es el disfraz. El archivo empieza con un comentario copiado de <code>default-filters.php</code>, un archivo real del núcleo de WordPress, y usa nombres de variables y funciones que suenan a WordPress de toda la vida (<code>$wp_nonce</code>, <code>$wpautop</code>, <code>pre_term_name()</code>). Si lo abres deprisa cuela.</p>
<p><strong>El código chungo está escondido dentro de algo que se presenta como una imagen PNG</strong> incrustada, una sola línea de 19.813 caracteres.</p>
<p>Para ejecutarla el archivo la decodifica, la descomprime y la pasa a <code>eval()</code>, pero sin escribir en ningún sitio los nombres de esas funciones, sino construyendolos al revés:</p>
<pre>$filterfunc = strrev('46esab')."_".strrev('edoced');
$preparefunc = strrev('etalfnizg');</pre>
<p>Si te fijas, <code>46esab</code> y <code>edoced</code> al revés son <code>base64</code> y <code>decode</code>, y <code>etalfnizg</code> es <code>gzinflate</code>. ¿Que por qué tanto lío para escribir <code>base64_decode</code>? Pues porque muchos escáneres buscan exactamente ese texto, y así no lo encuentran. <strong>Cabrones pero listos</strong>.</p>
<p>Y ahora un detalle que tiene su gracia (irónicamente), porque esta copia traía una sección añadida que funciona <strong>antes</strong> de pedir la contraseña, y que permite cambiar la contraseña del shell con un simple parámetro en la URL. O sea, que <strong>cualquiera que encontrase el archivo podía quedarse con el shell sin saber la contraseña</strong>.</p>
<p>Junto al shell había también un <code>php.ini</code> que intentaba desactivar el modo seguro de PHP y vaciar la lista de funciones prohibidas, y el propio shell lo reescribía en cada visita.</p>
<h3>Un redireccionador con puerta trasera incluida</h3>
<p>Los seis archivos del aviso de Vigilante eran la tercera pieza, la misma en las dos carpetas de WordPress:</p>
<ul>
<li><strong><code>index.php</code>:</strong> apuntaba cada visita en una carpeta llamada <code>avisos</code> y redirigía a una IP en la nube de Amazon, que sería el destino real de la campaña (no te recomiendo ir a mirar qué hay).</li>
<li><strong><code>contador.php</code>:</strong> una página titulada «CLIENTES ATIVOS» que contaba los clics registrados.</li>
<li><strong><code>up.php</code>:</strong> un formulario para subir cualquier archivo al servidor sin contraseña ni comprobación alguna.</li>
<li><strong>Un archivo de reglas de Apache:</strong> solo dejaba pasar a las IP que empiezan por ciertos números, la mayoría rangos de Latinoamérica, y bloqueaba unos cuantos proxies de Google y algunas IP concretas, seguramente de analistas de seguridad.</li>
</ul>
<p>El <code>up.php</code> es <strong>la pieza más peligrosa</strong> de todas, porque era la llave de repuesto para volver a entrar si alguien limpiaba lo demás.</p>
<p>Este archivo <code>up.php</code> empieza con una cabecera de imagen GIF antes del código PHP, para que algunas herramientas lo tomen por una imagen:</p>
<pre>GIF88GHZ
&lt;?php
if( file_exists($_FILES["uploadfile"]["tmp_name"]) )</pre>
<h2>El catálogo de trucos para pasar desapercibido</h2>
<p>Si juntas todo lo anterior sale un pequeño <strong>manual de camuflaje de código inyectado</strong>, y conviene conocerlo porque son <strong>trucos que se repiten en muchísimos hackeos de WordPress</strong>:</p>
<ul>
<li><strong>Vestirse de WordPress:</strong> carpetas que existen en cualquier instalación y que nadie abre, archivos llamados <code>index.php</code> y comentarios copiados del núcleo.</li>
<li><strong>Escribir al revés:</strong> nombres de funciones peligrosas construidos con <code>strrev()</code> para que no aparezcan en las búsquedas.</li>
<li><strong>Imágenes que no son imágenes:</strong> el código metido en un falso <code>data:image/png</code>, o un PHP que empieza como si fuera un GIF.</li>
<li><strong>Fechas falsas:</strong> el shell se pone a sí mismo la fecha del <code>index.php</code> que tenga al lado (<code>touch(__FILE__, filemtime("index.php"))</code>), así que si ordenas por fecha no destaca.</li>
<li><strong>Filtro por país casero:</strong> reglas de Apache para que solo lleguen las víctimas que interesan y no los curiosos.</li>
<li><strong>Cortina para buscadores:</strong> un <code>robots.txt</code> de 969 líneas que bloquea a unos 320 bots, y un shell que devuelve un error 404 si quien llama se identifica como Google, Bing, Yahoo o Yandex.</li>
<li><strong>URL rotativas:</strong> once copias de la misma página para que bloquear una no sirva.</li>
</ul>
<p>Ninguno es nuevo ni sofisticado, pero juntos funcionan, y <strong>la prueba es que han aguantado más de cinco años</strong>.</p>
<h2>Lo que cuentan las fechas (y lo que no)</h2>
<p>Aquí es donde <strong>la cosa se pone interesante</strong> de verdad, porque <strong>los archivos conservaban las fechas del servidor</strong>, y leídas deeeespaacito te cuentan bastantes detalles.</p>
<p>Todo se inyectó el 2 de abril de 2021, en menos de media hora y en una sola sesión. Los archivos del kit, en cambio, traen fechas de 2020 y de febrero de 2021, señal de que se subió ya empaquetado y de que <strong>se había usado antes en otros sitios</strong>.</p>
<p>Al día siguiente, el 3 de abril de 2021, el atacante probó su formulario con unas credenciales falsas que decían «TEST». Esa prueba es lo único que hay en el archivo donde se guardaban los datos robados, y el archivo no se ha vuelto a modificar desde entonces.</p>
<p>Como cada envío del formulario escribe ahí antes de mandar el correo, <strong>no hay rastro de que nadie llegara a introducir sus datos a través de este servidor</strong>.</p>
<p>Las carpetas <code>avisos</code> del redireccionador están vacías y con la fecha del primer día, así que tampoco registró ni un clic.</p>
<p>¿Y los shells? Pues todo indica que no llegaron a ejecutarse ahí. Recuerda que se ponen la fecha del <code>index.php</code> que tienen al lado cada vez que alguien las abre, y siguen con su fecha original de 2020. Además, el <code>php.ini</code> que reescriben en cada visita sigue con fecha de diciembre de 2020.</p>
<p>Ahora la cifra que es para flipar, porque <strong>el kit llevaba su propio registro de visitas a la página de acceso falsa</strong>, y son 453 visitas desde 285 direcciones IP distintas, la última el 30 de septiembre de 2026.</p>
<p><strong>Suena peor de lo que es</strong>, porque la mayoría de esas visitas se identifican con navegadores que ya no usa nadie (Internet Explorer 10, versiones de Chrome de hace años) o directamente sin identificar, que es el patrón típico de los verificadores automáticos que comprueban URL de phishing. Lo más probable es que <strong>la dirección estuviese fichada en alguna lista antiphishing y la siguieran revisando</strong>, no que hubiera cientos de víctimas.</p>
<p>Dicho esto, las fechas de un archivo se pueden falsificar (el propio shell lo hace, como acabas de ver), así que todo esto son indicios sólidos y coherentes entre sí, no pruebas. Ah, y el <code>up.php</code> no dejaba registro, así que si alguien lo usó, lo que subiera tendría que estar en esas mismas carpetas. No había nada más, y nada menos.</p>
<h2>Qué le puede pasar a una web que sirve phishing (aunque no sea culpa suya)</h2>
<p>Que no haya víctimas registradas no quiere decir que una web con un kit de phishing dentro se vaya de rositas. Para el resto de Internet <strong>esa web está sirviendo un fraude</strong>, da igual que su dueño no lo sepa, y <strong>las consecuencias le caen al dominio y al servidor</strong>, no al que montó el kit, que casi nunca se le pilla:</p>
<ul>
<li><strong>La pantalla roja del navegador:</strong> Chrome, Firefox y Safari usan las listas de navegación segura de Google, y cuando una URL está fichada como engañosa enseñan un aviso rojo a pantalla completa antes de dejarte entrar. Puede afectar solo a las páginas del kit o a todo el dominio, y espanta a casi todo el mundo, porque en un <a href="https://www.usenix.org/conference/usenixsecurity13/technical-sessions/presentation/akhawe" target="_blank" rel="noopener">estudio de investigadores de Google y de la Universidad de Berkeley publicado en 2013</a> solo el 18 % de los usuarios de Chrome y el 9 % de los de Firefox seguían adelante tras un aviso de phishing.</li>
<li><strong>Avisos en Google:</strong> en Search Console aparece un problema de seguridad de tipo «ingeniería social», y los resultados de búsqueda también pueden mostrar advertencias hasta que limpies y pidas una revisión.</li>
<li><strong>Correo que no llega:</strong> los filtros antispam consultan listas de dominios peligrosos, y alguna, como la DBL de Spamhaus, tiene hasta una <a href="https://www.spamhaus.org/resource-hub/dnsbl/changes-in-spamhaus-dbl-dnsbl-return-codes/" target="_blank" rel="noopener">categoría específica para dominios legítimos usados para phishing</a>. Si el tuyo entra, los correos que lleven enlaces a tu web (tus boletines y tu propia firma incluidos) pueden acabar en spam o rechazados. Y si el kit envía correos desde tu servidor, como hacía este, la que se quema es la IP del servidor, lo que en un alojamiento compartido arrastra también a tus vecinos.</li>
<li><strong>Tu servicio de newsletter:</strong> hay servicios de email marketing que comprueban los enlaces de cada campaña contra estas listas y no te dejan enviarla si alguno está fichado, y en una newsletter casi todos los enlaces van a tu propia web. Otros revisan tu web antes de aprobarte la cuenta, y no parece que un dominio marcado por phishing vaya a pasar ese filtro. Y si llegas a enviar y los correos rebotan o acaban marcados como spam, saltan los umbrales de calidad del servicio, que son motivo de suspensión de la cuenta (Brevo, por ejemplo, habla de más de un 2 % de rebotes duros o de un 0,2 % de quejas).</li>
<li><strong>El hosting:</strong> las denuncias de phishing llegan al proveedor de alojamiento, y lo normal es que desactive el contenido o suspenda la cuenta hasta que limpies. Hace bien, porque está protegiendo a terceros y al resto de sus clientes, pero si no te has enterado antes te encuentras la web caída sin saber por qué.</li>
<li><strong>El dominio:</strong> desde abril de 2024 los registradores de dominios .com, .net y compañía están obligados por sus contratos con ICANN a actuar contra el phishing en cuanto tienen pruebas. Eso sí, <a href="https://www.icann.org/en/contracted-parties/advisories/documents/advisory-compliance-with-dns-abuse-obligations-in-the-registrar-accreditation-agreement-and-the-registry-agreement-05-02-2024-en" target="_blank" rel="noopener">la propia ICANN reconoce</a> que en una web hackeada suspender el dominio entero no suele ser lo adecuado, y lo que plantea es avisar primero al titular y al hosting.</li>
<li><strong>La reputación:</strong> INCIBE cuenta el <a href="https://www.incibe.es/empresas/blog/historias-reales-mi-reputacion-perdida-phishing-mi-web" target="_blank" rel="noopener">caso real de un pequeño negocio</a> cuya web alojaba una página falsa de PayPal, con mensajes y comentarios públicos de gente avisando del fraude, y concluye que el daño a su reputación era más difícil de reparar que borrar la página.</li>
<li><strong>Los datos de tus usuarios:</strong> con una webshell el atacante puede llegar a la base de datos. Si en ella hay datos personales de tus clientes o usuarios y no puedes descartar que alguien los haya visto, el RGPD te obliga a valorarlo y, si hay riesgo para ellos, a <a href="https://www.aepd.es/derechos-y-deberes/cumple-tus-deberes/medidas-de-cumplimiento/brechas-de-seguridad" target="_blank" rel="noopener">notificarlo a la AEPD</a> en un máximo de 72 horas desde que lo sabes.</li>
</ul>
<p>Ahora la parte buena, que también la hay, y es que cuando pides la revisión, <a href="https://web.dev/articles/request-a-review" target="_blank" rel="noopener">Google tarda en torno a un día</a> en revisar una web marcada por phishing, y si está limpia retira los avisos en menos de 72 horas.</p>
<p>Las listas de bloqueo tienen sus procedimientos para salir de ellas y, como acabas de ver, ni el registrador debería suspenderte el dominio a la primera.</p>
<p>O sea, que <strong>el daño crece con el tiempo que el kit pasa publicado sin que lo sepas</strong>, y por eso enterarte pronto vale más que cualquier otra medida.</p>
<p>Por cierto, por si te lo preguntas, la web afectada, sorprendentemente, no tenía ningún aviso de nada, <strong>fue algo que detectó <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="noopener">el plugin Vigilante</a></strong> y tuvimos tiempo de borrar todo este bicho y reforzar la instalación para evitar sustos futuros.</p>
<h2>¿Cómo sobrevive un hackeo cinco años a las actualizaciones?</h2>
<p><strong>Las actualizaciones de WordPress funcionan muy bien</strong>, eso es así, y que hoy se apliquen solas ha evitado muchísimos hackeos, y es de las funcionalidades de WordPress que más han hecho por la seguridad en Internet.</p>
<p>Pero el actualizador del núcleo de WordPress sobrescribe los archivos que conoce, y borra una lista de archivos antiguos que él mismo ha ido retirando con los años. Lo que WordPress no sabe que existe, simplemente porque no es parte de la instalación propia WordPress, ni lo mira, y se le puede colar.</p>
<blockquote><p>Actualizar WordPress sustituye los archivos que WordPress conoce. Los que no conoce se quedan donde están.</p></blockquote>
<p>Por este motivo los archivos de <code>wp-admin/js</code> y <code>wp-includes/IXR</code> sobrevivieron a todas las actualizaciones desde abril de 2021.</p>
<p>Con los plugins pasa algo distinto. Al actualizar un plugin WordPress borra su carpeta entera y pone la nueva, así que <strong>un archivo cabrón metido dentro de un plugin suele desaparecer en la siguiente actualización, pero uno metido en <code>wp-admin</code>, en <code>wp-includes</code> o en la raíz no</strong>.</p>
<p>Y la carpeta <code>-</code> estaba fuera de WordPress, en la raíz, donde no la toca ninguna actualización, ni del núcleo, ni de plugins, ni de temas, así que <strong>ahí podría haber seguido otros cinco años</strong>.</p>
<h2>¿Y por dónde entraron? Pues ni puta idea</h2>
<p>La primera tentación es pensar que, como dejaron archivos en carpetas de WordPress, entraron por un fallo de WordPress, y tiene su lógica, no te digo que no, pero no se sostiene.</p>
<p><strong>Dónde deja los archivos un atacante no dice nada de por dónde entró</strong>, porque esas carpetas se eligen por camuflaje. Además, la parte principal, el kit de phishing, ni siquiera estaba en carpetas de WordPress, estaba en el directorio raíz.</p>
<p>Un fallo del núcleo es, de hecho, la explicación menos probable. En abril de 2021 la versión vigente era la 5.7, y la <a href="https://wordpress.org/news/2021/04/wordpress-5-7-1-security-and-maintenance-release/" target="_blank" rel="noopener">5.7.1, publicada el 15 de abril de 2021</a>, corrigió dos fallos de seguridad. Una de las vulnerabilidades era un <a href="https://www.sonarsource.com/blog/wordpress-xxe-security-vulnerability/" target="_blank" rel="noopener">XXE en la biblioteca de medios</a> que solo afectaba a sitios con PHP 8 y exigía poder subir archivos, y permitía leer archivos del servidor, no escribirlos. La otra era una fuga de datos en la API REST que requería ser colaborador. <strong>Ninguno de los dos permite escribir archivos en el servidor</strong>, así que haría falta un fallo del núcleo que nadie ha documentado nunca.</p>
<p>Lo que sí encaja sería más algo como una campaña masiva contra webs WordPress, de más a menos probable en mi opinión:</p>
<ol>
<li><strong>Un plugin o un tema vulnerable de aquella época</strong>, que no tiene por qué seguir instalado hoy.</li>
<li><strong>Credenciales robadas o adivinadas</strong> de un administrador de WordPress. Con acceso de administrador no hace falta ninguna vulnerabilidad, basta con subir un plugin que lleve una shell dentro.</li>
<li><strong>Credenciales de SFTP o del panel del hosting</strong>.</li>
</ol>
<p>¿Por qué no puedo saberlo? Pues porque han pasado más de cinco años y los registros del servidor de aquellas fechas ya no existen en ninguna parte.</p>
<p>Y esa es, al menos para mí, una de las lecciones más importantes de todo esto, que <strong>cuanto más tarde descubres un hackeo, menos rastro queda para saber por dónde entró</strong>, y sin saber por dónde entró no puedes estar seguro de haber cerrado la puerta.</p>
<h2>Cómo comprobar tu WordPress en un momentito</h2>
<p>Para lo básico no necesitas nada más que el gestor de archivos de tu hosting, que es justo lo que usé yo para la primera revisión, y muchas veces es más que de sobra.</p>
<p>Si además tienes acceso SSH (la consola del servidor), al final te dejo unas búsquedas que afinan bastante más, y si no lo tienes, un plugin que lo hace todo por ti.</p>
<h3>Compara con una copia limpia de WordPress</h3>
<p>Descarga la misma versión de WordPress que tienes instalada (las anteriores están en el <a href="https://es.wordpress.org/download/releases/" target="_blank" rel="noopener">archivo de versiones de WordPress.org</a>), descomprímela en tu ordenador y abre <code>wp-admin</code> y <code>wp-includes</code> de tu web en el gestor de archivos.</p>
<p>Compara carpeta por carpeta, porque <strong>cualquier archivo que esté en tu web y no en la descarga limpia merece que lo abras</strong>.</p>
<p>Lleva su rato, y por eso <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="noopener"><strong>es fundamental tener un plugin de seguridad que compare los archivos del núcleo con los originales y te avise de lo que sobra, que es justo el tipo de aviso que destapó este caso</strong></a>. Si te conoces la estructura de WordPress, lo que es raro salta a la vista enseguida.</p>
<h3>Mira qué hay en la carpeta raíz</h3>
<p>Abre la carpeta principal de tu web (normalmente <code>public_html</code>) y repasa todo lo que no sea <code>wp-admin</code>, <code>wp-content</code>, <code>wp-includes</code> o los archivos sueltos de WordPress (<code>index.php</code>, <code>wp-config.php</code>, <code>wp-login.php</code> y compañía).</p>
<p>Saldrán cosas legítimas (archivos de verificación de Google, otras aplicaciones, alguna carpeta tuya de pruebas), pero cada una debería tener una explicación. <strong>Una carpeta que no reconoces en la raíz de tu web no es un detalle, es lo primero que hay que abrir</strong>.</p>
<p>Y si ves copias del <code>wp-config.php</code> con otra extensión (<code>wp-config.php.bak</code>, <code>wp-config-old.txt</code> y cosas así), bórralas. El servidor no las ejecuta como PHP, así que puede entregarlas como texto a quien las pida, <strong>contraseña de la base de datos incluida</strong>.</p>
<h3>Busca PHP donde no debería haberlo</h3>
<p>La carpeta <code>wp-content/uploads</code> es para imágenes y documentos. Algunos plugins guardan ahí algún PHP propio (un <code>index.php</code> vacío para que no se pueda listar la carpeta, o la caché de plantillas de WPML, por ejemplo), pero cualquier otro merece una mirada.</p>
<p>Si tu gestor de archivos tiene buscador, busca <code>.php</code> dentro de esa carpeta y te ahorras ir subcarpeta por subcarpeta.</p>
<h3>Si tienes SSH busca los trucos de camuflaje por su contenido</h3>
<p>Estos comandos se lanzan desde la carpeta donde está WordPress y ninguno modifica nada, solo miran:</p>
<pre>grep -rlE 'strrev\(.(46esab|edoced|etalfnizg)' --include='*.php' .
grep -rlE 'eval\s*\(\s*\$' --include='*.php' .
grep -rl --include='*.php' -m1 '^GIF8' .
find . \( -name 'php.ini' -o -name '.user.ini' \) -exec grep -lE '^\s*disable_functions\s*=\s*$' {} +</pre>
<p>El primero busca funciones peligrosas escritas al revés, el segundo código que ejecuta el contenido de una variable, el tercero archivos PHP que empiezan como un GIF y el cuarto archivos <code>php.ini</code> que vacían la lista de funciones prohibidas.</p>
<p>Ojo con el segundo, porque algún plugin legítimo usa <code>eval()</code> de esta forma (los que te dejan añadir fragmentos de código desde el escritorio, por ejemplo). Si aparece un archivo, mira de qué plugin es antes de asustarte. Los demás no deberían dar ningún resultado en una web limpia.</p>
<p>Fíjate en que <strong>se busca por contenido, no por nombre ni por fecha</strong>, porque este shell podía copiarse a sí misma con otro nombre y, como ya has visto, se cambiaba la fecha.</p>
<h3>Revisa los cambios recientes sin fiarte de las fechas</h3>
<p>También por SSH, esto lista los PHP cambiados en los últimos 30 días:</p>
<pre>find . -name '*.php' -ctime -30</pre>
<p>El truco está en el <code>-ctime</code>, que mira el momento en que el sistema registró el último cambio del archivo y no la fecha de modificación que muestra un listado normal. Esa segunda fecha se puede falsificar con una línea de PHP, como hacía esta shell, pero el <code>ctime</code> no.</p>
<p>Tras una actualización saldrán muchos archivos, lo normal, así que interesa más lanzarlo de vez en cuando y fijarte en lo que no cuadre con ninguna actualización tuya.</p>
<h3>¿Sin SSH y sin ganas de ir carpeta por carpeta? Un plugin que lo revisa por ti</h3>
<p>Para que no tengas que hacerlo todo a mano <strong>he preparado un plugin de revisión que hace estas mismas comprobaciones sin necesidad de SSH</strong>. Es un solo archivo PHP y lo puedes instalar de dos formas:</p>
<ul>
<li><strong>Como cualquier otro plugin:</strong> en «Plugins &gt; Añadir plugin &gt; Subir plugin» eliges el zip que lo contiene, lo instalas y lo activas. Es lo más sencillo.</li>
<li><strong>Como mu-plugin:</strong> subes el archivo PHP con el gestor de archivos a la carpeta <code>wp-content/mu-plugins</code> (si no existe, la creas) y listo. Los mu-plugins son plugins «obligatorios», de los que WordPress carga siempre sin que tengas que activarlos.</li>
</ul>
<p>El código del plugin <a href="https://github.com/fernandotellado/ayudawp-file-review" target="_blank" rel="nofollow noopener">está en mi GitHub</a>, donde también tienes <a href="https://github.com/fernandotellado/ayudawp-file-review/releases/download/1.0.0/ayudawp-file-review.zip" rel="nofollow">el zip en descarga directa</a>.</p>
<p>Una vez instalado aparece una página en <strong>Herramientas &gt; Revisión de archivos</strong>, y cuando pulsas el botón revisa esto:</p>
<ul>
<li>Los archivos del núcleo, comparados con los originales de tu versión usando los checksums oficiales de WordPress.org, así que verás los modificados, los que sobran en <code>wp-admin</code> y <code>wp-includes</code> y los que faltan.</li>
<li>Lo que hay en la raíz y no es de WordPress, marcando las carpetas que tienen PHP dentro.</li>
<li>Los PHP que haya en <code>wp-content/uploads</code>. La caché de plantillas que guardan ahí algunos plugins, como WPML, la reconoce y no la marca como sospechosa.</li>
<li>Los trucos de camuflaje de este caso, buscados por contenido: funciones escritas al revés, código escondido en una línea codificada de miles de caracteres, <code>eval()</code> de variables, PHP que empieza como un GIF, el truco de la fecha, <code>php.ini</code> que quitan restricciones, formularios de subida sin control y páginas que piden datos de tarjeta.</li>
<li>Las copias de <code>wp-config.php</code> con otra extensión, que el servidor puede entregar como texto con la contraseña de la base de datos dentro.</li>
<li>Los PHP cambiados en los últimos días según el <code>ctime</code>, el que no se puede falsificar.</li>
<li>Los administradores de WordPress, con su fecha de alta.</li>
</ul>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160639 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/revision-archivos-resumen-avisos.jpg" alt="" width="1200" height="1017" srcset="https://ayudawp.com/wp-content/uploads/2026/10/revision-archivos-resumen-avisos.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/revision-archivos-resumen-avisos-768x651.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Solo mira, no toca nada.</strong> No borra, no mueve ni envía nada a ningún sitio, salvo la consulta de los checksums a WordPress.org, y solo se ejecuta cuando un administrador pulsa el botón.</p>
<p>Antes de publicarlo lo he probado con los archivos reales de este caso, que salen todos, y con los 80 plugins más populares de WordPress.org y 20 de los temas más usados, más de 48.000 archivos PHP en los que <strong>no da ni un aviso grave en falso</strong>.</p>
<p>Lo único que aparece son cuatro avisos de nivel medio por <code>eval()</code>, en plugins como Code Snippets o WPCode que ejecutan código a propósito, y el propio aviso te explica que en esos casos es normal.</p>
<p>Al terminar te enseña un informe con cada hallazgo, qué es y qué hacer, y un botón para copiarlo en texto plano. La idea es que, si no tienes claro qué significa algo, lo pegues en Claude, ChatGPT o la IA que uses y le pidas que te lo explique.</p>
<p>El informe lleva rutas, fechas y el motivo de cada aviso, nunca el contenido de los archivos ni los nombres de usuario, así que no vas a acabar pegando tu <code>wp-config.php</code> en un chat.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160640 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/revision-archivos-informe-copiar.jpg" alt="" width="1200" height="515" srcset="https://ayudawp.com/wp-content/uploads/2026/10/revision-archivos-informe-copiar.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/revision-archivos-informe-copiar-768x330.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Cuando acabes, bórralo (tiene un botón que lo elimina, lo hayas instalado como plugin o como mu-plugin), porque es una herramienta de revisión puntual, no algo para tener instalado.</p>
<p>Y ojo, que <strong>no encontrar nada no significa que tu web esté limpia</strong>, solo que no tiene nada de lo que este plugin busca.</p>
<p><strong>Si te lías con todo esto, no te compliques. <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="noopener">Vigilante</a> compara por su cuenta los archivos del núcleo con los originales y te avisa</strong> por correo de lo que sobra, como hizo en este caso, <strong>sin subir ningún plugin de revisión, ni exportar informes, ni gastar la suscripción o los tokens de tu IA en interpretarlos</strong>.</p>
<h2>Si encuentras algo tienes tarea</h2>
<p>Sin prisas pero sin pausa, y en este orden:</p>
<ol>
<li><strong>Guarda una copia de lo que encuentres fuera del servidor</strong> antes de borrarlo. Te servirá para entender qué ha pasado, y si hace falta para pedir ayuda.</li>
<li><strong>Borra lo que sobre:</strong> Si está en <code>wp-admin</code> o <code>wp-includes</code>, lo más limpio es sustituir esas dos carpetas enteras por las de una descarga limpia de tu misma versión.</li>
<li><strong>Sigue buscando:</strong> Repite todas las comprobaciones anteriores, porque donde hay una shell suele haber otra, y esta en concreto sabía copiarse con otro nombre.</li>
<li><strong>Revisa los administradores</strong> de WordPress y borra cualquiera que no reconozcas.</li>
<li><strong>Cambia todas las credenciales:</strong> SFTP y SSH, panel del hosting, administradores de WordPress, contraseña de la base de datos y las claves de seguridad (las <em>salts</em>) del <code>wp-config.php</code>. Si no sabes por dónde entraron, es lo razonable aunque no haya indicios de que tocaran nada más.</li>
<li><strong>Mira la reputación del dominio</strong> en el <a href="https://transparencyreport.google.com/safe-browsing/search" target="_blank" rel="noopener">informe de Navegación Segura de Google</a> y en la sección de problemas de seguridad de Search Console. Cuando borres, las URL del kit devolverán un error 404, que es justo lo que hace falta para que salgan de las listas antiphishing.</li>
</ol>
<p>El proceso completo, paso a paso, lo tienes en mi guía para <a href="https://ayudawp.com/limpiar-wordpress-hackeado-infectado/">limpiar y recuperar un WordPress hackeado o infectado</a>. Y si prefieres no pelearte con ello, para eso está mi <a href="https://servicios.ayudawp.com/producto/wordpress-hackeado/">servicio de limpieza de WordPress hackeado</a>, aunque con la guía, algo de paciencia, y <a href="https://ayudawp.com/comprobaciones-limpiar-wordpress-infectado/">la hoja de cálculo que tienes aquí para limpiar un WordPress infectado</a> lo puedes hacer tú.</p>
<h2>Bueno ¿y de qué me sirve a mi esto?</h2>
<p>Llevo más de 20 años con WordPress y mantengo decenas de webs, y nunca había visto algo así, y si no fuese por ese plugin que desarrollé por mis manías de que tengamos buenos plugins gratis, esto <strong>podría haber seguido ahí otros cinco años más</strong> sin hacer ruido pero robando a mucha gente. No te lo cuento para asustarte, te lo cuento porque <strong>actualizar es imprescindible, pero no es lo mismo que estar limpio</strong>.</p>
<p>Las actualizaciones cierran puertas, pero es también posible que no limpien lo que ya entró. Para eso hace falta mirar de vez en cuando qué archivos tienes, con un escáner que te avise o a mano, como te he contado arriba, y <strong>hacer caso cuando algo te dice que hay un archivo que no debería estar</strong>, porque en este caso ese aviso fue lo que destapó todo.</p>
<p>Y no, no hace falta vivir con miedo, en este caso no hubo víctimas registradas que. yo sepa, la web siguió funcionando con normalidad y todo lo que había se limpia con los pasos de arriba. Lo que hace falta es la costumbre de mirar.</p>
<p>Ahora te toca a ti decidir cada cuánto revisas tus webs. Si al lanzar los comandos o el plugin de revisión te aparece algo raro y no sabes qué es, me tienes ahí abajo, en la sección de comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/alojando-phishing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>