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

<channel>
	<title>Ayuda WordPress</title>
	<atom:link href="https://ayudawp.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://ayudawp.com</link>
	<description>Recursos, temas, plugins, tutoriales en español</description>
	<lastBuildDate>Mon, 19 Oct 2026 06:34:37 +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>Los plugins experimentales de WordPress.org deberían avisar de lo que son ¿tienes activo Performance Lab, Speculative Loading, Gutenberg o el plugin oficial IA?</title>
		<link>https://ayudawp.com/plugins-beta-wordpress-org/</link>
					<comments>https://ayudawp.com/plugins-beta-wordpress-org/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 06:28:14 +0000</pubDate>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Gutenberg]]></category>
		<category><![CDATA[Principiante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160664</guid>

					<description><![CDATA[Échale un vistazo a la lista de plugins de tu web, o a la de tus clientes si te dedicas a esto. Si aparece Performance Lab, Speculative Loading, Modern Image Formats, Gutenberg o el plugin AI, lo que tienes ahí no es un plugin como los de toda la vida, es un experimento oficial de WordPress.org, y nada en tu escritorio te lo dice.]]></description>
										<content:encoded><![CDATA[<p>Échale un vistazo a la lista de plugins de tu web, o a la de tus clientes si te dedicas a esto. Si aparece Performance Lab, Speculative Loading, Modern Image Formats, Gutenberg o el plugin AI, <strong>lo que tienes ahí no es un plugin como los de toda la vida, es un experimento oficial de WordPress.org</strong>, y nada en tu escritorio te lo dice.</p>
<p>Te reconozco que esto me tiene bastante molesto. Me los encuentro activos en montones de webs de clientes, funcionando como si fueran un plugin más, a veces incluso cuando lo que hacen ya forma parte de WordPress desde hace tiempo.</p>
<p>Lo mío es casi anecdótico al lado de los números, pues resulta que el plugin Speculative Loading tiene más de 70.000 instalaciones activas pero resulta que <strong>la carga especulativa está dentro de WordPress desde la versión 6.8, de abril de 2025 ¿ves el problema?</strong>.</p>
<p>Otros plugins experimentales como Performance Lab y Modern Image Formats pasan de las 100.000 cada uno, Gutenberg de las 400.000, y el plugin AI, que no lleva ni un año en el directorio, ya va por las 60.000.</p>
<p>Que conste que no tengo nada contra estos plugins, de ahí han salido algunas de las mejores cosas que ha estrenado WordPress en los últimos años, lo que no me parece ni medio normal es que no avisen de forma clara, y permanente, de lo que son y de lo que no.</p>
<p>Sigo…</p>
<h2>Plugins que no son plugins</h2>
<p>En WordPress.org se los llama <strong>plugins canónicos</strong>, y la idea es ya antigua, y te te hablé de ello en <a href="https://ayudawp.com/plugin-canonicos/" target="_blank" rel="ugc noopener">2009, cuando se propuso</a>, así que no me repetiré.</p>
<p>Luego, en 2022 la recuperó Matt Mullenweg en <a href="https://make.wordpress.org/core/2022/09/11/canonical-plugins-revisited/" target="_blank" rel="nofollow noopener">un artículo en Make WordPress</a>, donde los definía como la recomendación oficial para funciones que no tienen por qué estar en el núcleo, con la puerta abierta a entrar en él si triunfan.</p>
<p>Para complicar aún más las cosas, resulta que hay dos familias grandes de estos plugins, que a veces se suelen confundir, pero que en realidad son bastante distintas.</p>
<p>Por un lado están <strong>los plugins experimentales del equipo de rendimiento</strong>, con Performance Lab como lanzadera, desde el que se instalan los demás y una docena de plugins sueltos (Speculative Loading, Modern Image Formats, Optimization Detective, Image Prioritizer, Enhanced Responsive Images y compañía).</p>
<p>Y luego están los que publica la propia cuenta de WordPress.org, a modo de plugins beta, pero que no siempre lo son tanto, como Gutenberg, el plugin AI o el más reciente MCP Adapter.</p>
<p>Todos tienen algo en común, y es que normalmente <strong>no están pensados para ser un producto acabado sino para probar ideas</strong>, que algunas veces acabarán en WordPress y otras no.</p>
<p>Lo dicen ellos mismos, aunque en letra pequeña:</p>
<ul>
<li><strong>Performance Lab:</strong> sus <a href="https://wordpress.org/plugins/performance-lab/" target="_blank" rel="nofollow noopener">preguntas frecuentes</a> reconocen que <em>«it can mostly be considered a beta testing plugin»</em>, o sea, que viene a ser un plugin para probar cosas en beta, y piden prudencia a quien lo use.</li>
<li><strong>El plugin AI:</strong> su <a href="https://wordpress.org/plugins/ai/" target="_blank" rel="nofollow noopener">readme</a> avisa de que es <em>«an experimental plugin»</em> y recomienda probarlo antes en una web de pruebas.</li>
<li><strong>Gutenberg:</strong> su <a href="https://wordpress.org/plugins/gutenberg/" target="_blank" rel="nofollow noopener">readme</a> lo presenta como un <em>«beta plugin»</em> para quien quiera probar funciones antes de que salgan. Y en 2021 la propia WordPress.org <a href="https://wordpress.org/news/2021/04/become-an-early-adopter-with-the-gutenberg-plugin/" target="_blank" rel="nofollow noopener">publicó</a> que <em>«it is not recommended to use the plugin on a site that has launched and is actively in use»</em>, es decir, que no lo uses en una web ya publicada y en marcha.</li>
</ul>
<h3>Ni WordPress.org se aclara con el nombre</h3>
<p>De verdad es que esto es para mear y no echar gota, pues resulta que en julio de 2025 los responsables del núcleo se reunieron para <a href="https://make.wordpress.org/core/2025/07/10/core-committers-check-in-july-2025/" target="_blank" rel="nofollow noopener">poner orden en los tipos de plugins oficiales</a>. Dejaron por escrito que los <strong><em>feature plugins</em></strong> (plugins que prueban funciones candidatas al núcleo) son exploratorios y de corto plazo, y que los canónicos tienen soporte oficial y un responsable directo.</p>
<p>Pero el equipo de IA <a href="https://make.wordpress.org/ai/2026/10/06/whats-new-in-ai-1-4-0/" target="_blank" rel="nofollow noopener">llama canónico a su plugin AI</a>, que según su propio <code>readme</code> es experimental, y en la práctica todo el mundo usa la palabra para lo mismo.</p>
<p>Así que yo, para entendernos, los voy a seguir llamando canónicos, o directamente experimentos. Me refiero a estos, a los de pruebas, no a plugins oficiales como Classic Editor o el importador de WordPress, que son otra cosa y no tienen nada de experimento.</p>
<p>Y si quien los publica no se aclara con el nombre, el que los instala ni te cuento, va listo.</p>
<h3>¿Por qué digo que son peores que un plugin en beta?</h3>
<p>Pues porque <strong>un plugin en beta <em>normal</em> aspira a ser la versión estable de sí mismo</strong>. Lo instalas sabiendo que puede tener fallos, pero el plan es que algún día deje de tenerlos y siga ahí, a tu servicio.</p>
<p>Un experimento no tiene ese plan, <strong>su objetivo es comprobar si una idea funciona, y acaba en el núcleo, con lo que el plugin sobra, o en la papelera</strong>.</p>
<p>Hay casos intermedios, como Modern Image Formats. En 2022 se decidió <a href="https://make.wordpress.org/core/2022/09/11/webp-in-core-for-6-1/" target="_blank" rel="nofollow noopener">no convertir las imágenes a WebP por defecto en el núcleo</a> y dejar esa función en un plugin, y ahí sigue, en tierra de nadie, pero con más de 100 mil webs con el plugin instalado, un plugin que nadie mantiene, ni vigila, ni actualiza.</p>
<p>Encima llevan el sello de WordPress.org, que da una confianza que no te daría la beta de un desarrollador cualquiera. Si lo firma WordPress algo bueno tendrá, ¿no?</p>
<p>Ahora bien, todo hay que decirlo, <strong>sin estos plugins WordPress habría mejorado bastante más despacio</strong>. El atributo <code>fetchpriority</code> (el que le dice al navegador qué imagen cargar primero) llegó al núcleo en la versión 6.3, el <code>sizes="auto"</code> de las imágenes con carga diferida en la 6.7 y la carga especulativa en la 6.8. Todo eso salió de aquí.</p>
<p>Probar en webs reales es como se mejora WordPress, y quien los instala sabiendo lo que hace le está haciendo un favor a todos. El problema no es ese, sino que la gente los instale(mos) sin saberlo, o no todo lo claro que se debería.</p>
<h2>¿Por qué no te enteras de que tienes un experimento instalado?</h2>
<p>Porque<strong> las advertencias están donde no miras.</strong> Fíjate en el camino que hace cualquiera desde que busca el plugin hasta que lo tiene funcionando:</p>
<ul>
<li><strong>En la página del directorio de plugins:</strong> la de Performance Lab no lleva ninguna etiqueta de beta ni de experimento. Lo único es un «(experimental)» junto a View Transitions dentro de la descripción, y el aviso de verdad está en las preguntas frecuentes, al final de la página, en esa sección que no lee nadie.</li>
<li><strong>En la sección Beta del directorio:</strong> existe una <a href="https://wordpress.org/plugins/browse/beta/" target="_blank" rel="nofollow noopener">sección Beta</a>, pero es un cajón de sastre. Mete plugins cuyo <code>readme</code> parece el de cualquier otro y deja fuera precisamente los plugins de rendimiento con más instalaciones, como Modern Image Formats, Speculative Loading u Optimization Detective. De esa familia solo aparece Performance Lab.</li>
<li><strong>En el instalador de tu escritorio:</strong> en «Plugins &gt; Añadir plugin» existe una pestaña <strong>Pruebas beta</strong>, pero WordPress solo la enseña si tu versión lleva un guion en el número, es decir, en versiones de desarrollo como una beta o una RC. En una web en producción esa pestaña no aparece nunca.</li>
<li><strong>En la lista de plugins instalados:</strong> lo único que ves es la descripción. La del plugin AI dice <em>«AI features, experiments and capabilities for WordPress»</em> y la de Performance Lab <em>«Performance plugin from the WordPress Performance Team»</em> (que suena más a garantía que a aviso). Las de Speculative Loading o Modern Image Formats no dan ninguna pista. Solo Gutenberg se presenta como <em>«development plugin»</em>, y Optimization Detective, Image Prioritizer y Embed Optimizer llevan un «-beta» en el número de versión.</li>
<li><strong>Dentro del propio plugin:</strong> en los ajustes del plugin AI, «Experimentos en el editor» y «Experimentos en la administración» son el nombre de dos grupos de funciones, no un aviso. Lo de probarlo antes en una web de pruebas solo está en el <code>readme</code>.</li>
</ul>
<p><a href="https://ayudawp.com/?attachment_id=160671" rel="nofollow"><img fetchpriority="high" decoding="async" class="sombra alignnone wp-image-160671 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/plugins-canonical-1200x675.jpg" alt="" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/10/plugins-canonical-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/plugins-canonical-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/plugins-canonical-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/plugins-canonical.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a><br>
Y lo saben sus equipos, no es algo que se les haya pasado. En abril de 2025, en otra de esas reuniones de los responsables del núcleo, <a href="https://make.wordpress.org/core/2025/04/04/dotorg-core-committers-check-in/" target="_blank" rel="nofollow noopener">quedó escrito</a> que <em>«It’s often not widely known that canonical plugins exist or that they are officially maintained»</em> (poca gente sabe que existen o que son oficiales).</p>
<p>También que <em>«Feedback is mainly received from users when something breaks»</em>, o sea, que las opiniones de los usuarios les llegan sobre todo cuando algo se rompe.</p>
<p>Su conclusión entonces fue que <strong>había que promocionarlos más</strong>, y en julio se pusieron como siguiente paso redactar los criterios para clasificar los plugins oficiales en canónicos, de funciones, experimentales y de soporte. Quince meses después, que yo sepa, esos criterios siguen sin publicarse.</p>
<p>Promocionarlos me parece bien, pero <strong>promocionarlos sin etiquetarlos adecuadamente es justo lo que nos ha traído hasta aquí</strong>.</p>
<h2>Lo que te puede pasar con uno de estos plugins activo</h2>
<p>No quiero meterte miedo, que la mayoría hace lo que promete y hay muchas webs usándolos sin problemas. Pero conviene que sepas qué estás aceptando, porque no es algo trivial, en muchas ocasiones es incluso perjudicial usar estos plugins si no tienes 100% claro lo que supone.</p>
<h3>Te cambian la web nada más activarlos</h3>
<p>Modern Image Formats es el ejemplo más claro. Con la configuración por defecto <strong>cada imagen que subas a partir de ese momento se guarda en WebP o AVIF</strong> (formatos de imagen modernos que pesan menos), en todos sus tamaños, incluida la versión principal que usa WordPress. El JPEG o PNG que subiste se conserva como original, pero WordPress deja de usarlo.</p>
<p>Y ojo, porque <strong>desactivarlo o desinstalarlo no deshace nada</strong>. Las imágenes que subiste con el plugin activo se quedan en WebP o AVIF y WordPress las sigue sirviendo así. No se rompe nada, los navegadores actuales las leen sin problema, pero no es un cambio que quites con un clic.</p>
<p>Speculative Loading es otro de los puñeteros, especialmente. La <a href="https://ayudawp.com/carga-especulativa-nativa/" target="_blank" rel="ugc noopener">carga especulativa nativa de WordPress</a> solo hace <em>prefetch</em> (descargar por adelantado el HTML de la página a la que seguramente vas a ir) y de forma prudente, cuando ya estás pulsando el enlace. El plugin, en cambio, hace <em>prerender</em> por defecto, que es cargar la página entera en segundo plano, con sus scripts y todo, en cuanto pasas el ratón por encima.</p>
<p>Es más rápido, pero tiene su precio. En 2024 el plugin hizo que en tiendas WooCommerce <a href="https://github.com/WordPress/performance/issues/1140" target="_blank" rel="nofollow noopener">se añadieran productos al carrito solo con pasar el ratón por encima</a>, sin hacer clic. Lo corrigieron rápido, eso sí, pero sigue abierta otra incidencia en la que <a href="https://github.com/WordPress/performance/issues/1774" target="_blank" rel="nofollow noopener">el carrito y la página de pago, precargados, muestran datos del pedido desfasados</a>.</p>
<h3>Cambian las reglas sin avisar, o desaparecen</h3>
<p>El plugin AI lo deja claro en su <a href="https://github.com/WordPress/ai/blob/develop/docs/FEATURE_EXPERIMENT_LIFECYCLE.md" target="_blank" rel="nofollow noopener">documentación sobre el ciclo de vida de sus experimentos</a>, donde dice que están <em>«subject to breaking changes or removal without notice»</em>, <strong>expuestos a cambios que rompen cosas o a desaparecer sin previo aviso</strong>. Se comprometen a intentar que esos cambios lleguen en versiones mayores, que algo es.</p>
<p>Un ejemplo de hace unos días. En la versión 1.4.0, por un cambio en Gutenberg, <strong>las directrices editoriales que tuvieras guardadas para la IA hay que volver a meterlas a mano</strong>, porque no se migran. Dos experimentos encadenados, y el que paga el pato eres tú.</p>
<p>Luego está lo de desaparecer. Web Worker Offloading, otro plugin del equipo de rendimiento con más de 10.000 instalaciones, avisa en su <a href="https://wordpress.org/plugins/web-worker-offloading/" target="_blank" rel="nofollow noopener">readme</a> de que es experimental y de que está <em>«intended to be sunset»</em>, en vías de retirada. Al menos lo dicen, aunque <strong>solo se entera quien se lee el <code>readme</code></strong>.</p>
<p>Que un plugin normal cambie las reglas o se abandone es un accidente, <strong>en un experimento cambiar o desaparecer entra dentro del plan, es lo esperado, salvo por el detalle de que no siempre te informa como debería.</strong></p>
<h3>Duplican o pisan a tus otros plugins</h3>
<p>El plugin AI, por ejemplo, tiene un experimento que genera con IA la <code>meta description</code> de tus entradas. Si detecta Yoast, Rank Math, All in One SEO o SEOPress, la guarda en el campo de ese plugin y no imprime nada por su cuenta, que está bien.</p>
<p>Pero si usas otro plugin de SEO, como The SEO Framework o Slim SEO, el plugin AI imprime su propia <code>meta description</code> y esa entrada sale con dos. Pasa solo si activas el experimento y aplicas una descripción generada, pero pasa, y <a href="https://ayudawp.com/meta-description-automatica/" target="_blank" rel="ugc noopener">tener dos <code>meta description</code> en la misma página no es nunca buena idea</a>.</p>
<p>Tiene arreglo, eso sí, aunque está en manos del desarrollador de tu plugin de SEO. El plugin AI incluye un filtro, <code>wpai_meta_description_seo_plugins</code>, con el que cualquier plugin de SEO puede apuntarse a esa lista, y a partir de ese momento la descripción generada se guarda en su campo y no se duplica.</p>
<p>Es lo que he hecho yo con <a href="https://visibility.quest/" target="_blank" rel="nofollow noopener">Visibility</a>, y son unas pocas líneas de código, así que si tu plugin de SEO no está entre los cuatro de antes, pídeselo a quien lo desarrolla.</p>
<p>Con los plugins de rendimiento pasa algo parecido. Image Prioritizer decide qué imágenes cargar primero y cuáles retrasar, igual que hacen muchos plugins de optimización, y ya te conté en el artículo sobre <a href="https://ayudawp.com/image-prioritizer/" target="_blank" rel="ugc noopener">por qué WordPress todavía no acierta con el LCP</a> cómo <strong>pueden pisarse entre ellos</strong>.</p>
<h3>Tienen un coste aunque no los uses</h3>
<p>En la versión actual del plugin AI, cada función que no has activado nunca <a href="https://github.com/WordPress/ai/issues/1112" target="_blank" rel="nofollow noopener">cuesta una consulta a la base de datos en cada visita</a>, también en la parte pública. Ocurre en webs sin caché de objetos persistente (tipo Redis o Memcached). Con 21 funciones son <strong>21 consultas por página en una instalación recién estrenada, y además te deja dos widgets fijos en el escritorio</strong>.</p>
<p>El arreglo de las consultas ya está hecho y llegará en una próxima versión, y con caché de objetos el problema casi desaparece. Aun así, es un buen ejemplo de que <strong>tener un experimento activo sin usarlo no sale gratis</strong>.</p>
<p>Y ojo con lo que dice su propia FAQ, que sus funciones <em>«require manual triggering – nothing happens automatically without your approval»</em>, o sea, que solo se ponen en marcha si tú lo pides y que nada pasa solo sin tu aprobación.</p>
<p>Activar un experimento ya es aprobarlo, vale, pero <strong>la moderación de comentarios analiza cada comentario nuevo que no esté ya marcado como spam, también los de visitantes sin registrar</strong>, y cada uno de esos comentarios viaja a tu proveedor de IA y puede costarte tokens.</p>
<p>Optimization Detective funciona con datos de tus visitantes reales. Para eso necesita la API REST de tu web abierta a cualquiera, y los navegadores de tus visitas le envían métricas que se guardan en tu base de datos. Tiene sus límites (una petición por minuto por IP, y borra lo que tiene más de tres meses), pero son escrituras en tu base de datos que antes no tenías.</p>
<p>Como ves, <strong>no son algo que no afecte a tu web, sí pasa algo si los dejas ahí</strong>.</p>
<h3>Gutenberg, el <em>experimento</em> con más instalaciones</h3>
<p>El plugin Gutenberg es el abuelo de todos, con más de 400.000 instalaciones activas. Su propio <code>readme</code> te explica que <strong>no te hace falta para usar el editor de bloques</strong>, porque cada versión de WordPress ya incluye lo que está listo, y que solo lo necesitas si quieres las funciones en beta sin esperar a WordPress, pero <strong>a riesgo de que luego algo no llegue o llegue diferente</strong>.</p>
<p>En noviembre de 2022 pasó lo que tenía que pasar. Las webs con una versión antigua del plugin que se actualizaron solas a WordPress 6.1 <a href="https://core.trac.wordpress.org/ticket/56985" target="_blank" rel="nofollow noopener">se quedaron con un error fatal</a>, sin acceso ni a la portada ni al escritorio. La solución pasó por que WordPress desactive al actualizarse las versiones de Gutenberg que se han quedado demasiado viejas, que algo hemos ganado.</p>
<h2>Cuando su funcionalidad llega a WordPress el plugin sigue ahí</h2>
<p>Esto es lo más delicado, cuando una funcionalidad llega al núcleo de tu WordPress, el plugin que la probaba sigue activo en miles de webs, como un zombi, y como mucho deja una notita en el readme.</p>
<p><strong>Lo más triste es que antes se hacía bien.</strong> WP Auto-Updates y Plugin Dependencies, dos plugins de funciones que acabaron en WordPress 5.6 y 6.5, se desactivaban solos al detectar que su función ya estaba en el núcleo.</p>
<p>Better Code Editing mostraba un aviso en el escritorio diciendo, literal, que su función ya estaba en el núcleo y que se podía desactivar y desinstalar.</p>
<p>Hasta el propio <a href="https://make.wordpress.org/core/handbook/about/release-cycle/features-as-plugins/" target="_blank" rel="nofollow noopener">manual del núcleo sobre plugins de funciones</a> pide que el plugin deje de hacer nada en cuanto su funcionalidad entra en WordPress.</p>
<p>Ahora mira lo que pasa con los del equipo de rendimiento:</p>
<ul>
<li><strong>Speculative Loading:</strong> su readme reconoce que la carga especulativa entró en WordPress 6.8, pero el plugin sigue activo en más de 70.000 instalaciones sin avisar de nada, y encima sustituye la configuración prudente del núcleo por la suya, más agresiva.</li>
<li><strong>Enhanced Responsive Images:</strong> lo de <code>sizes="auto"</code> entró en WordPress 6.7, y lo único que sigue aportando el plugin, según su propio readme, no está disponible para temas clásicos. Tiene más de 50.000 instalaciones, y en cualquier web con tema clásico no hace nada.</li>
<li><strong>Performant Translations:</strong> su readme avisa de que casi todo entró en WordPress 6.5 y de que <em>«You might not need it anymore»</em>. Es verdad que sigue sirviendo para traducciones que no vienen de WordPress.org, pero el aviso está donde no lo lee ni el tato.</li>
</ul>
<p>Yo mismo, con un plugin mío bastante más modesto, saqué una última actualización con un aviso antes de cerrarlo, para que nadie se quedara con un plugin muerto sin enterarse.</p>
<p>Si lo hace un desarrollador cualquiera como yo, el equipo oficial de WordPress también puede. <strong>Dejar zombis repartidos por miles de webs me parece mala política</strong>, y no hay más.</p>
<h2>Si lo que cuenta es la adopción, que al menos sea informada</h2>
<p>Hay un detalle que me parece importante, y es que en la <a href="https://make.wordpress.org/core/2026/09/18/roadmap-to-7-2/" target="_blank" rel="nofollow noopener">hoja de ruta de WordPress 7.2</a> se dice que las funciones de IA tienen que demostrar <em>«clear adoption and practical value»</em> antes de plantearse para el núcleo, y se anima a la gente a usar y probar el plugin AI.</p>
<p>En aquella reunión de abril de 2025 reconocían que las instalaciones activas son <em>«currently the only metric available»</em>, la única métrica que tienen.</p>
<p>No digo que nadie esté inflando nada a propósito, ni mucho menos, pero si las instalaciones cuentan como prueba de que algo funciona, <strong>60.000 instalaciones de un plugin experimental no son 60.000 personas probando algo a sabiendas</strong>.</p>
<blockquote><p>Si las instalaciones activas son la prueba de que un experimento funciona, lo mínimo es que quien lo instala sepa que está participando en una prueba.</p></blockquote>
<h2>Mi propuesta, que no es para volverse loco</h2>
<p>No pido que dejen de hacer estos plugins, ni que dejen de promocionarlos, que son más qué útiles, solo <strong>pido que sean explícitos</strong>, y lo concreto en seis cosas:</p>
<ol>
<li><strong>Una etiqueta visible en el directorio:</strong> en la ficha de cada plugin, arriba y a la vista, no escondida en las preguntas frecuentes, y también en los resultados del instalador, no solo en una pestaña que en producción no existe.</li>
<li><strong>Un aviso permanente en la lista de plugins:</strong> una línea fija debajo del plugin, que no se pueda cerrar, diciendo que es un plugin de pruebas.</li>
<li><strong>Una explicación al activarlo:</strong> qué es, para qué sirve probarlo y qué riesgos tiene usarlo en una web en producción.</li>
<li><strong>Etiquetas distintas para cosas distintas:</strong> no es lo mismo un experimento que una función candidata al núcleo o un plugin oficial estable, y hoy todo cabe en el mismo cajón de «Beta».</li>
<li><strong>Avisar y apartarse cuando su función entra en el núcleo:</strong> como hacían los plugins de funciones antiguos y como pide el propio manual.</li>
<li><strong>Publicar los criterios prometidos en julio de 2025:</strong> los de clasificación de los plugins oficiales, que siguen sin aparecer.</li>
</ol>
<p>Lo bueno es que <strong>los puntos 2, 3 y 5 no necesitan tocar el núcleo de WordPress</strong>, los puede hacer hoy mismo cada equipo en sus propios plugins. De hecho el equipo de rendimiento ya marca como experimentales algunos de sus plugins, pero solo dentro de la pantalla de Performance Lab, donde View Transitions sale con su «(experimental)». Se trata de llevar esa etiqueta al propio plugin.</p>
<p>He abierto <a href="https://github.com/WordPress/performance/issues/2709" target="_blank" rel="nofollow noopener">una incidencia en el GitHub del equipo de rendimiento</a> con esta propuesta, y <a href="https://github.com/WordPress/ai/issues/1166" target="_blank" rel="nofollow noopener">otra en el del plugin AI</a> (donde han contestado y parece que lo contemplarán). En esta última pido además que cada experimento diga si se ejecuta solo, qué contenido envía al proveedor de IA y si puede gastar tokens sin que nadie haga nada.</p>
<p>Si estás de acuerdo pásate por ambos y deja tu comentario, que un caso real bien explicado vale más que un pulgar hacia arriba.</p>
<h2>Mientras tanto, revisa tu web (o las de tus clientes)</h2>
<p><strong>Hasta que cambie algo te toca a ti.</strong> Para reconocerlos fíjate en estas señales:</p>
<ul>
<li>En el directorio el autor es «WordPress Performance Team» o «WordPress.org».</li>
<li>El número de versión lleva «-beta».</li>
<li>Las preguntas frecuentes o el readme hablan de beta, de experimento o de probarlo antes en una web de pruebas.</li>
<li>Aparece en la sección Beta del directorio, aunque ya has visto que no están todos.</li>
</ul>
<p>Esto es lo que yo haría con los más habituales:</p>
<ul>
<li><strong>Speculative Loading:</strong> si tienes WordPress 6.8 o posterior, tu web ya precarga páginas sin el plugin. Quédatelo solo si quieres su modo más agresivo y lo has probado bien, sobre todo si tienes tienda. Y si prefieres quitar también la nativa, te lo cuento en <a href="https://ayudawp.com/desactivar-carga-especulativa-wordpress/" target="_blank" rel="ugc noopener">cómo desactivar la carga especulativa de WordPress</a>.</li>
<li><strong>Enhanced Responsive Images:</strong> si tu tema es clásico, desactívalo, porque lo que añade no funciona con temas clásicos. Con un tema de bloques, decide si te compensa.</li>
<li><strong>Performant Translations:</strong> solo tiene sentido si usas plugins o temas con traducciones que no vienen de WordPress.org.</li>
<li><strong>Modern Image Formats:</strong> si lo quieres, que sea sabiendo que convierte tus imágenes a partir de ese momento y que quitarlo no lo deshace.</li>
<li><strong>Optimization Detective, Image Prioritizer y Embed Optimizer:</strong> llevan la beta en el número de versión, así que trátalos como tal.</li>
<li><strong>El plugin AI:</strong> pruébalo antes en una web de pruebas, y si lo usas en producción, revisa qué experimentos tienes activos en «<strong>Ajustes &gt; IA</strong>».</li>
<li><strong>Gutenberg:</strong> si no desarrollas ni pruebas funciones nuevas, no lo necesitas, que el editor ya viene con WordPress.</li>
</ul>
<p>Si <strong>quieres que tu escritorio te diga lo que WordPress.org no te dice</strong>, aquí tienes un fragmento de código que <strong>añade una nota debajo de cada uno de estos plugins</strong> en la lista de plugins instalados. Si además su función, o parte de ella, ya está en tu versión de WordPress, añade una segunda nota que te lo avisa:</p>
<pre>/**
 * Etiqueta plugins de prueba de WordPress.org (canonical, feature o experimentales) en la pantalla de plugins
 *
 * Añade una etiqueta roja bajo cada plugin de la lista, y cuando su funcionalidad ya es
 * parte del núcleo de WordPress, y una segunda ficha te avisa también de esto
 */

/**
 * Lista de plugins de pruebas de WordPress.org, anotados por su carpeta de plugin
 * Añade más al array si sale alguno nuevo
 *
 * 'core' es una función o clase que solo existe cuando la funcionalidad (o parte
 * de ella) ya está en el core. 'note' es el texto mostrado en su caso
 *
 * @return array
 */
function ayudawp_test_plugins() {
	$plugins = array(
		'gutenberg'               =&gt; array(),
		'performance-lab'         =&gt; array(),
		'webp-uploads'            =&gt; array(),
		'speculation-rules'       =&gt; array(
			'core' =&gt; 'wp_get_speculation_rules_configuration',
			'note' =&gt; 'Ya está en tu WordPress, y este plugin cambia su configuración',
		),
		'optimization-detective'  =&gt; array(),
		'image-prioritizer'       =&gt; array(),
		'embed-optimizer'         =&gt; array(),
		'dominant-color-images'   =&gt; array(),
		'auto-sizes'              =&gt; array(
			'core' =&gt; 'wp_sizes_attribute_includes_valid_auto',
			'note' =&gt; 'Parte ya está en tu WordPress, el resto solo sirve con temas de bloques',
		),
		'view-transitions'        =&gt; array(),
		'web-worker-offloading'   =&gt; array(),
		'nocache-bfcache'         =&gt; array(),
		'performant-translations' =&gt; array(
			'core' =&gt; 'WP_Translation_Controller',
			'note' =&gt; 'Casi todo ya está en tu WordPress',
		),
		'ai'                      =&gt; array(),
		'mcp-adapter'             =&gt; array(),
	);

	return apply_filters( 'ayudawp_test_plugins', $plugins );
}

/**
 * Añade las etiquetas a la fila de datos del plugin
 *
 * @param array  $meta        Datos meta en la ficha de plugins
 * @param string $plugin_file Archivo del plugin relativo al directorio de plugins
 * @return array
 */
function ayudawp_flag_test_plugins( $meta, $plugin_file ) {
	$plugins = ayudawp_test_plugins();
	$folder  = dirname( $plugin_file );

	if ( ! isset( $plugins[ $folder ] ) ) {
		return $meta;
	}

	$meta[] = '&lt;span class="ayudawp-badge ayudawp-badge-test"&gt;' . esc_html( 'Plugin de pruebas de WordPress.org' ) . '&lt;/span&gt;';

	$plugin = $plugins[ $folder ];
	if ( ! empty( $plugin['core'] ) &amp;&amp; ( function_exists( $plugin['core'] ) || class_exists( $plugin['core'], false ) ) ) {
		$meta[] = '&lt;span class="ayudawp-badge ayudawp-badge-core"&gt;' . esc_html( $plugin['note'] ) . '&lt;/span&gt;';
	}

	return $meta;
}
add_filter( 'plugin_row_meta', 'ayudawp_flag_test_plugins', 10, 2 );

/**
 * Estilos de las etiquetas para que se vean bien
 *
 * @param string $hook_suffix Current admin page.
 */
function ayudawp_test_plugins_styles( $hook_suffix ) {
	if ( 'plugins.php' !== $hook_suffix ) {
		return;
	}

	wp_register_style( 'ayudawp-test-plugins', false, array(), '1.0' );
	wp_enqueue_style( 'ayudawp-test-plugins' );
	wp_add_inline_style(
		'ayudawp-test-plugins',
		'.ayudawp-badge{display:inline-block;padding:2px 10px;border-radius:999px;color:#fff;font-size:12px;font-weight:600;line-height:1.6;}
		.ayudawp-badge-test{background:#b32d2e;}
		.ayudawp-badge-core{background:#8a4b00;}'
	);
}
add_action( 'admin_enqueue_scripts', 'ayudawp_test_plugins_styles' );</pre>
<p>Si no sabes muy bien dónde pegarlo, lo tienes explicado en <a href="https://ayudawp.com/functions-plugin-mu-snippets/" target="_blank" rel="ugc noopener">¿Plugin, functions.php, plugin de snippets o mu plugin? ¿dónde meto ese código en WordPress?</a>.</p>
<p>La lista va escrita a mano, así que si sale un plugin nuevo de este tipo puedes añadirlo con el filtro <code>ayudawp_test_plugins</code>.<br>
<a href="https://ayudawp.com/?attachment_id=160670" rel="nofollow"><img decoding="async" class="sombra alignnone wp-image-160670 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/aviso-plugins-canonical-1200x675.jpg" alt="" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/10/aviso-plugins-canonical-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/aviso-plugins-canonical-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/aviso-plugins-canonical-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/aviso-plugins-canonical.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<p>Por cierto, si lo que te preocupa es que alguno de los plugins que usas se cierre en el directorio y te quedes sin actualizaciones sin enterarte, de eso ya te avisa <a href="https://vigilante.works/es/" target="_blank" rel="nofollow noopener">Vigilante</a>, mi plugin de seguridad, más majo él.</p>
<h2>La decisión, como siempre, es tuya</h2>
<p>Probar está bien, y alguien tiene que hacerlo, pero <strong>lo que no tiene sentido es tener un experimento en producción sin saberlo</strong>, y menos aún cuando ya ni siquiera hace falta.</p>
<p>Revisa lo que tienes, decide con datos y, si estás de acuerdo con la propuesta, échale una mano en la incidencia. Y si no estás de acuerdo, si me he dejado algún plugin en el tintero, me tienes ahí abajo, en la sección de comentarios.</p>
<p>Ojalá dentro de un tiempo este artículo deje de tener sentido.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/plugins-beta-wordpress-org/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Error: You do not have permission to manage plugins</title>
		<link>https://ayudawp.com/error-you-do-not-have-permission-to-manage-plugins/</link>
					<comments>https://ayudawp.com/error-you-do-not-have-permission-to-manage-plugins/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 06:28:03 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[wp-config.php]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160652</guid>

					<description><![CDATA[Si cada vez que entras en una pantalla del escritorio de WordPress te salta una ventana del navegador con el mensaje «Error: You do not have permission to manage plugins», bienvenido a este (molesto) club.]]></description>
										<content:encoded><![CDATA[<p>Si <strong>cada vez que entras en una pantalla del escritorio de WordPress</strong> te salta una ventana del navegador con el mensaje «<strong>Error: You do not have permission to manage plugins</strong>», bienvenido a este (molesto) club de sufridores.</p>
<p>Aceptas, pasas a la siguiente pantalla y vuelta a empezar, aunque seas administrador y la web te deje hacer todo lo demás.</p>
<p><img decoding="async" class="sombra alignnone wp-image-160659 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/you-dont-have-permissions-to-manage-plugins.jpg" alt="" width="1200" height="193" srcset="https://ayudawp.com/wp-content/uploads/2026/10/you-dont-have-permissions-to-manage-plugins.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/you-dont-have-permissions-to-manage-plugins-768x124.jpg 768w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<p><strong>La culpa no es tuya ni de WordPress, es casi seguro del tema</strong>, que carga en todo el escritorio <strong>un script que comprueba si puedes instalar plugins</strong> y, si no puedes, te lo suelta en un aviso. Y sí, aun siendo administrador hay situaciones en las que WordPress no te deja instalar plugins.</p>
<p>Me lo encontré hace poco en la web de <a href="https://mantenimiento.ayudawp.com/" target="_blank" rel="noopener">un cliente del servicio de mantenimiento</a>, y te reconozco que al principio no le veía ningún sentido, porque yo tenía permisos completos y podía entrar en todas partes.</p>
<p>Vamos <strong>a ver de dónde sale y cómo quitártelo de encima</strong> sin romper nada.</p>
<h2>De dónde sale el aviso (y por qué no es de WordPress)</h2>
<p>La primera pista está en el propio mensaje, que sale en inglés en un escritorio en español. Los mensajes de permisos del núcleo llegan traducidos («Lo siento, no tienes permisos…» y así), por lo que que <strong>si ves un error de permisos en inglés en un WordPress en español, lo más probable es que venga de un tema o de un plugin</strong>.</p>
<p>En el caso que me tocó era el tema, que hace esto en cada pantalla del escritorio:</p>
<ol>
<li>Carga un archivo JavaScript, <code>plugin-installer.js</code>, en todas las pantallas de administración y no solo en las suyas.</li>
<li>Al cargar la página ese script pregunta por AJAX (una petición en segundo plano a <code>admin-ajax.php</code>) si está instalado el plugin complementario del tema.</li>
<li>Antes de contestar, el código del servidor comprueba si el usuario puede instalar plugins. Si no puede, devuelve el error y el script te lo enseña con un <code>alert()</code>, esa ventana del navegador que no te deja hacer nada hasta que pulsas Aceptar.</li>
</ol>
<p>¿Y por qué te lo pregunta a ti, que solo has entrado a editar una página? Pues porque <strong>el script no mira dónde estás ni qué vas a hacer, salta en todas partes y con todo el mundo</strong>.</p>
<p>Fíjate además en un detalle, porque <strong>el mensaje dice «manage» (gestionar), pero lo que se comprueba es si puedes instalar plugins</strong>, que no es lo mismo, y ahí está la clave de todo esto.</p>
<h2>Si soy administrador, ¿por qué no puedo instalar plugins?</h2>
<p>Esto tiene su gracia, o no, bueno, mola, eso seguro. Gestionar plugins (activarlos y desactivarlos) e instalarlos son permisos distintos, y <strong>hay situaciones en las que WordPress te quita el de instalar aunque tengas el perfil más alto</strong>.</p>
<p>WordPress no decide los permisos solo mirando el perfil. El perfil de administrador incluye la capacidad <code>install_plugins</code>, pero cuando un código pregunta <code>current_user_can( 'install_plugins' )</code> la respuesta pasa antes por la función <code>map_meta_cap()</code>, que tiene en cuenta el contexto.</p>
<p>Y si en el <code>wp-config.php</code> está definida la constante <a href="https://ayudawp.com/no-puedo-instalar-plugins/" target="_blank" rel="noopener"><code>DISALLOW_FILE_MODS</code></a> a <code>true</code>, la respuesta es que no, para todo el mundo, administradores incluidos.</p>
<p>Esa constante <strong>bloquea cualquier cambio de archivos desde el escritorio, o sea, instalar, actualizar o borrar plugins y temas, actualizar el núcleo y usar el editor de archivos</strong>, genial ¿no?. Con ella activa sigues pudiendo activar y desactivar plugins desde el menú de plugins, pero desaparece «Añadir nuevo plugin».</p>
<p>En mi caso la había activado ManageWP, pero puede venir del hosting, de un plugin de seguridad o de alguien que la puso a mano en el <code>wp-config.php</code>.</p>
<p>Y que conste que <strong><code>DISALLOW_FILE_MODS</code> es una buena medida de seguridad</strong>, porque si alguien consigue entrar en tu escritorio no puede instalarte un plugin con una puerta trasera ni meter código en un archivo del tema. El precio es que las actualizaciones tienes que hacerlas por otra vía, y quien la activa suele tenerlo resuelto.</p>
<p>Hay dos casos más en los que vas a ver el aviso sin que haya constante de por medio:</p>
<ul>
<li><strong>Usuarios que no son administradores</strong>: editores, autores o gestores de tienda no pueden instalar plugins, así que les sale en cada pantalla.</li>
<li><strong>Multisitio</strong>: en una red solo el superadmin puede instalar plugins, así que los administradores de cada sitio también lo sufren.</li>
</ul>
<h2>Cómo saber si te pasa</h2>
<p>Antes de tocar nada compruébalo, que es un momento:</p>
<ul>
<li><strong>El menú «Plugins»</strong>: si no te aparece «Añadir nuevo plugin», no tienes permiso para instalar.</li>
<li><strong>La petición que lo dispara</strong>: abre las herramientas para desarrolladores del navegador (F12 en casi todos), ve a la pestaña Red, filtra por <code>admin-ajax</code> y recarga la página. Si ves una petición cuya acción termina en <code>_check_plugin_status</code> (o algo parecido) y su respuesta trae el mensaje, ya tienes al culpable, y en la columna Iniciador verás qué script la ha lanzado.</li>
<li><strong>WP-CLI</strong>: si lo usas (sí, esa herramienta que no usa ni el tato y que en estos casos te ahorra un buen rato, y así de paso me salió un pareado), ejecuta el comando que tienes justo debajo con tu usuario.</li>
</ul>
<pre>wp eval 'var_dump( defined( "DISALLOW_FILE_MODS" ) &amp;&amp; DISALLOW_FILE_MODS, current_user_can( "install_plugins" ) );' --user=tu_usuario</pre>
<p>Si te devuelve <code>bool(true)</code> y <code>bool(false)</code>, la constante está activa y tu usuario no puede instalar plugins. Caso cerrado. Si quieres sacarle más partido a la línea de comandos, tienes <a href="https://ayudawp.com/wp-cli-la-interfaz-de-comandos-de-wordpress-guia-de-uso/" target="_blank" rel="noopener">mi tutorial de WP-CLI</a>.</p>
<h2>Lo que no deberías hacer</h2>
<p>Hay <strong>tres formas rápidas de quitarte el aviso</strong> de encima, pero ninguna es buena idea:</p>
<ul>
<li><strong>Quitar la constante</strong>: el aviso desaparece, sí, pero cambias seguridad por comodidad. Es peor el remedio que la enfermedad.</li>
<li><strong>Dar permiso para instalar plugins a editores y compañía</strong>: con un plugin de gestión de perfiles se puede, y lo he visto recomendar en algún foro de soporte, pero es abrir la puerta de par en par para dejar de oír el timbre.</li>
<li><strong>Editar el <code>functions.php</code> del tema</strong>: funciona hasta la siguiente actualización del tema, que te lo deja como estaba.</li>
</ul>
<blockquote><p>Si la constante está ahí por seguridad, lo que sobra es el aviso, no la constante.</p></blockquote>
<h2>La solución es quitar lo que realmente sobra, esa birria de script</h2>
<p><strong>Lo limpio es que el script del tema no se cargue cuando el usuario no puede instalar plugins</strong>, y no pierdes nada, porque el botón del tema para instalar su plugin tampoco te iba a funcionar.</p>
<p>Lo hago con un mu-plugin (<em>must-use plugin</em>, un plugin que WordPress carga siempre y que no se puede desactivar desde el escritorio, <a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="noopener">como te explico aquí</a>). Así <strong>no depende del tema, sobrevive a sus actualizaciones y nadie lo desactiva por error</strong>.</p>
<ol>
<li>Entra en la carpeta <code>wp-content</code> por FTP, por SSH o con el administrador de archivos del hosting.</li>
<li>Si no existe la carpeta <code>mu-plugins</code>, créala.</li>
<li>Crea dentro un archivo PHP, por ejemplo <code>silenciar-instalador-tema.php</code>, con el código que tienes a continuación.</li>
</ol>
<pre>&lt;?php
/**
 * Plugin Name: Silenciar instalador de plugins del tema
 * Description: Evita el aviso «You do not have permission to manage plugins» cuando el usuario no puede instalar plugins.
 */

defined( 'ABSPATH' ) || exit;

add_action( 'admin_enqueue_scripts', 'ayudawp_dequeue_theme_plugin_installer', 100 );

function ayudawp_dequeue_theme_plugin_installer() {
	if ( current_user_can( 'install_plugins' ) ) {
		return;
	}

	$scripts   = wp_scripts();
	$theme_uri = get_template_directory_uri();

	foreach ( $scripts-&gt;queue as $handle ) {
		if ( ! isset( $scripts-&gt;registered[ $handle ] ) ) {
			continue;
		}

		$src = (string) $scripts-&gt;registered[ $handle ]-&gt;src;

		if ( str_starts_with( $src, $theme_uri ) &amp;&amp; str_ends_with( $src, 'plugin-installer.js' ) ) {
			wp_dequeue_script( $handle );
		}
	}
}</pre>
<p>Guarda, recarga el escritorio y <strong>el aviso no debería volver a salir</strong>.</p>
<p>Por si quieres entender lo que subes (que deberías, nunca pegues código sin saber qué hace), esto es lo que hace:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Si el usuario puede instalar plugins, no hace nada y el tema funciona como siempre.</li>
<li>Si no puede, repasa los scripts que se van a cargar en esa pantalla y quita los que salen de la carpeta del tema y terminan en <code>plugin-installer.js</code>.</li>
</ul>
</li>
</ul>
<ul>
<li>Se engancha con prioridad 100 para ejecutarse después de que el tema haya encolado su script, cosa que hace con la prioridad normal, 10.</li>
<li>Compara con la carpeta del tema padre (<code>get_template_directory_uri()</code>), que es desde donde lo carga el tema, así que funciona igual con un tema hijo activo.</li>
<li><code>str_starts_with()</code> y <code>str_ends_with()</code> son funciones de PHP 8, pero WordPress las incluye por su cuenta desde la versión 5.9, así que no hay problema con PHP 7.</li>
</ul>
<blockquote><p><strong>Nota</strong>: si en tu caso el script se llama de otra forma, lo localizas con la columna Iniciador que te comentaba antes. Cambia <code>plugin-installer.js</code> por el nombre que corresponda y listo. Y si algún día quitas la constante, el script vuelve a cargarse solo, sin tocar nada más.</p></blockquote>
<h2>Un apunte para quien desarrolla temas</h2>
<p>Comprobar los permisos en el servidor antes de instalar nada está bien hecho, eso hay que reconocerlo. Lo que sobra es lo demás, porque <strong>un script que solo sirve en un par de pantallas del tema no tiene por qué cargarse en todo el escritorio</strong>, ni preguntar nada a quien no puede instalar plugins, y mucho menos contestarle con un <code>alert()</code> con el que no puede hacer nada salvo aceptar.</p>
<p>Lo correcto sería comprobar <code>current_user_can( 'install_plugins' )</code> antes de encolar el script y cargarlo solo en las pantallas donde se usa.</p>
<p>Si el tema que usas hace esto, cuéntaselo a su desarrollador, que es un cambio pequeño y le ahorra el mal rato a mucha gente.</p>
<p>Para cualquier duda, o si te ha salido algo parecido con otro tema o con otro mensaje, me tienes ahí abajo, en los comentarios. Un aviso menos, y a otra cosa.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/error-you-do-not-have-permission-to-manage-plugins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Filtros de WooCommerce y bots: la trampa de rastreo que te puede tumbar la tienda online</title>
		<link>https://ayudawp.com/trampa-rastreo/</link>
					<comments>https://ayudawp.com/trampa-rastreo/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 20 Oct 2026 06:28:37 +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[Cloudflare]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[robots.txt]]></category>
		<category><![CDATA[Search Console]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160573</guid>

					<description><![CDATA[Si tu tienda WooCommerce se cae sin ataque aparente ni pico de ventas, y el hosting te avisa de que has superado tus recursos, mira qué direcciones están pidiendo los robots…]]></description>
										<content:encoded><![CDATA[<p>Si tu tienda <strong>WooCommerce se cae sin ataque aparente ni pico de ventas</strong>, y el hosting te avisa de que has superado tus recursos, <strong>mira qué direcciones están pidiendo los robots, porque puede que estén recorriendo una por una todas las combinaciones de tu filtro de productos</strong> hasta que el servidor dice basta.</p>
<p>Últimamente me lo estoy encontrando bastante, en varios clientes distintos del <a href="https://mantenimiento.ayudawp.com/" target="_blank" rel="ugc noopener">servicio de mantenimiento</a> y con la misma dinámica, y como ya tengo visto el problema y varias posibles soluciones creo que ya tocaba compartirlo.</p>
<p>Te cuento <strong>qué pasa, cómo comprobar si te afecta y cómo parar esta locura</strong>, que lo es, y que puede tirar abajo prácticamente cualquier tienda online.</p>
<h2>Culpable: un filtro que crea URLs a lo loco</h2>
<p><strong>El filtro por atributos</strong> clásico de WooCommerce, el que te deja elegir talla, color o lo que tengas, funciona con enlaces normales y sin AJAX (la técnica que actualiza una página sin recargarla).</p>
<p>Cada vez que marcas una opción de selección de atributo se carga una dirección nueva con los parámetros del filtro, como esta:</p>
<p><code>/categoria-producto/camisetas/?filter_color=azul,rojo&amp;query_type_color=or&amp;filter_talla=m,l&amp;query_type_talla=or</code></p>
<p><strong>Con 10 tallas hay 1.023 formas de marcar al menos una, con 30 ya son 1.073.741.823, y eso con un solo atributo</strong>, porque al sumar color, material y compañía las combinaciones se multiplican entre sí. Nadie las va a probar todas salvo un robot que no se cansa ni tiene pausas para el almuerzo, y aquí empieza el problema.</p>
<p>Lo que genera el problema es la suma de tres factores:</p>
<ol>
<li><strong>Combinaciones casi infinitas:</strong> el número de URLs posibles es enorme, pero a un robot no le cuesta nada solicitarlas.</li>
<li><strong>Enlaces que cualquiera puede seguir:</strong> el widget clásico de atributos marca los enlaces del filtro con <code>rel="nofollow"</code>, pero <strong>eso es una pista y no una barrera</strong>, porque nada obliga a un robot a hacerle caso. Además, según <a href="https://developers.google.com/crawling/docs/faceted-navigation" target="_blank" rel="nofollow noopener">la documentación de Google sobre navegación por facetas</a> el atributo solo funciona si lo lleva cada enlace que apunta a esa dirección.</li>
<li><strong>Casi ninguna se sirve desde caché:</strong> con tantas direcciones distintas, una caché de página casi nunca tendrá la copia lista cuando llega el robot, y WordPress y WooCommerce montan cada página desde cero. Google lo resume diciendo que rastrear este tipo de direcciones suele costar al sitio muchos recursos de cómputo.</li>
</ol>
<p>Con toda esta tormenta perfecta la cuenta de tu web en el hosting se puede quedar sin cuota de CPU o de procesos y el servidor empieza a rechazar visitas.</p>
<p>El síntoma típico es el <strong>error 508</strong>, <code>Resource Limit Is Reached</code>, que significa que tu cuenta ha superado alguno de sus límites de recursos.</p>
<p>Este problema (gordo) tiene incluso nombre y apellido, <strong>trampa de rastreo</strong> (<em>crawl trap</em>, si buscas en inglés), y consiste básicamente en que <strong>un robot que sigue enlaces puede meterse en un laberinto con casi infinitas salidas</strong>.</p>
<h2>Para tumbar una tienda no hace falta un ataque enorme</h2>
<p>Cuando una tienda se cae así cualquiera pensaría en un ataque DDoS (un ataque de denegación de servicio, con montones de máquinas pidiendo cosas a la vez para colapsar tu web), pero en realidad hace falta mucho menos.</p>
<p>Una página que ya está almacenada en caché la sirve cualquier hosting a un ritmo altísimo, pero <strong>una que WordPress y WooCommerce tienen que montar desde cero, con sus consultas a la base de datos, cuesta muchísimo más</strong>.</p>
<p>Si todas las peticiones son de las segundas, sin caché, un hosting compartido, e incluso muchos Cloud y VPS, con sus cuotas de recursos asignadas, aguanta mucho menos.</p>
<p>Los que recorren esas direcciones son de dos tipos, por un lado están los rastreadores conocidos como <code>Googlebot</code> o el agente de Meta (<code>meta-externalagent</code>), y cada vez más <a href="https://ayudawp.com/bloquear-bots-ia/" target="_blank" rel="ugc noopener">los rastreadores de las IAs</a>, que al menos te dicen quiénes son.</p>
<p>Y luego están los robots que se hacen pasar por un navegador corriente y no se identifican. <strong>Por eso conviene bloquear por el patrón de la dirección y no por quién la pide</strong>, porque a los segundos no hay forma fiable de reconocerlos.</p>
<p>Si te interesa ver cuáles de esos rastreadores de IA te visitan y poder cerrarles el paso, mi plugin <a href="https://wordpress.org/plugins/vigia/" target="_blank" rel="nofollow noopener">VigIA</a> detecta más de 60 por su identificador y permite bloquearlos. Pero lo hace por quién pide y no por la dirección, así que no sustituye a las capas de más abajo, y no ve a los que se hacen pasar por un navegador ni a Googlebot.</p>
<p>Dos pistas que delatan el problema son, por un lado picos de peticiones a <strong>horas en las que no compra nadie</strong>, y por otro <strong>visitas masivas desde países donde no vendes</strong>, si tu hosting o tu CDN te dejan ver de dónde llegan.</p>
<h2>Cómo saber si estás sufriendo una trampa de rastreo debido a los filtros de atributos</h2>
<p>Los registros de acceso (la lista de todo lo que ha pedido cada visitante) lo dirían todo, pero leerlos mediante comandos de consola no es para todo el mundo, y hay alternativas más cómodas, de menos a más esfuerzo. Te las cuento, porque yo suelo también usarlas así, en este orden creciente.</p>
<h3>La prueba de la barra de direcciones</h3>
<p>Entra en una categoría de tu tienda, marca una opción del filtro y mira la barra de direcciones. Si aparece algo como <code>?filter_color=azul</code>, tu filtro escribe la selección en la dirección, la causa del problema del que estamos hablando.</p>
<p><a href="https://ayudawp.com/?attachment_id=160655" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160655 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/producto-woocomerce-filter-1200x716.jpg" alt="" width="1200" height="716" srcset="https://ayudawp.com/wp-content/uploads/2026/10/producto-woocomerce-filter-1200x716.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/producto-woocomerce-filter-768x458.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/producto-woocomerce-filter-1536x917.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/producto-woocomerce-filter.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Para saber si los robots pueden llegar hasta ahí, pulsa <code>Ctrl+U</code> en Chrome o Firefox (en Mac, <code>Cmd+Option+U</code> en Chrome y <code>Cmd+U</code> en Firefox) para ver el código fuente de la página, busca <code>filter_</code> y fíjate en si lo que encuentras son enlaces (<code>&lt;a href="…filter_…"</code>).</p>
<p>Si tus enlaces son de ese tipo un robot puede seguirlos y deberías seguir leyendo esta guía. Si no hay ninguno el riesgo es menor, pero no des el caso por cerrado sin mirar los registros o el contador del que te hablo más abajo.</p>
<h3>Los registros de tu hosting</h3>
<p>Si en el panel de tu hosting puedes descargar o ver los registros de acceso, ábrelos con un editor de texto y busca <code>filter_</code>. Si lo llevan la mayoría de las líneas, ya sabes cuál es tu problema.</p>
<h3>Mini plugin para tener un contador con el que diagnosticar el problema</h3>
<p>Si no tienes acceso a los registros, o prefieres una cifra clara, puedes poner a contar a la propia web con un pequeño plugin de un solo archivo.</p>
<p>Crea en tu ordenador un archivo de texto llamado <code>ayudawp-filter-detector.php</code> con este contenido, súbelo a la carpeta <code>wp-content/plugins</code> con el gestor de archivos de tu hosting o por FTP, o si lo prefieres lo comprimes en un zip y lo instalas como como siempre, y actívalo en la pantalla de plugins.</p>
<pre>&lt;?php
/**
 * Plugin Name: AyudaWP Detector de filtros
 * Plugin URI:  https://plugins.ayudawp.com
 * Description: Diagnóstico temporal. Cuenta las peticiones públicas con parámetros de filtro de WooCommerce y muestra el total en el escritorio.
 * Version:     1.0.0
 * Author:      Fernando Tellado
 * Author URI:  https://ayudawp.com
 * License:     GPL-2.0-or-later
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Indica si los parámetros incluyen algún nombre filter_*.
 *
 * Lee los parámetros ya interpretados por PHP, igual que WooCommerce.
 *
 * @param array $params Parámetros de la petición ($_GET).
 * @return bool
 */
function ayudawp_fd_has_filter( array $params ): bool {
	foreach ( array_keys( $params ) as $name ) {
		if ( 0 === strpos( (string) $name, 'filter_' ) ) {
			return true;
		}
	}
	return false;
}

/**
 * Cuenta la petición y guarda las últimas direcciones. No guarda IP ni navegador.
 *
 * El recuento es aproximado: dos peticiones simultáneas pueden pisarse.
 */
function ayudawp_fd_record(): void {
	if ( is_admin() || wp_doing_ajax() || wp_doing_cron() ) {
		return;
	}

	// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Solo se leen nombres de parámetros, no se guarda ni se muestra nada.
	if ( ! ayudawp_fd_has_filter( $_GET ) ) {
		return;
	}

	$uri = ( isset( $_SERVER['REQUEST_URI'] ) &amp;&amp; is_string( $_SERVER['REQUEST_URI'] ) )
		? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
		: '';

	$stats = get_transient( 'ayudawp_fd_stats' );
	if ( ! is_array( $stats ) ) {
		$stats = array(
			'since' =&gt; time(),
			'count' =&gt; 0,
			'last'  =&gt; array(),
		);
	}

	++$stats['count'];
	array_unshift( $stats['last'], substr( $uri, 0, 150 ) );
	$stats['last'] = array_slice( $stats['last'], 0, 10 );

	set_transient( 'ayudawp_fd_stats', $stats, WEEK_IN_SECONDS );
}
add_action( 'init', 'ayudawp_fd_record' );

/**
 * Muestra las cifras en el escritorio, solo a administradores.
 */
function ayudawp_fd_notice(): void {
	global $pagenow;

	if ( 'index.php' !== $pagenow || ! current_user_can( 'manage_options' ) ) {
		return;
	}

	$stats = get_transient( 'ayudawp_fd_stats' );
	if ( ! is_array( $stats ) || empty( $stats['count'] ) ) {
		echo '&lt;div class="notice notice-info"&gt;&lt;p&gt;&lt;strong&gt;AyudaWP.com - Detector de filtros&lt;/strong&gt;&lt;/p&gt;';
		echo '&lt;p&gt;Activo, pero todavía no ha contado ninguna petición con parámetros de filtro. Un cero no descarta el problema: si hay una caché, Cloudflare, el .htaccess o el plugin de bloqueo por delante, esas peticiones no llegan hasta aquí.&lt;/p&gt;&lt;/div&gt;';
		return;
	}

	echo '&lt;div class="notice notice-warning"&gt;&lt;p&gt;&lt;strong&gt;AyudaWP.com - Detector de filtros&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;';
	printf(
		'Peticiones con parámetros de filtro: %1$s (desde el %2$s).',
		esc_html( number_format_i18n( (int) $stats['count'] ) ),
		esc_html( wp_date( 'j/n/Y H:i', (int) $stats['since'] ) )
	);
	echo '&lt;/p&gt;&lt;p&gt;Últimas direcciones pedidas:&lt;/p&gt;&lt;ul&gt;';
	foreach ( (array) $stats['last'] as $address ) {
		echo '&lt;li&gt;&lt;code&gt;' . esc_html( (string) $address ) . '&lt;/code&gt;&lt;/li&gt;';
	}
	echo '&lt;/ul&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_fd_notice' );

// Al desactivar el plugin se borran los datos del contador.
register_deactivation_hook(
	__FILE__,
	static function () {
		delete_transient( 'ayudawp_fd_stats' );
	}
);</pre>
<p>Este pequeño plugin cuenta las peticiones de la parte pública de la web que llevan parámetros <code>filter_</code> y, cuando entras a «Escritorio &gt; Inicio» como administrador, te muestra el total, desde cuándo está contando y las últimas direcciones pedidas. Mientras no haya contado ninguna, el aviso te dice que está activo y que todavía no ha visto nada.</p>
<p><a href="https://ayudawp.com/?attachment_id=160656" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160656 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/detector-filtros-plugin-woocommerce-1200x678.jpg" alt="" width="1200" height="678" srcset="https://ayudawp.com/wp-content/uploads/2026/10/detector-filtros-plugin-woocommerce-1200x678.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/detector-filtros-plugin-woocommerce-768x434.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/detector-filtros-plugin-woocommerce-1536x867.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/detector-filtros-plugin-woocommerce.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Para comprobar que funciona, añade <code>?filter_prueba=1</code> al final de la dirección de tu tienda desde una ventana de incógnito y vuelve a «Escritorio &gt; Inicio» y el contador debería marcar 1. Si no sube, algo atiende esa petición antes de que llegue a PHP, como una caché o una regla de bloqueo.</p>
<p>El código no guarda direcciones IP ni identificadores de navegador. Las cifras son aproximadas, porque si dos peticiones coinciden en el mismo instante una puede pisar a la otra, y los datos caducan solos tras siete días sin peticiones con filtro.</p>
<p>También ten en cuenta que solo ve las peticiones que llegan hasta PHP, y las que sirve una caché o corta Cloudflare, el <code>.htaccess</code> o el plugin de bloqueo (si ya lo tienes activo) no pasan por aquí, de modo que la cifra real será igual o mayor.</p>
<p><strong>Úsalo unas horas y quítalo.</strong> Cada petición que cuenta hace unas cinco consultas a la base de datos (en una instalación sin caché de objetos persistente son tres lecturas y dos escrituras), y si tu servidor ya va justo se notan. Cuando tengas la cifra, desactívalo y bórralo desde Plugins.</p>
<h2>Cómo parar una trampa de rastreo en 3 capas</h2>
<p>Mi criterio es cortar lo más lejos posible de WordPress, porque cuanto antes pares una petición, menos trabajo le llega a tu servidor. Las capas van en este orden y puedes montar una, dos o las tres.</p>
<table border="1" cellspacing="0" cellpadding="8">
<thead>
<tr>
<th>Capa</th>
<th>Dónde corta</th>
<th>Qué necesitas</th>
<th>¿Sigue funcionando el filtro?</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. Cloudflare</td>
<td>Antes de llegar a tu hosting</td>
<td>Web detrás de Cloudflare, vale el plan gratuito</td>
<td>No, para nadie</td>
</tr>
<tr>
<td>2. .htaccess</td>
<td>En el servidor, antes de WordPress</td>
<td>Apache o LiteSpeed y acceso al archivo</td>
<td>No, para nadie</td>
</tr>
<tr>
<td>3. Plugin de bloqueo</td>
<td>Dentro de WordPress, antes de que cargue WooCommerce</td>
<td>Poder subir un archivo a <code>wp-content/plugins</code></td>
<td>Lo decides tú: con <code>0</code> se bloquea cualquier filtro y con un número se pone un límite</td>
</tr>
</tbody>
</table>
<p>Las tres capas <strong>bloquean por el nombre del parámetro y no distinguen quién lo envía</strong>. Si usas otro plugin que ponga parámetros que empiecen por <code>filter_</code> en la parte pública de tu web, comprueba que sigue funcionando después.</p>
<p>Lo mismo vale para los bloques de filtro de producto que trae el propio WooCommerce, que usan esos mismos parámetros y también se ven afectados por el bloqueo total.</p>
<p>Cloudflare y el <code>.htaccess</code> buscan el texto <code>filter_</code> tal como llega en la dirección, mientras que la tercera capa lee los parámetros que PHP entrega a WooCommerce. Para los robots que siguen los enlaces del filtro da igual, porque piden justo las direcciones que el filtro genera.</p>
<p>Pero no para quien escriba a mano una variante como <code>filter.color=azul</code> (PHP convierte el punto en un guion bajo y WooCommerce la entiende igual), pues se salta las dos primeras capas, y solo el plugin la para.</p>
<p>Además, las reglas solo cubren los parámetros <code>filter_</code>: el widget clásico de filtrar por valoración usa enlaces con <code>rating_filter</code>, que también se pueden rastrear y que estas reglas no tocan.</p>
<h3>Primera capa: Cloudflare, antes de que llegue a tu hosting</h3>
<p>Cloudflare con su plan gratuito permite <a href="https://developers.cloudflare.com/waf/custom-rules/" target="_blank" rel="nofollow noopener">hasta 5 reglas personalizadas</a>, con la acción de bloquear incluida. Con una sola puedes parar estas peticiones sin que tu servidor se entere. Para crearla:</p>
<ol>
<li>En el panel de Cloudflare entra en la página «Security rules» (si tienes el panel en español, puede aparecer traducida) y pulsa «Create rule» y después «Custom rules».</li>
<li>Ponle un nombre que te acuerdes de qué hace, por ejemplo «Bloquear filtros de WooCommerce».</li>
<li>Pulsa el enlace «Edit expression», junto a la vista previa de la expresión, para <a href="https://developers.cloudflare.com/ruleset-engine/rules-language/expressions/edit-expressions/" target="_blank" rel="nofollow noopener">editarla a mano</a>, y pega esto:
<pre>(starts_with(http.request.uri.query, "filter_") or http.request.uri.query contains "&amp;filter_") and not starts_with(http.request.uri.path, "/wp-admin/")</pre>
</li>
<li>En la acción elige «Block» y pulsa «Deploy».</li>
</ol>
<p>La primera parte busca parámetros que empiecen por <code>filter_</code>, ya sea al principio de la dirección o detrás de un <code>&amp;</code>, y la segunda deja fuera el escritorio de WordPress, porque el botón «Filtrar» de las listas de entradas, páginas y productos envía un parámetro llamado <code>filter_action</code> y sin esa excepción te quedarías sin él.</p>
<ul>
<li><strong>Tu web tiene que estar detrás de Cloudflare con el proxy activado</strong> (la nube naranja de «Proxied»): Con la nube gris, Cloudflare solo hace de DNS y <a href="https://developers.cloudflare.com/dns/proxy-status/" target="_blank" rel="nofollow noopener">no aplica ninguna regla</a>.</li>
<li><strong>Pruébala:</strong> añade <code>?filter_color=azul</code> al final de la dirección de tu tienda y, si funciona, verás una página de bloqueo en lugar de tu tienda. Para ver cuántas peticiones ha parado, mira en Analytics la <a href="https://developers.cloudflare.com/waf/analytics/security-events/" target="_blank" rel="nofollow noopener">pestaña Events</a>, donde en el plan gratuito sale una muestra de los eventos y no todos, y se guardan hasta 31 días.</li>
<li><strong>Mientras la regla esté activa, el filtro deja de funcionar para tus clientes:</strong> El resto de la tienda va con normalidad, que es mejor que una web caída. Si de verdad lo usan, la tercera capa te deja un punto medio.</li>
<li><strong>El límite de velocidad del plan gratuito se queda corto para esto:</strong> <a href="https://developers.cloudflare.com/waf/rate-limiting-rules/" target="_blank" rel="nofollow noopener">solo admite una regla</a>, con ventanas de 10 segundos y por IP, y un límite por IP sirve de poco contra robots que llegan desde muchas direcciones distintas.</li>
</ul>
<p>Si todavía no tienes tu web en Cloudflare, ponerla lleva su proceso (lo habitual es cambiar los servidores de nombres de tu dominio, o sea, los DNS) y no es lo que quieres hacer con la tienda caída. Pasa a la capa siguiente y deja Cloudflare para cuando respires.</p>
<h3>Segunda capa: el servidor, con una regla en el .htaccess</h3>
<p>Si no usas Cloudflare, o quieres una segunda barrera por si alguien llega a tu servidor sin pasar por él, la regla va en el <code>.htaccess</code>. Haz antes una copia del archivo y pega esto <strong>al principio, antes de la línea <code># BEGIN WordPress</code></strong>, para que WordPress no la toque.</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/wp-admin/ [NC]
RewriteCond %{QUERY_STRING} (^|&amp;)filter_ [NC]
RewriteRule .* - [F,L]
&lt;/IfModule&gt;</pre>
<p>La regla <strong>devuelve un 403</strong> a cualquier petición con un parámetro que empiece por <code>filter_</code>, y deja fuera <code>/wp-admin/</code> por el mismo motivo que en Cloudflare. Si en tu filtro solo usas un atributo puedes afinar más y poner su nombre, por ejemplo <code>(^|&amp;)filter_talla=</code>.</p>
<p>Vale para Apache y LiteSpeed, que leen el <code>.htaccess</code>, pero no para nginx. Y como en la capa anterior, <strong>mientras esté activa, el filtro deja de funcionar para tus clientes</strong>.</p>
<h3>Tercera capa: un plugin que cierra la puerta desde WordPress</h3>
<p>Si no puedes tocar ni Cloudflare ni el <code>.htaccess</code>, o <strong>quieres que tus clientes puedan seguir filtrando con un límite razonable</strong>, esta es tu capa.</p>
<p>Se ejecuta dentro de WordPress, así que el servidor ya ha hecho parte del trabajo, pero corta la petición antes de que cargue WooCommerce y el tema, y por tanto antes de que hagan sus consultas.</p>
<p>Se instala igual que el contador que hemos visto antes, en este caso el nombre del archivo recomendado sería <code>ayudawp-filter-trap-guard.php</code>:</p>
<pre>&lt;?php
/**
 * Plugin Name: AyudaWP Bloqueo de filtros
 * Plugin URI:  https://plugins.ayudawp.com
 * Description: Rechaza las direcciones con filtros de WooCommerce (filter_*) antes de que carguen WooCommerce y el tema.
 * Version:     1.0.0
 * Author:      Fernando Tellado
 * Author URI:  https://ayudawp.com
 * License:     GPL-2.0-or-later
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// Opciones de filtro que se permiten en una petición. Con 0 se bloquea cualquier filtro,
// y con 2 tus clientes pueden combinar hasta dos opciones y se rechaza lo que pase de ahí.
if ( ! defined( 'AYUDAWP_FTG_MAX_OPTIONS' ) ) {
	define( 'AYUDAWP_FTG_MAX_OPTIONS', 0 );
}

/**
 * Indica si los parámetros traen más opciones de filtro de las permitidas.
 *
 * Lee los parámetros ya interpretados por PHP, igual que WooCommerce, así que también
 * pilla nombres escritos de forma rara. Cada valor de cada filter_* cuenta como una opción.
 *
 * @param array $params Parámetros de la petición ($_GET).
 * @param int   $max    Opciones permitidas. Con 0 se rechaza cualquier filtro.
 * @return bool
 */
function ayudawp_ftg_should_block( array $params, int $max ): bool {
	$found   = false;
	$options = 0;

	foreach ( $params as $name =&gt; $value ) {
		if ( 0 !== strpos( (string) $name, 'filter_' ) ) {
			continue;
		}

		// WooCommerce espera un texto separado por comas, nunca una lista.
		if ( is_array( $value ) ) {
			return true;
		}

		$found    = true;
		$options += max( 1, count( array_filter( explode( ',', (string) $value ), 'strlen' ) ) );
	}

	return $found &amp;&amp; ( 0 === $max || $options &gt; $max );
}

/**
 * Responde 403 y corta si la petición es un filtro rechazado.
 */
function ayudawp_ftg_maybe_block(): void {
	// El escritorio, AJAX y cron usan nombres filter_* para sus cosas.
	if ( is_admin() || wp_doing_ajax() || wp_doing_cron() ) {
		return;
	}

	// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Solo se leen nombres y recuentos de parámetros, no se guarda ni se muestra nada.
	if ( ! ayudawp_ftg_should_block( $_GET, (int) AYUDAWP_FTG_MAX_OPTIONS ) ) {
		return;
	}

	status_header( 403 );
	header( 'Cache-Control: no-store, max-age=0' );
	header( 'Content-Type: text/plain; charset=utf-8' );
	exit( 'Forbidden' );
}

ayudawp_ftg_maybe_block();</pre>
<p>El número que manda está al principio, en <code>AYUDAWP_FTG_MAX_OPTIONS</code>, y lo cambias editándolo en el propio archivo (o definiéndolo en el <code>wp-config.php</code>, si prefieres no tocar el plugin).</p>
<ul>
<li>Con <code>0</code>, cualquier dirección con <code>filter_</code> recibe un 403, igual que en las capas anteriores.</li>
<li>Con <code>2</code>, tus clientes pueden combinar hasta dos opciones (un color y una talla, por ejemplo) y todo lo que pase de ahí se rechaza. En el ejemplo de las 10 tallas, <strong>pasas de 1.023 combinaciones posibles a 55</strong>.</li>
</ul>
<p>Los robots seguirán pidiendo las combinaciones que sí se permiten, y el widget seguirá ofreciendo la tercera opción a tus clientes: quien la marque verá un <code>Forbidden</code> en texto plano en lugar de su tienda.</p>
<p>Es un parche <strong>poco elegante, pero muuucho mejor que una tienda caída</strong>. Si tu hosting está en las últimas empieza con <code>0</code> y sube el número cuando pase el apretón.</p>
<p>Para probarlo, con el valor <code>0</code>, abre tu tienda con <code>?filter_color=azul</code> al final. Si ves un texto que dice <code>Forbidden</code>, funciona.</p>
<p>WordPress carga los plugins activos por orden alfabético y este empieza por «ayudawp», así que corta antes de que cargue WooCommerce. Solo se te adelantaría uno cuyo nombre empiece antes, como Akismet.</p>
<p>Si prefieres que el plugin se cargue siempre el primero, el mismo archivo funciona sin cambios en <code>wp-content/mu-plugins/</code>, donde WordPress carga los <a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="ugc noopener">mu-plugins</a> antes que cualquier plugin normal y sin activarlos.</p>
<h2>¿Sirven de algo el robots.txt, el canonical y los errores 4xx?</h2>
<p>Sobre esto circula mucho consejo por ahí, y prefiero quedarme con lo que dice la documentación de Google ¿y tú?:</p>
<ul>
<li><strong>robots.txt:</strong> una regla como <code>Disallow: /*?*filter_</code> hace que <code>Googlebot</code> deje de pedir esas direcciones, y <a href="https://developers.google.com/crawling/docs/faceted-navigation" target="_blank" rel="nofollow noopener">Google la recomienda en primer lugar</a> para la navegación facetada. Tiene dos límites, uno es que según <a href="https://developers.google.com/search/docs/crawling-indexing/robots/intro" target="_blank" rel="nofollow noopener">su documentación sobre robots.txt</a> una página bloqueada puede indexarse igualmente si otros sitios enlazan a ella, y el otro que solo lo cumplen los robots que quieren cumplirlo, es declarativo, como todo en el fichero robots.txt, no obligatorio.</li>
<li><strong>Canonical:</strong> apuntar las páginas filtradas a la categoría sin filtrar le dice a Google cuál es la versión buena, pero según esa misma <a href="https://developers.google.com/crawling/docs/faceted-navigation" target="_blank" rel="nofollow noopener">documentación sobre navegación por facetas</a> solo puede reducir el volumen de rastreo con el tiempo y a largo plazo es menos eficaz que el robots.txt.</li>
<li><strong>Errores 4xx:</strong> según <a href="https://developers.google.com/search/docs/crawling-indexing/http-network-errors" target="_blank" rel="nofollow noopener">la documentación de Google sobre códigos de estado</a>, todos los 4xx se tratan igual salvo el 429, y no distingue entre un 404 y un 410. Devolver un 403 o un 410 da lo mismo, y las direcciones que ya estuvieran indexadas y pasen a devolver cualquiera de ellos acaban saliendo del índice. Eso sí, esa misma página desaconseja usar el 401 y el 403 para limitar el ritmo de rastreo, y los que hacen que <code>Googlebot</code> afloje son los errores 5xx y el 429. El 403 de tus capas no sirve para que venga menos, y lo que consigues es que cada visita cueste muy poco.</li>
</ul>
<p><strong>Si bloqueas las direcciones en el robots.txt, Googlebot no las pide y por tanto nunca ve ese 403.</strong> Si en Search Console ves direcciones con filtro indexadas y quieres que desaparezcan quita el <code>Disallow</code> una temporada (tus reglas las responden sin esfuerzo) y deja que Google compruebe que ya no existen. Si no hay ninguna indexada déjalo como está.</p>
<h2>Quitar la causa y no solo tapar el agujero</h2>
<p>Las capas frenan el golpe pero el filtro sigue roto para tus clientes, salvo que hayas puesto un límite en la tercera. Hay dos salidas habituales, con lo que te llevas y lo que te cuesta cada una.</p>
<h3>Lo bueno y lo malo de quitar los filtros con muchos valores</h3>
<p><strong>A favor</strong></p>
<ul>
<li>Cuesta cero y no hay nada que mantener.</li>
<li>Desaparecen los enlaces del laberinto en su origen. Como las combinaciones crecen de forma exponencial, quitar el atributo con 30 valores elimina de golpe los más de mil millones de direcciones que generaba.</li>
<li>Un filtro menos que probar cada vez que actualizas WooCommerce o el tema.</li>
</ul>
<p><strong>En contra</strong></p>
<ul>
<li>Pierdes una función que quizá usan tus clientes. Mira tu analítica antes de quitar nada.</li>
<li>Reduce el problema, pero no lo cierra. Tres atributos de cuatro valores cada uno ya dan 4.095 direcciones, más que de sobra para un robot que no se cansa, así que las capas se quedan igual.</li>
<li>Si en tu sector el filtro es parte de cómo se compra, quitarlo puede costar ventas, y solo lo sabrás midiendo.</li>
</ul>
<h3>Lo bueno y lo malo del filtro AJAX</h3>
<p>Un filtro AJAX actualiza los productos sin recargar la página y puede funcionar sin enlaces con parámetros que los robots sigan, aunque eso depende de cómo esté hecho cada plugin.</p>
<p>Entre los plugins de este tipo están <a href="https://facetwp.com/pricing/" target="_blank" rel="nofollow noopener">FacetWP</a>, de pago, y <a href="https://es.wordpress.org/plugins/annasta-woocommerce-product-filters/" target="_blank" rel="nofollow noopener">annasta Filters for WooCommerce</a>, disponible en el directorio de WordPress.org, en parte gratis y en parte de pago.</p>
<p><strong>A favor</strong></p>
<ul>
<li>Mantienes el filtro para la gente que sí lo usa.</li>
<li>Si las opciones no son enlaces, los robots se quedan sin laberinto. <a href="https://facetwp.com/help-center/developers/the-facetwp-url/" target="_blank" rel="nofollow noopener">FacetWP</a> dice en su documentación que las facetas son invisibles para los buscadores, y los bloques de filtro de WooCommerce pintan las opciones con JavaScript.</li>
<li>Algunos plugins traen controles de SEO. La ficha de <a href="https://es.wordpress.org/plugins/annasta-woocommerce-product-filters/" target="_blank" rel="nofollow noopener">annasta</a> anuncia canonical automático en las páginas filtradas y opciones de noindex y nofollow.</li>
</ul>
<p><strong>En contra</strong></p>
<ul>
<li><strong>Cuesta dinero o tiempo</strong>: FacetWP Basic son 99 dólares al año para entre 1 y 3 sitios, annasta es gratuito pero con funciones de pago, y en los dos casos hay que configurarlo y probarlo con tu tema y tu maquetador.</li>
<li>Es JavaScript y <strong>una dependencia más que mantener y actualizar</strong>.</li>
<li><strong>Las direcciones filtradas siguen existiendo</strong>: FacetWP escribe la selección en la dirección (con parámetros que empiezan por <code>_</code>), esa dirección se puede abrir directamente y, según su propia documentación, <strong>si alguien la enlaza puede acabar indexada</strong>. Si no quieres eso, hay que añadir noindex. Y la descripción de annasta anuncia que puede actualizar la URL del navegador y convertir los parámetros en enlaces permanentes, así que esas opciones conviene mirarlas con la prueba en la mano.</li>
<li><strong>El trabajo pasa de los robots a las personas</strong>: cada cambio en el filtro es una petición al servidor. Con mucho tráfico, conviene medirlo.</li>
</ul>
<p>Sea cual sea el plugin que elijas repite la prueba de la barra de direcciones y del código fuente. Lo que abre la trampa son los enlaces con parámetros que un robot puede seguir, y si el filtro nuevo los deja en el código volverías a tener el problema, aunque los parámetros se llamen de otra forma y tus reglas, que buscan <code>filter_</code>, no los pararían.</p>
<p>Si el plugin nuevo trabaja con los mismos parámetros <code>filter_</code>, tus propias reglas bloquearán a tus clientes, y conviene probarlo con ellas activas antes de dar el trabajo por terminado.</p>
<p><strong>Cuando lo tengas funcionando retira el filtro nativo</strong> (el widget o el bloque) para que desaparezcan los enlaces. <strong>Las reglas se quedan</strong>, porque los robots ya conocen esas direcciones y es probable que sigan pidiéndolas durante un tiempo.</p>
<h3>Cómo decidir entre una salida y otra</h3>
<p>Para decidir te traslado tres preguntas.</p>
<ol>
<li><strong>¿Alguien usa el filtro?</strong>: si casi nadie lo toca quítalo del todo y te ahorras todo el problema.</li>
<li><strong>¿Cuántos valores tienen tus atributos?</strong>: con decenas el problema se dispara, y con tres o cuatro es manejable.</li>
<li><strong>¿Quién va a cuidar el plugin?</strong>: un filtro de pago pide actualizaciones y pruebas, y si no tienes quien las haga, quitar es más sensato que instalar.</li>
</ol>
<p>Cuando me he encontrado esto en un cliente, lo primero que hago es analizar el tráfico y los registros, y con esos datos diagnostico el problema con la ayuda de mi equipo y el refuerzo de la IA, en mi caso con Claude Code, y siempre doy con una solución, pero cambia según el sitio.</p>
<p>La decisión depende de lo que digan los datos y el resultado del análisis del problema, pues cada tienda es un mundo.</p>
<h2>¿Por dónde empezar?</h2>
<ol>
<li>Marca una opción de tu filtro, mira la barra de direcciones y el código fuente de la página. Si ves enlaces con <code>filter_</code>, esto va contigo.</li>
<li>Si no tienes claro cuánto te está pasando, deja el contador unas horas y apunta la cifra.</li>
<li>Si tu web está en Cloudflare, crea la regla de bloqueo. Es una regla corta y tu hosting ni se entera.</li>
<li>Añade la regla del <code>.htaccess</code> (con copia previa) o, si no puedes tocar ese archivo, instala el plugin de bloqueo, que además para las variantes retorcidas.</li>
<li>Mira en Google Search Console si hay direcciones con filtro indexadas y decide qué haces con el <code>Disallow</code> del <code>robots.txt</code>.</li>
<li>Con los datos delante, decide qué haces con el filtro: quitarlo, pasar a uno AJAX o dejarlo con el límite de la tercera capa. Si cambias, repite con el nuevo la prueba del código fuente y comprueba que no choca con tus reglas.</li>
</ol>
<p>Para seguir con la defensa de tu web, tienes mi guía sobre <a href="https://ayudawp.com/ataques-ddos-wordpress/" target="_blank" rel="ugc noopener">ataques DDoS en WordPress</a> y, si te interesa un problema parecido, el artículo sobre <a href="https://ayudawp.com/evitar-rastreo-anadir-al-carrito-woocommerce/" target="_blank" rel="ugc noopener">evitar el rastreo de «Añadir al carrito»</a>, en cierto modo relacionado.</p>
<p>Si tienes dudas con alguna de las capas, o quieres contarme qué ves tú en tu tienda, me tienes ahí abajo, en la sección de comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/trampa-rastreo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Así es cómo reviso la seguridad de mis plugins, por qué cambié el proceso, y de regalo unas skills para tu IA favorita con el procedimiento</title>
		<link>https://ayudawp.com/skill-revisar-seguridad-plugins/</link>
					<comments>https://ayudawp.com/skill-revisar-seguridad-plugins/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 19 Oct 2026 06:28:56 +0000</pubDate>
				<category><![CDATA[IA + WordPress]]></category>
		<category><![CDATA[Programación + WordPress]]></category>
		<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[CVE]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[skill]]></category>
		<category><![CDATA[Vigilante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160535</guid>

					<description><![CDATA[Me avisaron de una vulnerabilidad publicada con CVE de uno de mis plugins, y aquí te cuento qué pasó, cómo cambió mi forma de revisar el código antes de cada versión y cómo puedes usar ese procedimiento, hecho skill, aunque no seas experto en seguridad.]]></description>
										<content:encoded><![CDATA[<p>Hace ya tiempo se detectó una vulnerabilidad en Vigilante, mi plugin de seguridad, ahí es nada, y desde entonces <strong>he cambiado por completo la forma en que reviso cualquier plugin antes de publicar una actualización</strong>.</p>
<p>He convertido en skills públicas el procedimiento que surgió de ahí, y antes de enseñártelas quiero contarte de dónde vienen.</p>
<p>Porque una skill no enseña nada por sí sola, eso para empezar,  es simplemente el formato que he elegido para pasarte lo que aprendí a las malas, de manera que puedas aprovecharlo, incluso aunque no sepas demasiado de seguridad, con una IA que te haga de ayudante.</p>
<p><strong>Lo que vale es lo aprendido, creo, y de eso va este artículo</strong>.</p>
<h2>Qué pasó con el plugin … de seguridad</h2>
<p>El 11 de septiembre de 2026 se publicó el <a href="https://patchstack.com/database/wordpress/plugin/vigilante/vulnerability/wordpress-vigilant-plugin-2-10-2-cross-site-scripting-xss-vulnerability" target="_blank" rel="noopener nofollow">CVE-2026-81754</a>, una vulnerabilidad de tipo XSS almacenado (un código sospechoso que podía quedarse guardado en tu web y ejecutarse cuando alguien abre la página donde se muestra) que afectaba a <a href="https://wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a> hasta la versión 2.10.2, y qué corregí en la 2.10.3 (en menos de una hora, eso sí).</p>
<p>Te cuento qué pasaba procurando usar los mínimos tecnicismos posibles…</p>
<p>El registro de actividad de Vigilante guarda el <code>User-Agent</code> de cada visita, que es el texto con el que un navegador o un robot se presenta al entrar en tu web. Lo escribe quien visita, así que puede poner lo que quiera, y cuando el administrador abría el registro, una función de JavaScript preparaba ese texto para mostrarlo y lo hacía a medias, porque codificaba los símbolos <code>&lt;</code> y <code>&gt;</code> pero dejaba pasar las comillas.</p>
<p>Con un <code>User-Agent</code> bien elegido cualquiera sin cuenta en la web podía salirse del atributo HTML donde se pintaba el texto y ejecutar código en el navegador del administrador.</p>
<p>Hay matices, y conviene decirlos, porque <strong>la puntuación CVSS es de 7.2, hace falta que un administrador abra el registro para que ocurra algo</strong>, y cuando se publicó la ficha la valoración de CISA indicaba que <strong>no se conocía ninguna explotación</strong>. Nada de eso le quita importancia, pero contarlo sin esos datos sería contarlo mal, e incluso injusto.</p>
<p>Lo encontró y me lo comunicó Sebastian Albrecht, y se lo agradezco. Que le pase esto a un plugin de seguridad escuece el doble, pero prefiero contarlo yo con todos los datos antes de que lo cuente otro con la mitad.</p>
<h2>Lo que de verdad me dio que pensar</h2>
<p>Lo que más me inquietó no fue el fallo en sí. La función que escapaba mal venía de las primeras versiones del plugin, de esas que nadie toca porque funcionan, y todas las versiones posteriores habían pasado por mi revisión.</p>
<p>Mi revisión de entonces se fijaba sobre todo en lo que cambiaba de una versión a otra. Si tocaba algo, lo repasaba, y lo que quedaba sin tocar lo daba por bueno, y además, el fallo era en el JavaScript, donde mis comprobaciones miraban poco, y mal, porque <strong>una revisión que solo mira lo que cambia no ve lo que ya estaba mal, y este fue mi mayor aprendizaje</strong>.</p>
<h2>Revisarlo todo y cerrar cada puerta</h2>
<p>Con la versión 2.10.3 quedó cerrado el CVE, como te he comentado, pero me quedé con una idea ahí clavada a fuego, y es que <strong>si había una puerta abierta que nadie había mirado, podía haber más</strong>.</p>
<p>Así que me puse a <strong>revisar el plugin entero, sin fijarme en qué había cambiado, y a cerrar cada posible puerta</strong> que encontraba, hasta la última versión antes de la 3.0.0. Fueron muchas versiones y no te las voy a contar una a una, pero algunos hallazgos te enseñan lo que pasa cuando por fin miras todo:</p>
<ul>
<li><strong>La identificación en dos pasos, el 2FA</strong>, tenía un camino para saltárselo, que cerré en la 2.10.3 junto al CVE. Más tarde, una revisión cruzada encontró otro, porque el código se pedía en el formulario de acceso de WordPress pero no en otros formularios de inicio de sesión, como los de WooCommerce, y lo cerré en la 2.11.0. En ambos casos hacía falta conocer la contraseña de la cuenta, pero una doble verificación que se puede esquivar, por raro que sea el caso, no cumple su función, no al menos en mis estándares.</li>
<li><strong>El bloqueo de intentos de accesos</strong> falló en sitios que no usaban la hora UTC durante 73 versiones, de la 1.0.0 a la 2.10.5, porque la tabla de intentos mezclaba la hora del sitio con la UTC. Se corrigió en la 2.11.0.</li>
<li><strong>Al guardar copias de <code>wp-config.php</code> y <code>.htaccess</code> en la base de datos para comparar cambios</strong>, acababa ahí información sensible como la contraseña de la base de datos y las claves de seguridad (desde la 2.7.0). Lo fui limpiando entre la 2.11.2 y la 2.11.9, y en las preguntas frecuentes del plugin explico que, si alguien pudo leer tu base de datos o sus copias, conviene regenerar esas claves y cambiar la contraseña.</li>
<li><strong>La IP del visitante</strong> se leía de la cabecera <code>X-Forwarded-For</code> por el lado equivocado, también desde la 2.7.0. Cada proxy va añadiendo su dato a esa cabecera, pero el visitante puede escribir la suya al principio de la lista, de modo que leerla por ese extremo es creerse lo que diga el visitante. Solo afectaba a sitios con esa opción activada y quedó corregido en la 2.11.8.</li>
</ul>
<p>Todo consta con su versión en el <a href="https://wordpress.org/plugins/vigilante/#developers" target="_blank" rel="nofollow noopener">registro de cambios público</a> del plugin, que es lo que más me importa, porque sin ese rastro lo que cuento sería solo mi palabra, y la transparencia es vital. Si tienes un problema y lo solucionas demuestras responsabilidad, si lo ocultas no esperes que nadie se fíe de ti y tus productos.</p>
<p>No todo lo encontré yo. Albert Calzada, un usuario muy activo del plugin, se dedicó a revisar las diferencias entre versiones, artprojectgroup leyó el código de la 2.11.11 y dio con problemas en el 2FA que corregí en la 2.11.12, y Antonio Cambronero, freelancesgroup y pepelopex me avisaron de fallos de funcionamiento por el camino. Todos lo hicieron como se debe hacer, directamente y con educación, sin montar un escándalo y dándome tiempo para arreglarlo. Gracias a todos, de verdad, sois parte de la grandeza del código abierto.</p>
<h2>Lo que aprendí por el camino</h2>
<p>De esa revisión salió un <strong>procedimiento que ahora aplico antes de publicar cualquier versión</strong>. Los pasos concretos están en la skill, aquí te cuento los aprendizajes o ideas sobre los que está basada:</p>
<ul>
<li><strong>Se revisa todo lo que el plugin expone, haya cambiado o no:</strong> Cada punto por donde entran datos de fuera (formularios, cabeceras, campos que viajan por la API REST) se mira en cada versión, aunque nadie haya tocado ese código en años.</li>
<li><strong>No todas las versiones merecen el mismo esfuerzo:</strong> El proceso completo me llevó unas diez horas en una versión corriente, y lo que no se aguanta acaba saltándose. Por eso hay tres niveles de profundidad, según sea un cambio ordinario, uno sensible o un plugin de seguridad con una vulnerabilidad publicada.</li>
<li><strong>Quien revisa no puede ser quien escribió el cambio:</strong> Una revisión cruzada y a ciegas, hecha por otra persona o por otra IA que no haya visto cómo se hizo, encuentra lo que el autor ya no ve. Para la 3.0.0 hice diez rondas solo sobre la autoprotección del plugin, y dos más sobre la parte visible, que conté en el artículo sobre <a href="https://ayudawp.com/vigilante-3/" target="_blank" rel="ugc noopener">Vigilante 3</a>.</li>
<li><strong>Una comprobación nunca debe decir «no hay nada» cuando la verdad es «no he podido mirar»:</strong> Por eso cada herramienta y cada nota de versión lleva escrito, además de lo que encontró, lo que no ha visto, y la nota incluye cifras de cuántas comprobaciones se hicieron. En mi opinión es la regla más valiosa de todas.</li>
<li><strong>Se mide el efecto, no que el código esté escrito:</strong> Haber añadido una corrección no prueba nada. Hay que reproducir el fallo contra la versión anterior y comprobar que con la nueva ya no ocurre, y así reproduje el segundo atajo del 2FA contra la 2.10.5 antes de darlo por cerrado.</li>
</ul>
<p>La parte mecánica de las comprobaciones la he dejado en tres scripts. Uno busca funciones de JavaScript que escapan texto sin codificar las comillas, o sea, justo el fallo del CVE. Otro lista los avisos de seguridad del analizador de código que alguien ha silenciado sin explicar por qué, y el tercero detecta llamadas a métodos que no existen cuando copias código de un plugin a otro. Llevan un <em>autotest</em> de siete casos y cada uno tiene escrita la lista de lo que no ve.</p>
<p>Todo esto cobra más sentido con la <a href="https://developer.wordpress.org/plugins/wordpress-org/automated-security-review/" target="_blank" rel="nofollow noopener">revisión automática de seguridad</a> que WordPress.org aplica desde junio de 2026, donde cada versión pasa por un periodo de espera mientras la analizan varios modelos de IA junto con Jetpack Scan, y si la puntuación de riesgo sale alta, la versión se bloquea y los sitios siguen recibiendo la anterior.</p>
<p>Que una revisión con Plugin Check te salga sin errores ni avisos tristemente actualmente sirve de bien poco, te cuenta cosas, te informa de límites de procedimiento y cosa básicas de seguridad, pero no es un pentest ni de lejos.</p>
<h2>El proceso completo, de un vistazo</h2>
<p>Todo lo anterior cabe en un mapa. Es el recorrido de una versión de mi plugin, desde que decido cuánta revisión le toca hasta que llega a los sitios, con las tres puertas que pueden pararla por el camino.</p>
<p><a href="https://ayudawp.com/?attachment_id=160566" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160566 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/mapa-proceso-revision-plugin-wordpress-1200x1122.jpg" alt="" width="1200" height="1122" srcset="https://ayudawp.com/wp-content/uploads/2026/10/mapa-proceso-revision-plugin-wordpress-1200x1122.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/mapa-proceso-revision-plugin-wordpress-768x718.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/mapa-proceso-revision-plugin-wordpress-1536x1436.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/mapa-proceso-revision-plugin-wordpress.jpg 1604w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>En el mapa salen unas palabras que no he usado hasta ahora y que resumen bien cómo pienso la revisión:</p>
<ul>
<li><strong>Puerta:</strong> Es un punto del recorrido donde, si algo falla, la versión no sigue, y hay tres:
<ol>
<li>Una comprobación mecánica que da error o una cifra que no cuadra.</li>
<li>Un hallazgo de gravedad media o superior en el análisis o en la revisión cruzada.</li>
<li>Un riesgo alto en la revisión automática de WordPress.org. No hay posibilidad de «ya lo arreglo luego».</li>
</ol>
</li>
<li><strong>Canario:</strong> Es un caso de prueba cuyo resultado conoces de antemano. Cuando un comando que busca algo en el código te dice «cero coincidencias», no sabes si no hay nada o si el comando no ve nada. Por eso lo ejecuto antes sobre un archivo hecho a propósito, con líneas que sí deben saltar, y solo me fío del cero si ahí encuentra lo que debe. Lo llamo canario porque es lo primero que avisa de que algo va mal, por lo de los pajaritos que se llevaban a la mina, por si no conocías la referencia.</li>
</ul>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160568 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/canario-cero-comprobacion-plugin-wordpress.jpg" alt="" width="1056" height="656" srcset="https://ayudawp.com/wp-content/uploads/2026/10/canario-cero-comprobacion-plugin-wordpress.jpg 1056w, https://ayudawp.com/wp-content/uploads/2026/10/canario-cero-comprobacion-plugin-wordpress-768x477.jpg 768w" sizes="auto, (max-width: 1056px) 100vw, 1056px"></p>
<p>También te cuento acerca de otra terminología que uso para el procedimiento, para que comprendas mejor como funciona mi cabeza (spoiler: raro):</p>
<ul>
<li><strong>Arnés:</strong> Es el conjunto de pruebas permanentes del plugin, y <strong>a cada prueba suelta la llamo celda</strong>. Crece con cada hallazgo, se ejecuta entero en cada versión y no lleva número de versión, porque no es de ninguna en concreto. Cuando se publica una vulnerabilidad, su prueba de concepto, que es el código que reproduce el fallo, entra en el arnés ese mismo día: falla contra la versión vulnerable y pasa contra la actual. No va dentro del zip del plugin, es mi herramienta de trabajo y no algo que instales en tu web.</li>
<li><strong>Mutante:</strong> Cada vez que arreglo un hallazgo grave añado una celda para que no vuelva. Y para saber si esa celda sirve de algo vuelvo a meter el fallo a propósito, eso es el mutante, y compruebo que la celda falla. Si con el fallo puesto sigue pasando, no protege nada. Para la 3.0.0 de Vigilante inyecté 71 mutantes y las pruebas cazaron todos menos uno, que no cambiaba el comportamiento del plugin y dejé anotado como tal.</li>
</ul>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160567 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/celda-mutante-arnes-pruebas-plugin-wordpress.jpg" alt="" width="1096" height="936" srcset="https://ayudawp.com/wp-content/uploads/2026/10/celda-mutante-arnes-pruebas-plugin-wordpress.jpg 1096w, https://ayudawp.com/wp-content/uploads/2026/10/celda-mutante-arnes-pruebas-plugin-wordpress-768x656.jpg 768w" sizes="auto, (max-width: 1096px) 100vw, 1096px"></p>
<p>Lo que ves en el mapa es el procedimiento que viene en la skill de seguridad. No hace falta pasar por todo en cada versión, para eso están los tres niveles, pero así sabes qué hay detrás de cada paso cuando se lo pidas a tu asistente.</p>
<h2>Qué es una skill y por qué las comparto</h2>
<p>Si no te suena el término, <strong>una skill es una carpeta con instrucciones, y a veces con documentos de referencia y scripts, que le das a tu asistente de IA para que trabaje con un método</strong> concreto en lugar de tirar solo de lo que recuerda. Piensa en la nota que dejas en la nevera para quien se queda en tu casa, no le enseña a sobrevivir, solo le dice cómo haces tú las cosas.</p>
<p>Todo este tipo de procesos los expliqué con más calma, y cómo cargarlas en cada IA, en el artículo sobre <a href="https://ayudawp.com/vibe-coding-plugin-wordpress/" target="_blank" rel="ugc noopener">vibe coding de plugins para WordPress</a>.</p>
<p>Esto eran procedimientos internos, notas mías para no volver a chocar con la misma piedra, y lo normal habría sido quedármelos para mis plugins, pero llevo más de veinte años haciendo webs, buena parte de lo que sé lo aprendí de gente que compartió lo suyo, y la filosofía Open Source va de eso, así que <strong>he empaquetado mi procedimiento actual como skills para que lo aproveche quien quiera</strong>.</p>
<h2>Dónde están las skills, qué incluyen y qué no</h2>
<p>Las dos que salen de esta historia las tienes disponibles en el <a href="https://github.com/fernandotellado/ai-skills" target="_blank" rel="nofollow noopener"><strong>repositorio de skills para IA que tengo en GitHub</strong></a>, junto a otras que ya tenía, como la de rendimiento o las de humanizar textos.</p>
<ul>
<li><code>wp-plugin-security</code>, en su versión 1.3, trae la skill principal, cuatro documentos de referencia, los tres scripts y la puerta de seguridad previa a cada versión, con sus tres niveles, los comandos que hay que ejecutar y la plantilla de la nota de versión. Recoge también cosas como usar los datos que elige quien hace la petición (el User-Agent, las cabeceras de proxy, la IP) solo para registrar y nunca para decidir, o lo que borra en silencio <code>sanitize_text_field()</code> de una URL con caracteres codificados, algo que dejó al cortafuegos de Vigilante analizando una copia distinta de la petición hasta la 2.9.9.</li>
<li><code>wp-plugin-development</code> unifica lo que la documentación no cuenta sobre desarrollar y publicar plugins, como la receta para que los textos por defecto traducibles no se guarden en la base de datos y se queden congelados en un idioma.</li>
</ul>
<p>De todos modos, a riesgo de ser pesado, insisto en que <strong>una skill no garantiza un plugin seguro ni sustituye a una auditoría.</strong> Las puertas de revisión cazan regresiones, es decir, que rompas lo que ya funcionaba, pero no te dicen si el diseño original era bueno. Los scripts no lo detectan todo, y el ejemplo de la doble verificación de la skill de seguridad es un boceto con la lista de lo que le falta, no una implementación completa.</p>
<p>Si descargaste la skill de seguridad antes de esta actualización bájala de nuevo, pues corregí en esta versión (1.3) un ejemplo con lo del 2FA que daba por bueno un atajo que se saltaba el código en los formularios de acceso distintos de <code>wp-login.php</code>.</p>
<h2>Cómo obtener las skills y usarlas</h2>
<p>El <code>README</code> del repositorio está en inglés, así que te resumo lo que necesitas.</p>
<ol>
<li>Entra en el repositorio, pulsa el botón «<strong>Code</strong>», elige «<strong>Download ZIP</strong>» y descomprímelo. Cada skill es una carpeta (<code>wp-plugin-security</code>, <code>wp-plugin-development</code> y así), y te quedas con las que quieras.</li>
<li><strong>Carga la skill en tu asistente de IA</strong>: En Claude con proyectos, añade los archivos de la skill al conocimiento del proyecto. En Claude Code copia la carpeta entera a <code>~/.claude/skills/</code>. En ChatGPT, crea un GPT personalizado y sube los archivos a su base de conocimiento. En cualquier otro asistente, usa su apartado de archivos o conocimiento, o las instrucciones personalizadas.</li>
<li><strong>Sube siempre la carpeta completa</strong>, no solo <code>SKILL.md</code>, porque ese archivo remite a los de <code>references</code> y <code>scripts</code>, y sin ellos la skill queda coja.</li>
<li>Los scripts necesitan Node.js, PHP en línea de comandos con la extensión mbstring y Python 3. Los ejecutas tú, o tu asistente si trabaja con acceso a una terminal.</li>
<li>Para actualizarlas, dale al icono del ojo (watch) para que te avise cuando suba cambios, vuelve a descargar el repositorio y sustituye los archivos.</li>
</ol>
<p>Con la skill ya cargada, pídele a tu asistente de IA que aplique la puerta de seguridad antes de publicar una versión, dile qué nivel crees que toca y que te entregue la nota de versión con lo que ha comprobado y lo que no ha podido mirar. Si es la primera vez que lo haces empieza por el nivel más bajo en tu próxima versión y sube solo si el cambio lo pide. Y lee esa nota con ojo crítico, porque <strong>la IA también se equivoca y ninguna skill cambia eso</strong>.</p>
<h2>Para terminar</h2>
<p>Si tienes Vigilante instalado, comprueba que estás en una versión actual, sino valiente apaño he hecho ¿no?</p>
<p>Y luego, bueno, si quieres me cuentas en los comentarios si has vivido algo parecido con tus propios plugins o temas, o si ves algún hueco en este procedimiento. Estaré encantado de comentarlo contigo, que de eso también se aprende.</p>
<p>A mí me tocó aprenderlo a las malas, y lo mínimo es que a ti te salga más barato, y para ello espero que las skills te ayuden.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/skill-revisar-seguridad-plugins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Las estadísticas de WordPress.org no sirven para nada, así que me hice las mías (y gratis) #DoctorWordPress</title>
		<link>https://ayudawp.com/las-estadisticas-de-wordpress-org-no-sirven-para-nada-asi-que-me-hice-las-mias-y-gratis-doctorwordpress/</link>
					<comments>https://ayudawp.com/las-estadisticas-de-wordpress-org-no-sirven-para-nada-asi-que-me-hice-las-mias-y-gratis-doctorwordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Fri, 16 Oct 2026 17:23:18 +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=160722</guid>

					<description><![CDATA[¿Qué significa «más de 10 instalaciones»? Nada. Así veo gratis descargas, tendencias y posiciones en búsquedas de mis plugins con Contributor Résumé.]]></description>
										<content:encoded><![CDATA[<p>Esta semana solo ha habido un directo, porque el lunes fue 12 de octubre, festivo nacional, y <strong>las Crónicas WordPress también se toman fiesta cuando toca</strong> (que tengo una vida aunque no lo creas).</p>
<p>Así que el resumen de hoy es todo del <strong>#DoctorWordPress</strong> del miércoles, donde me puse a contar algo que me tenía un poco mosqueado desde hace tiempo: las estadísticas de los plugins en WordPress.org.</p>
<p>Te cuento lo que vimos y, al final, tienes el vídeo completo.</p>
<h2>Doctor WordPress: estadísticas de plugins que sí te dicen algo</h2>
<h3>Antes de nada, semana gallega</h3>
<p>Arranqué el directo con la agenda, porque esta semana me tocaba Galicia. El jueves 15 di una charla sobre <strong>seguridad en WordPress</strong> en la meetup de WordPress Coruña, en Sngular, y entre el 16 y el 18 de octubre se celebra <a href="https://central.wordcamp.org/wordcamps/wordcamp-galicia-2026/">WordCamp Galicia 2026</a> en Coruña, la que muchos llamamos «PulpoCamp» por razones obvias.</p>
<p>Además, el viernes por la mañana he imparatido allí un <strong>taller de iniciación a WordPress</strong> de dos horas y media (dos de taller y media de preguntas), con entrada gratuita y plazas limitadas por espacio. Hubo más de 80 alumnos, sala llena, y hasta lo pasamos bien.</p>
<h3>Contributor Résumé, o cómo presumir de tus contribuciones</h3>
<p>Lo primero que enseñé fue mi perfil en WordPress.org, ese que se genera solo en cuanto participas en algo: soporte en los foros, traducciones en Polyglots, plugins, contribuciones al core, eventos… En mi caso salen, por ejemplo, más de 4.000 cadenas revisadas en traducciones y 23 plugins publicados.</p>
<p>Para mostrar todo eso en tu web hice hace tiempo <a href="https://wordpress.org/plugins/contributor-resume/">Contributor Résumé</a>, un plugin que, ya te lo digo, <strong>no va a ser un superventas, es más bien una cosa para amiguetes</strong>. Lo que hace es coger ese perfil de WordPress.org y pintarlo en una página de tu web, con bloque o shortcode, y lo puedes personalizar a tu gusto:</p>
<ul>
<li>Varios estilos: clásico, moderno y uno monoespaciado con colorines para los más programadores.</li>
<li>Eliges qué secciones se muestran y en qué orden.</li>
<li>Puedes añadir los eventos en los que participas, la actividad reciente y hasta tu perfil de GitHub.</li>
<li>Vista previa antes de crear la página.</li>
</ul>
<p>¿Por qué molestarse? Pues porque, en mi opinión, <strong>el mejor currículum que puedes tener en WordPress son tus contribuciones a WordPress</strong>, y tenerlo a la vista en tu web personal tiene su miga.</p>
<h3>El problema: «más de 10 instalaciones» no significa nada</h3>
<p>Ahora bien, lo interesante del directo vino después. Si alguna vez has publicado un plugin en WordPress.org te habrás quedado mirando las estadísticas como un bobo, porque lo que te da el directorio es una cifra de instalaciones activas de hoy y redondeada a la baja. <strong>¿Qué quiere decir «más de 10»? ¿11? ¿87? Pues no se sabe.</strong></p>
<p>La vista avanzada de cualquier plugin (la puede ver cualquiera, no solo el autor) te enseña las instalaciones por versión y la evolución de descargas, y poco más. No sabes si tus instalaciones suben o bajan ni desde cuándo, ni en qué posición sales cuando alguien busca «formulario de contacto», ni cuánta gente desinstala tu plugin. Antes había bastante más información, pero se quitó, y aunque se ha pedido varias veces que vuelva, ahí sigue.</p>
<p>Consecuencia: <strong>han salido un montón de servicios que cogen los datos de la API pública, que es gratis, y te los cobran por suscripción</strong>. Lo conté con detalle, con todos los precios, en el artículo sobre <a href="https://ayudawp.com/estadisticas-plugins-wordpress-org/">estadísticas de plugins y temas de WordPress.org</a>.</p>
<h3>Mi solución: lo mismo, pero gratis</h3>
<p>Y como tengo esa manía, pensé: ¿para qué va a pagar la gente por algo que se está dando gratis? En vez de crear otro plugin, aproveché Contributor Résumé, que lo van a instalar sobre todo desarrolladores que contribuyen, y le añadí una pestaña de estadísticas de tus plugins y temas. Esto es lo que enseñé:</p>
<ul>
<li>Descargas por día de los últimos 7, 30 y 90 días, 12 meses y hasta 2 años.</li>
<li>Histórico de instalaciones activas, con una única limitación: empieza a contar desde el día en que activas el plugin, así que cuanto antes, mejor.</li>
<li>Avisos de nueva versión publicada, valoraciones nuevas y hilos de soporte sin contestar.</li>
<li>Tendencias ordenables, para ver qué plugins han subido o bajado más en el periodo que elijas.</li>
<li>Ficha detallada de cada plugin, con adopción por versiones, valoraciones, traducciones y exportación a CSV.</li>
<li>Posiciones en las búsquedas del directorio, tanto para tus etiquetas como para las palabras clave que tú configures.</li>
<li>Correos con resúmenes diarios, semanales o mensuales, y un widget en el escritorio con los que más suben y los que más bajan.</li>
</ul>
<p>Lo de las búsquedas es, para mí, lo más jugoso. Las etiquetas (máximo cinco por plugin) tienen su URL en WordPress.org, pero nadie las usa, <strong>la gente escribe en el buscador, y ahí es donde te tienes que medir</strong>. En el directo vimos, por ejemplo, uno de mis plugins, <a href="https://es.wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="noopener">Visibility</a>, en la posición 61 para «SEO» entre casi 9.000 resultados, después de subir 10 puestos en 90 días, que para un plugin nuevo de SEO no está nada mal.</p>
<p>Y una cosa más: puedes cambiar el usuario y curiosear las estadísticas de cualquier otro autor, porque son datos públicos. Como nadie se animó a darme su slug (cobardes), le tocó a Nilo Vélez, que tiene, entre otras cosas, un tema con más de 10.000 instalaciones activas.</p>
<h3>Lo que vendrá…</h3>
<p>Tengo previsto añadir comparativas con plugins competidores, avisos cuando alguien te adelanta en una búsqueda, una estimación más fina dentro de cada tramo de instalaciones, y bloques y shortcodes para mostrar las estadísticas públicamente. Si veo que se instala, lo iré metiendo poco a poco, y si no, lo meteré para mí, porque <strong>yo los plugins los hago primero para mí y luego para todos</strong>. Así de egoísta soy, y precisamente por eso los mantengo actualizados.</p>
<p>Si tienes plugins o temas en WordPress.org, pruébalo y me cuentas qué echas en falta, que <a href="https://wordpress.org/support/plugin/contributor-resume/">en el foro de soporte del plugin</a> o ahí abajo, en los comentarios, me tienes.</p>
<h2>Vídeo completo del #DoctorWordPress del 14 de octubre</h2>
<p>Aquí tienes el directo entero, con la demo del plugin paso a paso:</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="Estadísticas de uso, instalaciones y plugins de WordPress ¿hay algún modo de verlas?" width="1600" height="900" src="https://www.youtube.com/embed/0X-DZR_Y290?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>
<p><a href="https://www.youtube.com/watch?v=0X-DZR_Y290">Ver el #DoctorWordPress del 14 de octubre de 2026 en YouTube</a></p>
<p>El lunes volvemos con las <strong>Crónicas WordPress</strong>, que hay noticias jugositas. Si no quieres perdértelas, <a href="https://www.youtube.com/AyudaWordPressES?sub_confirmation=1">suscríbete al canal de Ayuda WordPress en YouTube</a> y nos vemos en directo.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/las-estadisticas-de-wordpress-org-no-sirven-para-nada-asi-que-me-hice-las-mias-y-gratis-doctorwordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>nosnippet, data-nosnippet y el ajuste de IA de Google ¿en serio no quieres parte de tu contenido en las búsquedas y menciones?</title>
		<link>https://ayudawp.com/nosnippet-data-nosnippet-ia-google/</link>
					<comments>https://ayudawp.com/nosnippet-data-nosnippet-ia-google/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 15 Oct 2026 06:28:15 +0000</pubDate>
				<category><![CDATA[SEO / AEO / GEO / AIO]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160500</guid>

					<description><![CDATA[Tres controles para limitar lo que usa la IA de Google de tu web: el ajuste de Search Console, nosnippet y data-nosnippet. Qué cubre y qué cuesta cada uno.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Google te da <strong>tres formas de limitar lo que usa de tu web en las vistas creadas con IA</strong> (lo que en inglés llaman AI Overviews) y en el modo IA, y <strong>cada una cubre una parte distinta y te cuesta algo distinto</strong>.</p>



<p class="wp-block-paragraph">El ajuste de Search Console te saca de todas esas funciones a la vez, la etiqueta <code>nosnippet</code> deja una página entera sin fragmento en ningún sitio, y el atributo <code>data-nosnippet</code> tapa solo el trozo de texto que marques, aunque la ficha que lo explica solo habla de fragmentos.</p>



<p class="wp-block-paragraph">Si quieres mi opinión, yo <strong>solo excluiría textos que tengo clarísimo que no quiero ver resumidos</strong>, y todo lo demás lo dejaría como está. Lo que sigue sale de la documentación de Google, revisada en octubre de 2026 (esto cambia rápido), y cuando algo es lectura mía te lo aviso. ¿Te lo piensas mientras te lo cuento?…</p>



<h2 class="wp-block-heading">Los tres controles de un vistazo</h2>



<p class="wp-block-paragraph">Piensa en el folleto de una inmobiliaria… El ajuste de Search Console es pedir que tu piso no salga en el folleto nuevo, el de las respuestas con IA, aunque siga en el de siempre. <code>nosnippet</code> es dejar tu piso en todos los folletos sin descripción, y de paso fuera del nuevo. Luego está <code>data-nosnippet</code>, que es pegar un post-it sobre un párrafo concreto de la descripción.</p>



<p class="wp-block-paragraph">En una tabla se ve mejor.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Control</th><th>Qué cubre</th><th>¿Quita el fragmento de los resultados de búsqueda?</th><th>¿Te saca de las respuestas con IA?</th></tr></thead><tbody><tr><td>Ajuste de Search Console</td><td>Toda la propiedad (y según Google, una propiedad hija, como una carpeta)</td><td>No, solo afecta a las funciones de IA</td><td>Sí, de las vistas creadas con IA, el modo IA y las funciones generativas de Discover</td></tr><tr><td><code>nosnippet</code></td><td>Una página</td><td>Sí, y también la vista previa de vídeo</td><td>Sí, Google dice que impide usar el contenido como entrada directa de las dos funciones</td></tr><tr><td><code>data-nosnippet</code></td><td>Un trozo de texto dentro de la página</td><td>Solo ese trozo</td><td>Google lo cita entre los controles, pero su ficha solo habla de fragmentos</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Hay un cuarto, <code>max-snippet</code>, que fija cuántos caracteres puede enseñar Google (con valor 0 es lo mismo que <code>nosnippet</code>). Es un ajuste muy fino y no le voy a dedicar una sección , al menos no hoy.</p>



<h2 class="wp-block-heading">El ajuste de Search Console, el de toda la web</h2>



<p class="wp-block-paragraph">Está en Search Console, en «<strong>Ajustes &gt; IA generativa en la búsqueda</strong>», y según la <a href="https://support.google.com/webmasters/answer/16908024?hl=es" target="_blank" rel="nofollow noopener">ayuda de Google</a> lo ha desplegado para todas las webs desde el 31 de agosto de 2026.</p>


<figure class="wp-block-image is-resized"><a href="https://ayudawp.com/?attachment_id=160504" rel="nofollow"><img loading="lazy" decoding="async" width="1200" height="675" src="https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-Google-search-console-1200x675.jpg" alt="" class="wp-image-160504" style="aspect-ratio:1.7777777777777777;width:1200px;height:auto" srcset="https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-Google-search-console-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-Google-search-console-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-Google-search-console-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-Google-search-console.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Tiene tres opciones:</p>



<ol class="wp-block-list">
<li>Heredar el valor de la propiedad superior, por defecto si tu propiedad tiene alguna.</li>



<li>Incluir tu web</li>



<li>Excluirla</li>
</ol>



<p class="wp-block-paragraph">Si excluyes tu web dejan de salir enlaces y contenido tuyos en las vistas creadas con IA, en el modo IA y en las funciones generativas de Google Discover, y Google te avisa de que no recibirás tráfico ni impresiones de ellas.</p>



<p class="wp-block-paragraph">Lo que rastree de tu sitio tampoco podrá usarse como base de esas respuestas. El contenido de otras webs seguirá apareciendo, y puede que se parezca al tuyo (o sea, que la IA seguirá contestando, solo que sin ti).</p>



<p class="wp-block-paragraph">Antes de pulsar nada conviene tener claras cuatro cosas:</p>



<ul class="wp-block-list">
<li><strong>No es una señal de posicionamiento:</strong> Google dice que este ajuste no se usa como señal de posicionamiento ni de inclusión para otras partes de la Búsqueda, así que tus páginas siguen en los resultados de siempre.</li>



<li><strong>El entrenamiento de los modelos queda fuera:</strong> este ajuste no lo toca, y para limitarlo Google remite a <code>Google-Extended</code>, que es otro control distinto. Sobre bloquear a los bots de IA tengo <a href="https://ayudawp.com/bloquear-bots-ia/" target="_blank" rel="ugc noopener">otro artículo</a> si quieres seguir por ahí.</li>



<li><strong>Salir de Google por completo es otra cosa:</strong> para eso lo que hay es <a href="https://ayudawp.com/tag/noindex/" target="_blank" rel="noopener"><code>noindex</code></a>.</li>



<li><strong>No es inmediato:</strong> según Google el contenido queda excluido en uno o dos días desde que se aplica el cambio, aunque parte puede tardar más.</li>
</ul>



<p class="wp-block-paragraph">¿Es todo o nada? No del todo, aunque esto lo digo con la boca pequeña. Según la ayuda de Google, cada propiedad de Search Console tiene su propio ajuste, y el dueño de una propiedad hija (el ejemplo que ponen es una carpeta añadida como prefijo de URL, del estilo <code>https://dominio.com/empresa/gatos</code>) puede elegir un valor distinto para esa propiedad y sus sub-páginas.</p>



<p class="wp-block-paragraph">O sea, que en teoría podrías sacar de estas funciones solo una carpeta y dejar el resto de la web como está. Por lo que he visto en mi Search Console también valdría para subdominios, pero no lo he probado, si te animas nos cuentas.</p>



<p class="wp-block-paragraph">Google ha lanzado además un <a href="https://support.google.com/webmasters/answer/16984139?hl=es" target="_blank" rel="nofollow noopener">informe de rendimiento de IA generativa</a>, con las impresiones de tu web en las Vistas creadas con IA y en el Modo IA por página, país, dispositivo y fecha. Sirve para ver qué páginas aparecen, pero <strong>no decidas solo con él</strong>, porque cuenta impresiones (las veces que se muestran enlaces a tu web) y no visitas, y es muy reciente. Y si ya has excluido tu web, puede salirte vacío.</p>


<figure class="wp-block-image is-resized"><a href="https://ayudawp.com/?attachment_id=160505" rel="nofollow"><img loading="lazy" decoding="async" width="1200" height="675" src="https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-1200x675.jpg" alt="" class="wp-image-160505" style="aspect-ratio:1.7777777777777777;width:1200px;height:auto" srcset="https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/IA-generativa-en-la-Busqueda.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></figure>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading"><code>nosnippet</code>: excluir una URL completa de las búsquedas e IA</h2>



<p class="wp-block-paragraph">Es una etiqueta <code>meta robots</code> (o una cabecera HTTP <code>X-Robots-Tag</code>) que <strong>le dice a Google que no enseñe ni fragmento de texto ni vista previa de vídeo de esa página</strong>, en ninguna parte de la búsqueda (web, imágenes, Discover, vistas creadas con IA y modo IA).</p>



<p class="wp-block-paragraph">Según la <a href="https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag" target="_blank" rel="nofollow noopener">página de Google sobre la etiqueta meta robots</a>, <strong>también impide que el contenido se use como entrada directa de las vistas creadas con IA y del modo IA</strong>. Una miniatura de imagen estática puede seguir saliendo si Google considera que mejora la experiencia.</p>



<p class="wp-block-paragraph">Hay una segunda parte en esto, y aquí empieza mi lectura, y es que la <a href="https://developers.google.com/search/docs/appearance/ai-features" target="_blank" rel="nofollow noopener">guía de Google sobre las funciones de IA</a> pide, para salir como enlace de apoyo en esas funciones, que la página esté «indexada y apta para mostrarse en la búsqueda de Google con un fragmento» (traducción mía, el original está en inglés).</p>



<p class="wp-block-paragraph">Vamos, que si juntas las dos frases, una página con <code>nosnippet</code> no tiene pinta de poder aparecer como enlace ahí, pero esa conclusión es mía, Google no la escribe tal cual ¿tú qué opinas?</p>



<p class="wp-block-paragraph">El precio se pagaría en los resultados de búsqueda, porque la página sale sin la descripción bajo el título. Cuánto te cueste en visitas no lo sé, y Google tampoco lo dice, porque ni su ficha de robots meta ni la de <a href="https://developers.google.com/search/docs/appearance/snippet" target="_blank" rel="nofollow noopener">fragmentos</a> documentan ningún efecto de <code>nosnippet</code> en la posición ni en los clics.</p>



<p class="wp-block-paragraph"><strong>Mi opinión, y es solo eso, es que una página sin descripción lo tiene más difícil para que hagan clic en ella</strong>, pero no tengo un dato que lo demuestre.</p>



<p class="wp-block-paragraph">Ojo con un detalle que se pasa por alto, y es que Google solo lee estas etiquetas si puede entrar a la página. Si la bloqueas en el <code>robots.txt</code> no llega a ver el <code>nosnippet</code>. De la relación entre <code>robots.txt</code>, el <code>noindex</code> y el mapa del sitio hablo en otro artículo, pero no lo visites, que queda aún el pequeñín, y también el más curioso de todos estos tres controles.</p>



<h2 class="wp-block-heading"><code>data-nosnippet</code>: excluir solo parte de un texto de las búsquedas e IA</h2>



<p class="wp-block-paragraph">Este es un atributo HTML que se pone en la parte de texto que no quieres que Google use como fragmento en las SERP y los resúmenes con IA.</p>



<p class="wp-block-paragraph">Se ve mejor con un ejemplo.</p>



<pre class="wp-block-preformatted">&lt;p&gt;Este texto puede salir en un fragmento
&lt;span data-nosnippet&gt;y esta parte no saldría&lt;/span&gt;.&lt;/p&gt;

&lt;div data-nosnippet&gt;Este bloque entero tampoco.&lt;/div&gt;</pre>



<p class="wp-block-paragraph">Las reglas de Google son estas:</p>



<ul class="wp-block-list">
<li><strong>Solo en tres etiquetas:</strong> <code>span</code>, <code>div</code> y <code>section</code>. Si lo pones en un párrafo (<code>&lt;p data-nosnippet&gt;</code>) o en una etiqueta inventada, Google lo ignora.</li>



<li><strong>Es un atributo booleano:</strong> cualquier valor se ignora, y eso incluye <code>data-nosnippet="false"</code>, que sigue ocultando el trozo. Con que esté el atributo, vale.</li>



<li><strong>El HTML tiene que ser válido y con las etiquetas bien cerradas:</strong> un <code>div</code> sin cerrar hace que cuente todo lo que viene después.</li>



<li><strong>Nada de JavaScript:</strong> Google pide no añadirlo ni quitarlo con JavaScript en elementos que ya existen, porque a veces lee la página antes de renderizarla y a veces después.</li>
</ul>



<p class="wp-block-paragraph">Y luego están los <strong>dos (importantes) matices…</strong></p>



<ol class="wp-block-list">
<li><strong>No es un bloqueo total:</strong> <code>data-nosnippet</code> no es un <code>noindex</code>. La página sigue indexada y el texto sigue ahí para cualquiera que la abra, solo se queda fuera de lo que Google enseña como fragmento. Si ese texto no debería ver nadie, no lo marques, quítalo de la página.</li>



<li><strong style="font-size: 16px;">Lo que dice (y lo que no dice) Google sobre las IA:</strong><span style="font-size: 16px;"> La frase de la «entrada directa» para las vistas creadas con IA y el modo IA aparece en los apartados de </span><code style="font-size: 16px; font-style: inherit; font-weight: inherit;">nosnippet</code><span style="font-size: 16px;"> y de </span><code style="font-size: 16px; font-style: inherit; font-weight: inherit;">max-snippet</code><span style="font-size: 16px;"> de la ficha de robots meta, pero no en el de </span><code style="font-size: 16px; font-style: inherit; font-weight: inherit;">data-nosnippet</code><span style="font-size: 16px;">, que solo habla de fragmentos. Lo que sí hace Google es citarlo, en su guía de las funciones de IA, entre los controles para limitar lo que se muestra de tus páginas en la búsqueda. Lo que me hace deducir que sí sirve para eso, pero </span><strong style="font-size: 16px;">no hay una regla escrita de que un texto marcado quede fuera de las respuestas de IA</strong><span style="font-size: 16px;">.</span></li>
</ol>



<p class="wp-block-paragraph">Un ejemplo de uso razonable lo tienes en el plugin <a href="https://wordpress.org/plugins/ai-share-summarize/" target="_blank" rel="nofollow noopener">de compartir y resumir en IA</a>, que marca con <code>data-nosnippet</code> el bloque del resumen que pone en la página, para que Google no enseñe tu propio resumen en los resultados en lugar de tu artículo. Lo conté en el artículo sobre <a href="https://ayudawp.com/resumenes-ia-integrados/" target="_blank" rel="ugc noopener">los resúmenes con IA integrados en tu web</a>.</p>



<p class="wp-block-paragraph">En WordPress puedes escribir ese HTML a mano, en la pestaña de texto del editor clásico o en un bloque HTML personalizado, y el sistema no lo borra, porque el filtro que limpia el HTML de los usuarios sin permiso de HTML libre (<code>wp_kses_post</code>) deja pasar este atributo en <code>span</code>, <code>div</code> y <code>section</code>. Funciona, pero es incómodo y fácil de romper, y para eso están los plugins y el código de más abajo, si quieres usar este atributo de manera habitual.</p>



<h2 class="wp-block-heading">Qué plugins traen estos controles</h2>



<p class="wp-block-paragraph">La mayoría de los plugins de SEO traen <code>nosnippet</code> por entrada, y casi ninguno ofrece algo para el <code>data-nosnippet</code>:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Plugin</th><th>Excluir publicaciones con <code>nosnippet</code></th><th>Excluir textos con <code>data-nosnippet</code></th></tr></thead><tbody><tr><td><a href="https://wordpress.org/plugins/wordpress-seo/" target="_blank" rel="nofollow noopener">Yoast SEO</a></td><td>Sí, en los ajustes avanzados del editor</td><td>No</td></tr><tr><td><a href="https://wordpress.org/plugins/seo-by-rank-math/" target="_blank" rel="nofollow noopener">Rank Math</a></td><td>Sí, en los ajustes avanzados de robots del editor</td><td>No</td></tr><tr><td><a href="https://wordpress.org/plugins/all-in-one-seo-pack/" target="_blank" rel="nofollow noopener">All in One SEO</a></td><td>Sí, en los ajustes de robots del editor</td><td>No</td></tr><tr><td><a href="https://wordpress.org/plugins/wp-seopress/" target="_blank" rel="nofollow noopener">SEOPress</a></td><td>Sí, en los ajustes del editor, también como ajuste global</td><td>No</td></tr><tr><td><a href="https://wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="nofollow noopener">Visibility</a></td><td>Sí, en los ajustes del editor, también en edición rápida y acciones por lotes de los listados</td><td>Sí, desde la barra de formato del editor</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">El último de la tabla, Visibility, ya sabrás que lo desarrollé yo, y con <code>nosnippet</code> por entrada hace lo mismo que los otros, pero también más cosas:</p>



<ul class="wp-block-list">
<li><strong>Marcar partes de texto:</strong> un interruptor en el panel del bloque Grupo añade <code>data-nosnippet</code> a ese grupo cuando se muestra la página, y para palabras o frases sueltas hay un formato de texto (y botones en el editor clásico) que las envuelve en un <code>span</code>. Solo marca los Grupos que sean <code>div</code> o <code>section</code>, porque Google no lee el atributo en otras etiquetas.</li>



<li><strong>Reglas por tipo de contenido y por taxonomía:</strong> en <strong>Ajustes &gt; Visibility &gt; pestaña Indexado</strong> hay una tabla donde marcas <code>nosnippet</code> para todas las entradas de un tipo de contenido, y una entrada concreta se libra desmarcando su propia casilla. En las taxonomías la regla afecta a la página de archivo (la de la categoría, por ejemplo) pero no a las entradas que contiene.</li>



<li><strong>Edición rápida y acciones masivas:</strong> «Marcar como nosnippet» y «Vaciar nosnippet» desde el listado de entradas, para no abrir una por una.</li>



<li><strong>Textos marcados fuera de las descripciones automáticas:</strong> lo que marcas no se cuela en la meta descripción generada ni en las descripciones de Open Graph y Twitter.</li>



<li><strong>«Respetar nosnippet»:</strong> con esta opción (activada por defecto en las instalaciones nuevas), las páginas con <code>nosnippet</code> tampoco reciben texto de Visibility en llms.txt, llms-full.txt, las versiones en Markdown ni en el FAQPage.</li>
</ul>


<figure class="wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"><figure class="wp-block-image size-medium"><img loading="lazy" decoding="async" width="1200" height="701" data-id="160509" src="https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-clasico-wp-1200x701.jpg" alt="" class="wp-image-160509" srcset="https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-clasico-wp-1200x701.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-clasico-wp-768x448.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-clasico-wp-1536x897.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-clasico-wp.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></figure>


<figure class="wp-block-image size-medium"><img loading="lazy" decoding="async" width="1200" height="590" data-id="160508" src="https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-bloques-wp-1200x590.jpg" alt="" class="wp-image-160508" srcset="https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-bloques-wp-1200x590.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-bloques-wp-768x378.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-bloques-wp-1536x755.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-editor-bloques-wp.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></figure>


<figure class="wp-block-image size-medium"><img loading="lazy" decoding="async" width="1200" height="1005" data-id="160507" src="https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-grupo-editor-bloques-wp-1200x1005.jpg" alt="" class="wp-image-160507" srcset="https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-grupo-editor-bloques-wp-1200x1005.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-grupo-editor-bloques-wp-768x643.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-grupo-editor-bloques-wp-1536x1286.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/data-nosnippet-grupo-editor-bloques-wp.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></figure>
</figure>



<p class="wp-block-paragraph">Dos advertencias, que para eso estamos. De los plugins que he mirado ninguno más trae una función para marcar texto con <code>data-nosnippet</code>, mientras que <code>nosnippet</code> por página lo tienen casi todos, o sea que ahí hay paridad. </p>



<p class="wp-block-paragraph">Y otra cosa, el atributo de los grupos se añade al mostrar la página, así que si algún día desactivas Visibility esos grupos dejan de llevarlo. Las palabras sueltas, que quedan guardadas en el contenido, sí lo conservan.</p>



<h2 class="wp-block-heading">Lo mismo sin plugin, con un poco de código</h2>



<p class="wp-block-paragraph">Si prefieres no instalar nada, se puede hacer a mano, con un código que te recomiendo vaya en un plugin de funcionalidades propio o como <code>mu-plugin</code>, y si dudas de dónde pegarlos lo tienes en el artículo sobre <a href="https://ayudawp.com/pegar-codigos/" target="_blank" rel="ugc noopener">dónde pegar códigos PHP, JS y CSS en WordPress</a>. </p>



<p class="wp-block-paragraph">El primero de estos códigos necesita WordPress 5.7 o superior (cuando llegó el filtro <code>wp_robots</code>), y el segundo 6.2 o superior (el procesador de etiquetas HTML que usa).</p>



<h3 class="wp-block-heading"><code>nosnippet</code> en las páginas que elijas</h3>



<p class="wp-block-paragraph">Este código añade <code>nosnippet</code> a la etiqueta meta robots de las entradas que tengan un campo personalizado concreto, de los tipos de contenido que indiques y de una categoría con sus entradas. Cambia los nombres por los tuyos:</p>



<pre class="wp-block-preformatted">add_filter( 'wp_robots', 'ayudawp_nosnippet_robots' );<br><br>/**<br> * Añade nosnippet a la meta tag robots de las páginas que elijas<br> *<br> * @param array $robots Directivas que WordPress va a generar<br> * @return array<br> */<br>function ayudawp_nosnippet_robots( $robots ) {<br>    $apply =<br>        // Entries with the custom field "ayudawp_nosnippet" set to 1.<br>        ( is_singular() &amp;&amp; '1' === get_post_meta( get_queried_object_id(), 'ayudawp_nosnippet', true ) )<br>        // Todas las entradas de estos tipos de contenido<br>        || is_singular( array( 'curso', 'leccion' ) )<br>        // El archivo de la categoría llamada "premium" y todas sus entradas<br>        || is_category( 'premium' )<br>        || ( is_singular( 'post' ) &amp;&amp; has_category( 'premium', get_queried_object_id() ) );<br><br>    if ( $apply ) {<br>        $robots['nosnippet'] = true;<br>    }<br><br>    return $robots;<br>}</pre>



<p class="wp-block-paragraph">Para usar el campo personalizado (<code>ayudawp_nosnippet</code> con valor <code>1</code>) en una entrada, activa el panel de campos personalizados en las preferencias del editor. </p>



<p class="wp-block-paragraph">Como usa el filtro de WordPress, la directiva se une a la etiqueta <code>meta robots</code> que ya genera tu web. Y si algún plugin imprime la suya aparte, por ejemplo con <code>max-snippet:-1</code>, Google suma las reglas y se queda con la más restrictiva, así que <code>nosnippet</code> gana.</p>



<h3 class="wp-block-heading"><code>data-nosnippet</code> en cualquier bloque</h3>



<p class="wp-block-paragraph">Con este otro cualquier bloque que lleve la clase CSS adicional <code>ayudawp-nosnippet</code> (la escribes en el panel avanzado del bloque) recibe el atributo. Solo lo añade si el bloque empieza con <code>div</code>, <code>span</code> o <code>section</code>, porque en un párrafo suelto Google no lo leería, como te comenté antes.</p>



<pre class="wp-block-preformatted">add_filter( 'render_block', 'ayudawp_block_nosnippet', 10, 2 );<br><br>/**<br> * Añade data-nosnippet a cualquier bloque de texto que tenga la clase CSS ayudawp-nosnippet<br> *<br> * Google lee data-nosnippet solo si está en un span, div y elementos section elements<br> * Un bloque cuya primera tag sea otra (un p por ejemplo) queda fuera<br> *<br> * @param string $block_content Rendered HTML of the block.<br> * @param array  $block         Datos del bloque, incluidos sus atributos<br> * @return string<br> */<br>function ayudawp_block_nosnippet( $block_content, $block ) {<br>    if ( '' === $block_content || empty( $block['attrs']['className'] ) ) {<br>        return $block_content;<br>    }<br><br>    $classes = preg_split( '/\s+/', trim( $block['attrs']['className'] ) );<br>    if ( ! in_array( 'ayudawp-nosnippet', $classes, true ) ) {<br>        return $block_content;<br>    }<br><br>    $processor = new WP_HTML_Tag_Processor( $block_content );<br>    if ( $processor-&gt;next_tag() &amp;&amp; in_array( $processor-&gt;get_tag(), array( 'DIV', 'SPAN', 'SECTION' ), true ) ) {<br>        $processor-&gt;set_attribute( 'data-nosnippet', true );<br>    }<br><br>    return $processor-&gt;get_updated_html();<br>}</pre>



<p class="wp-block-paragraph">Con este código pasa lo mismo que con el plugin Visibility como te dije antes, que el atributo se añade al mostrar la página, así que si quitas el código desaparece el <code>data-nosnippet</code> del bloque. Y como se añade desde el servidor y no con JavaScript, cumple lo que pide Google.</p>



<h2 class="wp-block-heading">Cómo comprobar si Google va a «ver» tu decisión</h2>



<ol class="wp-block-list">
<li>Abre la página, mira el código fuente y busca <code>nosnippet</code>, que saldrá dentro de la etiqueta <code>&lt;meta name="robots"&gt;</code>, o <code>data-nosnippet</code> en el texto que hayas seleccionado.</li>



<li>Pasa la URL por la herramienta de inspección de URLs de Search Console y mira el HTML que recibió Googlebot, que es justo lo que recomienda Google para comprobar que el control es correcto y visible para su rastreador. Ten paciencia, porque Google avisa de que el rastreo puede tardar desde varios días hasta varios meses según la frecuencia con la que decida refrescar la página. Puedes pedirle un nuevo rastreo desde la propia inspección.</li>
</ol>



<p class="wp-block-paragraph">Esto vale para <code>nosnippet</code> y <code>data-nosnippet</code>. El ajuste de Search Console va por otro camino y, según su ayuda, se aplica en unos días.</p>



<h2 class="wp-block-heading">Qué haría yo, de menos a más</h2>



<p class="wp-block-paragraph">A ver, mi orden es empezar siempre por lo más pequeño, que además es lo que menos cuesta.</p>



<ul class="wp-block-list">
<li><strong>Un texto concreto, con <code>data-nosnippet</code>:</strong> Lo que te dije antes. Solo recomiendo excluir textos cuando tienes muy claro que son párrafos que quitarías tú mismo antes de que salieran en una vista creada con IA o en cualquier resumen, esas cosas que van en tus páginas y que nunca has querido ver reproducidas fuera de ellas. Hablo de los textos legales que pegas al final de una página (el párrafo, no la página legal entera), de frases comprometidas o de palabras que pueden bloquearte en según qué entornos. Y recuerda lo de antes, que no es un candado ni una promesa sobre las IA, así que si de verdad no quieres ese texto a la vista, quítalo de la página.</li>



<li><strong>Una página entera, con <code>nosnippet</code>:</strong> Lo reservaría para páginas que no tiene sentido que Google resuma ni extracte, como contenido de pago o las de un curso o un área de socios que se vean desde fuera. Y no lo pondría en ninguna de las que quieres que te traigan visitas desde Google, porque a esas les quitarías la descripción y, según mi lectura, la posibilidad de salir como enlace en las funciones de IA.</li>



<li><strong>Toda la web, con el ajuste de Search Console:</strong> Es una decisión de negocio más que técnica, y no la tomaría por miedo, que es lo que menos recomiendo. Si tu negocio depende de que el contenido solo se vea en tu web, tiene sentido planteárselo, pero sales de todas las funciones a la vez (salvo que lo apliques a una carpeta) y con un informe que mide impresiones, no visitas. Si lo haces, cambia una cosa cada vez y apunta la fecha, para saber qué ha pasado después.</li>
</ul>



<p class="wp-block-paragraph">¿Que tienes un caso concreto y no sabes en cuál de los tres encaja?, pues cuéntamelo en los comentarios y lo vemos juntos. Y si quieres seguir con el tema, tengo escrito bastante sobre <a href="https://ayudawp.com/ai-overviews-google/" target="_blank" rel="ugc noopener">las AI Overviews de Google</a>, de cómo <a href="https://ayudawp.com/bloquear-bots-ia/" target="_blank" rel="ugc noopener">bloquear a los bots de IA</a> y no menos de <a href="https://ayudawp.com/evitar-meta-robots-wordpress/" target="_blank" rel="ugc noopener">las etiquetas meta robots duplicadas en WordPress</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/nosnippet-data-nosnippet-ia-google/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>«Allowed memory size exhausted» ¿qué significa, está WordPress cansado o algo así?</title>
		<link>https://ayudawp.com/allowed-memory-size-exhausted/</link>
					<comments>https://ayudawp.com/allowed-memory-size-exhausted/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 06:28:49 +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[wp-config.php]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160542</guid>

					<description><![CDATA[Qué significa «Allowed memory size exhausted», qué límite manda de verdad en WordPress y cómo averiguar quién gasta la memoria antes de subirlo.]]></description>
										<content:encoded><![CDATA[<p>Entras en tu web y te encuentras la pantalla de «<strong>Error crítico</strong>», o abres el registro de errores y ves una línea llena de bytes con la frase «<code>Allowed memory size exhausted</code>». Dicho en cristiano, un proceso de PHP ha intentado usar más memoria de la que le dejaban y PHP lo ha cortado en seco.</p>
<p>Lo normal es que lo primero que se te ocurra sea subir el límite, y muchas veces funciona. Pero <strong>subir el límite sin saber quién gasta la memoria es como poner un cubo más grande bajo una gotera</strong>, el suelo deja de mojarse, pero el tejado sigue jodido.</p>
<p>La <a href="https://developer.wordpress.org/advanced-administration/wordpress/wp-config/" target="_blank" rel="nofollow noopener">documentación oficial de WordPress</a> avisa de que ampliar la memoria puede esconder la causa real del problema, y de que si el error sigue saliendo con un límite alto toca depurar en vez de seguir subiéndolo.</p>
<p>Pero oye, que no seré yo quien te quite de nada, si tienes prisa ve directo al apartado de subir el límite. Si prefieres que no te vuelva a pasar el mes que viene, sigue leyendo, que te ahorra más de un susto.</p>
<h2>Qué significa el error «Allowed memory size exhausted»</h2>
<p>El mensaje completo tiene esta pinta:</p>
<p><code>PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /var/www/html/wp-includes/class-wpdb.php on line 1995</code></p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160545 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/Memory-exhaust-error.jpg" alt="" width="710" height="378"></p>
<p><strong>El primer número es el límite que tenía PHP en ese momento</strong>, expresado en bytes, para pasarlo a algo legible divides entre 1.048.576, así que en el ejemplo hablamos de 128 MB. Para que no tengas que sacar la calculadora estos son los que más te vas a encontrar:</p>
<ul>
<li>33.554.432 bytes son 32 MB.</li>
<li>41.943.040 bytes son 40 MB, el valor por defecto de WordPress en una instalación normal.</li>
<li>67.108.864 bytes son 64 MB, el valor por defecto en multisitio.</li>
<li>134.217.728 bytes son 128 MB.</li>
<li>268.435.456 bytes son 256 MB.</li>
<li>536.870.912 bytes son 512 MB.</li>
<li>805.306.368 bytes son 768 MB.</li>
</ul>
<p><strong>El segundo número, el de «<code>tried to allocate</code>», es la petición que no cupo</strong> y no lo que gasta tu web. Si ves «<code>tried to allocate 65536 bytes</code>» (64 KB) no pienses que el culpable es una tontería de 64 KB. La memoria ya estaba casi llena y esa es la última croqueta que no te cabía después de comerte medio cocido.</p>
<p><strong>La ruta y la línea te dicen dónde se acabó la memoria, no quién la gastó.</strong> Si el error termina en un archivo del núcleo, como en el ejemplo, no significa que WordPress tenga la culpa. Puede que un plugin cargara antes cien mil registros en memoria y el núcleo fuera el que se dio de bruces con el techo.</p>
<p>Y ojo, que muchas veces ni siquiera ves ese mensaje, pues desde WordPress 5.2, cuando un fallo fatal tumba una página, el visitante ve una pantalla que dice algo así como «<strong>Ha habido un error crítico en esta web</strong>», y si el fallo salta en el escritorio o en la pantalla de acceso, el texto te pide además que mires el correo del administrador.</p>
<p>Ahí puede haber un mensaje con el asunto «<code>[Nombre de tu web] Tu sitio tiene problemas técnicos</code>» y una frase del estilo «<code>Se ha producido un error del tipo E_ERROR en la línea…</code>», seguida del mensaje de PHP.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160555 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/e-error-email-WordPress.jpg" alt="" width="1200" height="807" srcset="https://ayudawp.com/wp-content/uploads/2026/10/e-error-email-WordPress.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/e-error-email-WordPress-768x516.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/e-error-email-WordPress-240x160.jpg 240w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Ese correo no llega siempre.</strong> Según el código de WordPress 7.1, hace falta que el fallo salte en el escritorio, en el acceso o en alguna acción protegida, y no en la parte pública. Hace falta también que el archivo donde se acabó la memoria esté dentro de la carpeta de un plugin o de un tema, porque si es del núcleo no se envía nada. Tampoco se manda en multisitio, y por defecto WordPress envía como mucho uno cada 24 horas.</p>
<p>Y ahí vuelve el problema de la ruta, porque WordPress señala al plugin o al tema por el archivo donde se cortó la ejecución, así que si el plugin A se ha comido casi toda la memoria y el B es el que pide los últimos 64 KB, el correo acusará a B. Es una pista y nada más.</p>
<h2>Qué límite manda: memory_limit, WP_MEMORY_LIMIT y WP_MAX_MEMORY_LIMIT</h2>
<p>Aquí nos liamos casi todos, porque hay tres valores con nombres parecidísimos y cada uno hace una cosa distinta.</p>
<ul>
<li><strong><code>memory_limit</code> de PHP.</strong> Lo fija tu servidor, en el php.ini o en el selector de PHP del panel del hosting. Es el techo con el que arranca cada petición.</li>
<li><strong><code>WP_MEMORY_LIMIT</code>.</strong> Lo define WordPress y vale 40 MB por defecto (64 MB en multisitio). Se usa para intentar subir el límite de PHP al arrancar, y solo para subirlo, nunca para bajarlo. Si PHP ya te da 256 MB y tu constante dice 64 MB, te quedas con los 256 MB.</li>
<li><strong><code>WP_MAX_MEMORY_LIMIT</code>.</strong> Es el techo para las tareas pesadas, como el escritorio, el procesado de imágenes y las tareas programadas de WP-Cron (estas últimas desde WordPress 6.3). Vale 256 MB por defecto, o el límite que ya tenga PHP si es mayor.</li>
</ul>
<p><strong>Si tu hosting no deja cambiar el límite desde PHP, WordPress adopta el que haya</strong> y las constantes que pongas en el <code>wp-config.php</code> no te van a servir de nada. Eso explica muchos «he puesto 512 MB y sigue igual».</p>
<p>Si defines <code>WP_MEMORY_LIMIT</code> por encima de 256 MB y no tocas <code>WP_MAX_MEMORY_LIMIT</code>, este último se iguala a lo que hayas puesto, así que con una sola línea mueves los dos.</p>
<p>Al cargar una pantalla del escritorio, WordPress solo sube el límite hasta <code>WP_MAX_MEMORY_LIMIT</code> si el usuario puede gestionar opciones, o sea, un administrador. Un editor o un gestor de la tienda arranca con el límite normal, salvo en tareas concretas como tratar imágenes. Si el error solo les sale a ellos, ya tienes una pista.</p>
<p>Para ver qué tienes de verdad, ve a «<strong>Herramientas &gt; Salud del sitio &gt; Información</strong>». En la sección «<strong>Servidor</strong>» aparece el «<strong>Límite de memoria PHP</strong>», y en «<strong>Constantes de WordPress</strong>» tienes <code>WP_MEMORY_LIMIT</code> y <code>WP_MAX_MEMORY_LIMIT</code>. Si el límite del escritorio es distinto del general, salud del sitio te enseña dos líneas, la segunda con el texto «solo para las pantallas de administración».</p>
<p>
<a href="https://ayudawp.com/allowed-memory-size-exhausted/salud-del-sitio-servidor-limites-memoria/" rel="nofollow"><img width="1200" height="1340" src="https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-servidor-limites-memoria-1200x1340.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-servidor-limites-memoria-1200x1340.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-servidor-limites-memoria-768x858.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-servidor-limites-memoria-1375x1536.jpg 1375w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-servidor-limites-memoria.jpg 1606w" sizes="(max-width: 1200px) 100vw, 1200px" decoding="async" fetchpriority="high"></a>
<a href="https://ayudawp.com/allowed-memory-size-exhausted/salud-del-sitio-constantes-wordpress/" rel="nofollow"><img width="1200" height="1246" src="https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-constantes-WordPress-1200x1246.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-constantes-WordPress-1200x1246.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-constantes-WordPress-768x798.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-constantes-WordPress-1479x1536.jpg 1479w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-constantes-WordPress.jpg 1612w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
</p>
<h2>Averigua qué consume la memoria antes de subir el límite</h2>
<p>Antes de tocar nada, ve preguntando de lo más barato a lo más caro.</p>
<ul>
<li><strong>¿Cuándo salta?:</strong> En la portada, solo en el escritorio, al subir una imagen, al hacer una importación o a una hora fija, y eso ya cierra cerco al sospechoso. Si falla al subir imágenes, recuerda que se descomprimen en memoria y lo que cuenta son los píxeles y no el peso del archivo. Una foto de 24 megapíxeles ocupa muchas decenas de megas aunque el JPG pese 5. Si falla a horas fijas repasa tus tareas programadas como expliqué en la <a href="https://ayudawp.com/wp-cron/" target="_blank" rel="ugc noopener">guía de WP-Cron</a>.</li>
<li><strong>El correo de recuperación:</strong> Si te ha llegado ya sabes en qué carpeta se cortó la ejecución. Si no te ha llegado eso no significa que no haya fallo, pero repasa las condiciones del primer apartado.</li>
<li><strong>El archivo debug.log:</strong> Es el registro de WordPress y se activa con las constantes de depuración. Añade esto en el <code>wp-config.php</code>, encima de la línea «<code>That's all, stop editing!</code>»:</li>
</ul>
<pre>define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );</pre>
<p>El registro se crea en <code>wp-content/debug.log</code>. Busca ahí las líneas con «<code>Allowed memory size</code>» y fíjate en si la misma ruta se repite. Una vez es una pista y cinco veces ya es un patrón. Cuando termines desactiva la depuración y borra el archivo, porque puede ser accesible desde el navegador.</p>
<ul>
<li><strong>El registro de errores del hosting:</strong> Casi todos los hostings tienen un registro de errores de PHP en el panel, que recoge los fallos aunque la depuración de WordPress esté apagada. Mira si sale ahí la misma ruta.</li>
<li><strong>El descarte <em>que siempre hay que hacer y nunca haces aunque sea el más sencillo de probar, que mira que me duele la boca de decirlo</em>:</strong> En un entorno de pruebas, desactiva todos los plugins y activa un tema por defecto. Si el error desaparece, ve reactivando uno a uno hasta que vuelva. Es lento, pero funciona.</li>
</ul>
<p><a href="https://ayudawp.com/query-monitor/" target="_blank" rel="ugc noopener">Query Monitor</a> te ayuda en las páginas que sí llegan a cargar, porque enseña consultas lentas y errores de PHP con el componente responsable. Para un fallo fatal por memoria no es para lo que está pensado, porque la página se corta antes de pintarse, y su propia documentación avisa de que en páginas con cientos de consultas él mismo gasta más memoria.</p>
<h2>Subir el límite cuando de verdad hace falta</h2>
<p>Cuando ya sabes que el consumo es razonable, o que vas a tratar al culpable aparte, ampliar la memoria es totalmente lógico. Eso sí, antes de tocar nada haz una copia de seguridad del <code>wp-config.php</code>. El orden bueno es de fuera hacia dentro, como en casi todo.</p>
<ol>
<li><strong>Primero, el panel del hosting.</strong> Casi todos tienen un selector de PHP donde puedes cambiar el <code>memory_limit</code>. Es el valor que manda sobre el resto, así que si puedes cambiarlo ahí, empieza por ahí.<br>
<a href="https://ayudawp.com/?attachment_id=160548" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160548 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/site-tools-siteground-gestionar-php-limites-memoria-1200x492.jpg" alt="" width="1200" height="492" srcset="https://ayudawp.com/wp-content/uploads/2026/10/site-tools-siteground-gestionar-php-limites-memoria-1200x492.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/site-tools-siteground-gestionar-php-limites-memoria-768x315.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/site-tools-siteground-gestionar-php-limites-memoria-1536x630.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/site-tools-siteground-gestionar-php-limites-memoria.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></li>
<li><strong style="font-size: 16px;">Después, <code>WP_MEMORY_LIMIT</code> en el wp-config.php.</strong><span style="font-size: 16px;"> Va encima de la línea que dice «</span><code style="font-size: 16px; font-style: inherit; font-weight: inherit;">That's all, stop editing!</code><span style="font-size: 16px;">», que normalmente sigue en inglés aunque tu WordPress esté en español:</span>
<pre>define( 'WP_MEMORY_LIMIT', '256M' );</pre>
</li>
</ol>
<p>Fíjate en que va en mayúsculas. <strong>Las constantes de PHP distinguen mayúsculas de minúsculas</strong>, así que <code>wp_memory_limit</code> en minúsculas, que se ha colado en algún tutorial, no hace nada. Con la directiva del php.ini pasa algo parecido, porque se llama <code>memory_limit</code> y no <code>memory</code>.</p>
<p>Para empezar,<strong> 256 MB es un punto de partida razonable</strong>. Es el techo por defecto de WordPress para el escritorio y lo que SiteGround aplica a las instalaciones nuevas. Si solo necesitas más margen para el escritorio, las imágenes o las tareas programadas, puedes dejar el límite general como está y ampliar únicamente el techo de las tareas pesadas:</p>
<pre>define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );</pre>
<p>Así una importación desde el escritorio puede llegar a 512 MB sin que cada visita a la portada pueda pedir tanto. Piensa también que <strong>el límite es por petición</strong>, y que con muchas visitas a la vez acaba mandando la memoria total del servidor.</p>
<p><strong>Ampliar no sustituye a diagnosticar.</strong> Si con 256 MB, o con 512 MB, el error sigue saliendo, el problema ya no es el límite, así que vuelve al apartado anterior y, si es un proceso pesado como una importación o un envío masivo, plantéate sacarlo al cron o partirlo en lotes.</p>
<h2>Si tu hosting no te deja subirlo</h2>
<p>Hay hostings donde nada de lo anterior funciona porque el valor viene fijado. En SiteGround, por ejemplo, <strong>el <code>memory_limit</code> de PHP está fijo en 768 MB en los planes compartidos y no se puede cambiar</strong>. Pero vamos, que con 768 MB de partida, cuando salta el error lo normal es que el problema no esté en el límite.</p>
<p><strong>Otros hostings añaden un límite de RAM por cuenta</strong>, distinto del de PHP. Si el tuyo lo tiene, la web puede caerse sin que PHP llegue a escribir «<code>Allowed memory size</code>», y la solución pasa por el soporte de tu proveedor, no por el <code>wp-config.php</code>.</p>
<h2>Subir imágenes grandes en WordPress 7.1</h2>
<p>Si el error te sale al subir imágenes, con la 7.1 el camino puede ser distinto, y conviene saberlo para no diagnosticar a ciegas.</p>
<p>La 7.1 puede generar las miniaturas en tu navegador y no en el servidor. Según la <a href="https://make.wordpress.org/core/2026/07/22/client-side-media-processing-in-wordpress-7-1/" target="_blank" rel="nofollow noopener">nota para desarrolladores</a>, eso evita los fallos de memoria de PHP con imágenes grandes, porque el trabajo se hace en la memoria del navegador.</p>
<p><strong>Esto solo ocurre si se dan unas condiciones.</strong> Hace falta una web servida por HTTPS, un navegador basado en Chromium (Chrome o Edge 137 o superior), un equipo con más de 2 GB de memoria y al menos dos núcleos, una conexión que no sea 2G ni lenta, y una política de seguridad de contenido (CSP) que permita crear workers desde <code>blob:</code>. En Firefox y Safari, o si falla cualquiera de esas condiciones, WordPress vuelve a procesar la imagen en el servidor sin avisar.</p>
<p>Y ojo, que <strong>solo funciona en las pantallas del editor de bloques</strong> (entradas y páginas, editor del sitio y widgets). Si subes la imagen desde Medios &gt; Añadir nuevo, las miniaturas las sigue generando el servidor.</p>
<p>En la práctica, si una foto te da error de memoria, prueba a subirla desde el editor con Chrome y desde la biblioteca de medios. Si solo falla por una de las dos vías, ya sabes de qué lado está el problema. Y si por algún motivo necesitas apagar el procesado en el navegador, la nota documenta este filtro, que puedes poner en un plugin propio o en el functions.php de tu tema hijo:</p>
<pre>add_filter( 'wp_client_side_media_processing_enabled', '__return_false' );</pre>
<p>Todo esto afecta a las subidas nuevas. Si lo que quieres es regenerar las miniaturas de toda la biblioteca, tienes la <a href="https://ayudawp.com/regenerar-miniaturas-de-wordpress/" target="_blank" rel="ugc noopener">guía para regenerar miniaturas</a>, que incluye un apartado sobre el error por memoria agotada.</p>
<h2>Qué hacer si el error vuelve a salir</h2>
<ul>
<li>Apunta <strong>cuándo salta y qué ruta aparece</strong>, con fecha y hora, para ver si hay un patrón.</li>
<li><strong>Comprueba qué límite tienes</strong> de verdad en salud del sitio antes de cambiar nada.</li>
<li>Si la misma ruta se repite, desactiva ese plugin o ese tema en un entorno de pruebas y mira si el error desaparece.</li>
<li>Sube el límite <strong>solo cuando sepas que el consumo es razonable</strong>, y deja anotado el valor que has puesto y por qué.</li>
</ul>
<p>Si lo que te sale es otro error distinto, en la <a href="https://ayudawp.com/los-principales-errores-y-problemas-en-wordpress-y-su-solucion/" target="_blank" rel="ugc noopener">guía de los principales errores de WordPress y su solución</a> tienes los más habituales. Para todo lo demás, dudas, besos y abrazos, me tienes ahí abajito, en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/allowed-memory-size-exhausted/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>La caché Opcode no está activada ¿en serio?</title>
		<link>https://ayudawp.com/opcode/</link>
					<comments>https://ayudawp.com/opcode/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 13 Oct 2026 06:28:01 +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[Caché]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[OPcache]]></category>
		<category><![CDATA[Opcode]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160515</guid>

					<description><![CDATA[Si has entrado últimamente en «Herramientas → Salud del sitio» habrás visto una mejora recomendada nueva, «La caché Opcode no está activada» que sepas que igual es que WordPress te está mintiendo…]]></description>
										<content:encoded><![CDATA[<p>Si has entrado últimamente en «<strong>Herramientas → Salud del sitio</strong>» habrás visto una mejora recomendada nueva, «<strong>La caché Opcode no está activada</strong>», con su etiqueta de rendimiento y un enlace a la documentación de PHP que, para qué nos vamos a engañar, no aclara mucho a quien no vive entre servidores: tú, yo, la vecina de abajo, ni te cuento el panadero ese que también usa WordPress.</p>
<p>Curiosamente es sobre esto sobre lo que más me están preguntando últimamente los clientes <a href="https://mantenimiento.ayudawp.com" target="_blank" rel="ugc noopener">del servicio de mantenimiento WordPress</a>, siempre con la misma duda de <strong>¿hay que hacer algo?, ¿con qué?, ¿tengo que pagar a alguien?</strong></p>
<p>Pues tranqui, que <strong>en la mayoría de los casos no tienes que hacer nada, porque la caché ya está funcionando y es WordPress el que no sabe verlo</strong>. Ahora bien, «la mayoría» no es «siempre», así que vamos a ver de dónde sale el aviso, cómo saber si en tu caso es real y qué hacer en cada situación.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160518 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/cache-opcode-no-activda-salud-del-sitio-WordPress-1200x1018.jpg" alt="" width="1200" height="1018" srcset="https://ayudawp.com/wp-content/uploads/2026/10/cache-opcode-no-activda-salud-del-sitio-WordPress-1200x1018.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/cache-opcode-no-activda-salud-del-sitio-WordPress-768x652.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/cache-opcode-no-activda-salud-del-sitio-WordPress-1536x1303.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/cache-opcode-no-activda-salud-del-sitio-WordPress.jpg 1780w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<h2>De dónde sale el aviso de Opcode, así, de repente</h2>
<p>Lo que es <strong>OPcache</strong> ya te lo conté en detalle en la <a href="https://ayudawp.com/estrategias-cache-wordpress/" target="_blank" rel="ugc noopener">guía de tipos de caché en WordPress</a>, así que no me repito, pero resumiendo mucho simplemente que sepas que <strong>guarda el código PHP ya compilado para que el servidor no tenga que procesarlo en cada visita, y es de las cachés que más se notan</strong>.</p>
<p>El aviso no lo habías visto antes porque no estaba ahí, <strong>llegó con WordPress 7.0, que añadió una comprobación nueva de caché de código a la salud del sitio</strong> (el <a href="https://core.trac.wordpress.org/ticket/63697" target="_blank" rel="nofollow noopener">ticket #63697</a>, por si te va el cotilleo técnico).</p>
<p>La comprobación es de lo más fácil, porque llama a la función de PHP <code>opcache_get_status()</code> y <strong>si no recibe datos que digan que OPcache está activo te suelta el aviso</strong>.</p>
<p>El problema es que <strong>hay dos configuraciones muy habituales en las que esa función no confirma que OPcache esté activo aunque esté funcionando</strong> a pleno rendimiento:</p>
<ul>
<li><strong>Caché solo en archivo:</strong> hay servidores que guardan la caché de OPcache en disco en lugar de en memoria compartida (el modo <code>file_cache_only</code>), y en ese modo la función responde que OPcache no está activo, porque ese dato solo se refiere a la caché en memoria (reportado en el <a href="https://core.trac.wordpress.org/ticket/64707" target="_blank" rel="nofollow noopener">ticket #64707</a>).</li>
<li><strong>Consulta bloqueada por el hosting:</strong> muchos alojamientos compartidos restringen esa función por seguridad, porque podría mostrar información de los archivos de otros clientes del mismo servidor. Plesk, por ejemplo, la desactiva por defecto (es el <a href="https://core.trac.wordpress.org/ticket/65395" target="_blank" rel="nofollow noopener">ticket #65395</a>).</li>
</ul>
<p>Los dos tickets tienen propuesta de arreglo pero siguen abiertos, y WordPress aún no incluye ninguno, así que el aviso va a seguir ahí un tiempo.</p>
<blockquote><p>El aviso no dice que OPcache esté desactivado, dice que WordPress no ha podido comprobar que esté activo, que no es lo mismo.</p></blockquote>
<h2>Cómo comprobar si el aviso de Opcode es real</h2>
<p>Casi me da cosa decir esto, pero <strong>no te fíes de la pestaña información de la propia salud del sitio</strong> para esto, porque en estos casos tira de la misma función y te va a contar lo mismo. Sí, lo he dicho: no te fíes de WordPress 🙁</p>
<p>El que no miente es el <code>phpinfo</code> de tu servidor. Algunos paneles de hosting te lo muestran directamente, y si el tuyo no lo hace puedes crear un archivo llamado <code>info.php</code> con este contenido y subirlo a donde tengas instalado WordPress:</p>
<pre>&lt;?php phpinfo();</pre>
<p>Visítalo en el navegador (<code>tudominio.com/info.php</code>), busca el bloque que empieza con <strong>Zend OPcache</strong> y fíjate en estas líneas:</p>
<ul>
<li><strong>Opcode Caching:</strong> si pone <code>Up and Running</code> es que OPcache está funcionando, diga lo que diga WordPress.</li>
<li><strong>SHM Cache y File Cache:</strong> te dicen si la caché va en memoria compartida, en archivo o en ambas. Si <strong>SHM</strong> está en <code>Disabled</code> y <strong>File Cache</strong> en <code>Enabled</code>, estás en el modo solo archivo del que hablaba antes.</li>
<li><strong>opcache.restrict_api:</strong> si tiene alguna ruta como valor es que tu hosting está limitando la consulta, si no, pondrá <code>no value</code>, que significa que no hay ninguna ruta restringida.</li>
</ul>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160520 size-full" src="https://ayudawp.com/wp-content/uploads/2026/10/zend-opcache.jpg" alt="" width="1200" height="248" srcset="https://ayudawp.com/wp-content/uploads/2026/10/zend-opcache.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/zend-opcache-768x159.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<blockquote><p><strong>Borra el archivo <code>info.php</code> en cuanto termines</strong>, porque enseña a cualquiera la configuración completa de tu servidor, y eso no se deja a la vista.</p></blockquote>
<h2>Los tres escenarios posibles</h2>
<p>Con el <code>phpinfo</code> delante vas a estar en uno de estos tres casos:</p>
<ul>
<li><strong>OPcache funciona y WordPress no lo ve:</strong> es lo más habitual. Pone <code>Up and Running</code> y el aviso es un falso positivo, así que no tienes que hacer nada más allá de ignorarlo o corregirlo con el código que te pongo más abajo. Es lo que pasa, por ejemplo, en SiteGround, que usa caché solo en archivo, de modo que el aviso sale en todas las webs alojadas allí aunque OPcache esté activo.</li>
<li><strong>OPcache está disponible pero apagado:</strong> aparece el bloque Zend OPcache pero <code>opcache.enable</code> está en <code>Off</code>, o el estado no es <code>Up and Running</code>. Mira en el selector de PHP de tu panel si hay una opción para activarlo y, si no la encuentras, pídeselo al soporte de tu hosting. Aquí sí ganas rendimiento.</li>
<li><strong>Tu hosting no lo ofrece:</strong> no hay ni rastro del bloque Zend OPcache. Aquí el aviso es real y, como ya te dije en la guía de cachés, <strong>un hosting que no ofrece OPcache a estas alturas es motivo para ir pensando en cambiar</strong>.</li>
</ul>
<p>Por cierto, para que no te quedes con una idea equivocada, <strong>el modo archivo de OPcache sigue ahorrándote lo más pesado, que es compilar el código en cada petición, pero lo lee del disco en lugar de tenerlo en una memoria compartida</strong>, que es el peaje razonable de aislar la caché de cada cliente en un hosting compartido.</p>
<h2>Cómo quitar el aviso de Opcode</h2>
<p>Si has confirmado que es un falso positivo y <strong>te molesta verlo</strong> (o te molesta que el cliente te pregunte cada semana), tienes dos opciones.</p>
<p>A lo bruto es quitar el test entero con el filtro <code>site_status_tests</code>, igual que te enseñé en el artículo sobre <a href="https://ayudawp.com/optimizar-salud-del-sitio/" target="_blank" rel="ugc noopener">optimizar la herramienta de salud del sitio</a>, eliminando <code>$tests['direct']['opcode_cache']</code>. Funciona, pero tiene una pega, y es que <strong>si mañana cambias de hosting y allí OPcache está apagado de verdad, no te vas a enterar</strong>.</p>
<p>La que sí te recomiendo es <strong>corregir solo el resultado cuando el aviso es falso</strong>. Este código mira la configuración de PHP, que no se ve afectada ni por el modo solo archivo ni por el bloqueo del hosting, y <strong>únicamente da OPcache por activo si de verdad está activado</strong>. Si no lo está, el aviso sigue saliendo, que es lo que quieres.</p>
<p>Además <strong>corrige las dos pestañas</strong>, porque si solo arreglas la de estado te encuentras la prueba superada mientras «<strong>Información → Servidor</strong>» sigue diciendo que la caché está desactivada, y eso también podría despistar, y como poco sería incongruente:</p>
<pre>&lt;?php
/**
 * Plugin Name: AyudaWP - Corrige el falso aviso de caché Opcode
 * Description: Corrige el falso positivo de la caché Opcode en salud del sitio cuando OPcache está activo pero WordPress no puede consultar su estado.
 * Plugin URI: https://plugins.ayudawp.com/
 * Description: Corrige el falso positivo de la caché Opcode en salud del sitio cuando OPcache está activo pero WordPress no puede consultar su estado.
 * Version: 1.0.0
 * Author: Fernando Tellado
 * Author URI: https://ayudawp.com/
 * License: GPLv2 or later
 */

defined( 'ABSPATH' ) || exit;

/**
 * Comprueba OPcache en la configuración de PHP, no con opcache_get_status()
 */
function ayudawp_opcache_is_enabled() {
	return extension_loaded( 'Zend OPcache' ) &amp;&amp; filter_var( ini_get( 'opcache.enable' ), FILTER_VALIDATE_BOOLEAN );
}

/**
 * Pestaña Estado: convierte el falso aviso en prueba superada
 */
function ayudawp_fix_opcode_cache_false_positive( $result ) {
	if ( ! isset( $result['test'] ) || 'opcode_cache' !== $result['test'] || 'good' === $result['status'] ) {
		return $result;
	}

	if ( ayudawp_opcache_is_enabled() ) {
		// Reutiliza cadenas nativas para que salgan traducidas
		$result['status']      = 'good';
		$result['label']       = __( 'Opcode cache is enabled' );
		$result['description'] = sprintf(
			'&lt;p&gt;%s&lt;/p&gt;',
			__( 'Opcode cache improves PHP performance by storing precompiled script bytecode in memory, reducing the need for PHP to load and parse scripts on each request.' )
		);
	}

	return $result;
}
add_filter( 'site_status_test_result', 'ayudawp_fix_opcode_cache_false_positive' );

/**
 * Pestaña Información: corrige el «Desactivado» de la sección Servidor
 */
function ayudawp_fix_opcode_cache_debug_info( $info ) {
	if ( isset( $info['wp-server']['fields']['opcode_cache'] )
		&amp;&amp; true !== $info['wp-server']['fields']['opcode_cache']['debug']
		&amp;&amp; ayudawp_opcache_is_enabled() ) {
		$info['wp-server']['fields']['opcode_cache']['value'] = __( 'Enabled' );
		$info['wp-server']['fields']['opcode_cache']['debug'] = 'enabled (status not available)';
	}

	return $info;
}
add_filter( 'debug_information', 'ayudawp_fix_opcode_cache_debug_info' );</pre>
<p>Lo ideal es que lo añadas como <a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="ugc noopener">mu-plugin</a>, guardándolo como un archivo PHP (por ejemplo <code>ayudawp-opcode-cache-fix.php</code>) dentro de la carpeta <code>wp-content/mu-plugins/</code>, que si no existe la creas. Así no depende del tema ni de que alguien desactive un plugin por error. Los textos son los mismos que usa WordPress, así que te saldrán traducidos al español sin hacer nada.</p>
<p>Vuelve a entrar en la salud del sitio y verás que la caché Opcode pasa a las pruebas superadas y que en la pestaña de información ya aparece como activada.</p>
<p>
<a href="https://ayudawp.com/opcode/salud-del-sitio-buen-trabajo-wordpress/" rel="nofollow"><img width="1038" height="1190" src="https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-buen-trabajo-WordPress.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-buen-trabajo-WordPress.jpg 1038w, https://ayudawp.com/wp-content/uploads/2026/10/Salud-del-sitio-buen-trabajo-WordPress-768x880.jpg 768w" sizes="auto, (max-width: 1038px) 100vw, 1038px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/opcode/salud-del-sitio-opcache-activado/" rel="nofollow"><img width="1200" height="1322" src="https://ayudawp.com/wp-content/uploads/2026/10/salud-del-sitio-opcache-activado.jpg" class="attachment-medium size-medium" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/10/salud-del-sitio-opcache-activado.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/salud-del-sitio-opcache-activado-768x846.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
</p>
<h2>Lo que no te recomiendo hacer</h2>
<p>Con este aviso circulan por ahí unas cuantas soluciones que o no sirven o empeoran las cosas:</p>
<ul>
<li><strong>Instalar un plugin de OPcache para «activarlo»:</strong> estos plugins sirven para ver estadísticas o vaciar la caché, no pueden activar nada que el servidor no tenga activo, y con la consulta bloqueada por el hosting ni siquiera ven los datos.</li>
<li><strong>Copiar el filtro <code>wp_site_health_opcache_status</code>:</strong> lo verás en algún sitio como solución, pero sale de una propuesta en borrador para WordPress que no se ha incorporado, así que no hace absolutamente nada.</li>
<li><strong>Lanzar <code>opcache_reset()</code> a ver si se arregla:</strong> vaciar la caché no tiene nada que ver con el aviso, y en un servidor compartido sin restricciones puede vaciarla para todas las webs del servidor, no solo la tuya.</li>
<li><strong>Abrir un ticket con prisas:</strong> antes de pedirle al soporte que te active OPcache mira el <code>phpinfo</code>, porque lo más probable es que te contesten que ya lo tienes.</li>
<li><strong>Desactivar la salud del sitio entera:</strong> por un falso positivo te quedas sin avisos que sí importan, como una versión de PHP obsoleta o un fallo de comunicación con WordPress.org.</li>
</ul>
<h2>¿Tengo que hacer algo ya mismo?</h2>
<p>Lo justo y necesario, para poder seguir con tu vida, en este orden:</p>
<ol>
<li>Mira el <code>phpinfo</code> de tu servidor y si lo creas tú luego borra el archivo al terminar.</li>
<li>Si pone <code>Up and Running</code> olvídate del aviso o corrígelo con el código de arriba.</li>
<li>Si OPcache existe pero está apagado, actívalo desde el panel o pídeselo al soporte del hosting.</li>
<li>Si tu hosting no lo ofrece apúntalo en la lista de motivos para cambiar de hosting.</li>
</ol>
<p>Cuando WordPress incorpore alguno de los arreglos pendientes el aviso dejará de salir solo, y el código de este artículo seguirá siendo inofensivo porque únicamente actúa cuando la prueba de salud del sitio falla.</p>
<p>Si en tu hosting el aviso sale y no encajas en ninguno de los tres casos, me tienes ahí abajo, en los comentarios, y lo miramos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/opcode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress 7.1.2 a toda prisa, malware de ocho cabezas, adiós a Meetup y Google cobrando peaje #CrónicasWordPress</title>
		<link>https://ayudawp.com/wordpress-7-1-2-a-toda-prisa-malware-de-ocho-cabezas-adios-a-meetup-y-google-cobrando-peaje-cronicaswordpress/</link>
					<comments>https://ayudawp.com/wordpress-7-1-2-a-toda-prisa-malware-de-ocho-cabezas-adios-a-meetup-y-google-cobrando-peaje-cronicaswordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Fri, 09 Oct 2026 10:21:13 +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=160581</guid>

					<description><![CDATA[Esta semana en el canal oficial de Ayuda WordPress en YouTube solo ha habido directo el lunes, pero vino cargadito, porque la semana anterior no pude grabar y tenía dos semanas de noticias acumuladas. Ha tocado mucha seguridad (de la gorda), novedades de comunidad que llevábamos tiempo esperando, WooCommerce 11.2 y un buen repaso a lo que están haciendo la IA y Google con nuestro tráfico.]]></description>
										<content:encoded><![CDATA[<p>Esta semana en el canal oficial de Ayuda WordPress en YouTube solo ha habido directo el lunes, pero vino cargadito, porque la semana anterior no pude grabar y tenía dos semanas de noticias acumuladas. <strong>Ha tocado mucha seguridad (de la gorda), novedades de comunidad que llevábamos tiempo esperando, WooCommerce 11.2 y un buen repaso a lo que están haciendo la IA y Google con nuestro tráfico.</strong></p>
<p>El miércoles no hubo Doctor WordPress porque estaba en el WordPress Agency Forum de Madrid, así que esta semana te dejo el resumen de las Crónicas solamente. La semana que viene vuelvo con las dos sesiones.</p>
<h2>Crónicas WordPress: dos semanas de noticias en un solo directo</h2>
<h3>WordPress 7.1.2, de las actualizaciones que no se pueden dejar para mañana</h3>
<p>Empecé por lo más serio. WordPress 7.1.2 salió el 22 de septiembre y corrige un único fallo, pero de los gordos, <strong>con una puntuación CVSS de 9,2 (el estándar con el que se mide la gravedad de las vulnerabilidades)</strong>. Permitía a un atacante conseguir que WordPress incluyera un archivo PHP de su elección desde fuera de la carpeta del tema y, a partir de ahí, ejecutar código en remoto.</p>
<p>Hacía falta que el tema activo cumpliera cierta condición en su estructura de carpetas, algo que se da en un montón de temas muy usados. Se informó el 20 de julio y se arregló con divulgación responsable, en secreto, como debe ser. El problema es que <strong>ya había gente aprovechando la vulnerabilidad, hasta el punto de que se avisó a agencias gubernamentales de Estados Unidos</strong>. Si todavía no estás en la 7.1.2, ya estás tardando.</p>
<h3>Un malware que se reconstruye solo y 50.000 credenciales robadas</h3>
<p>Sucuri ha detectado un malware para WordPress que da un poquito de miedo. Se esconde en el <code>.user.ini</code>, en los <em>drop-ins</em> de caché como <code>advanced-cache.php</code>, en el <code>functions.php</code> de un tema falso o como plugin obligatorio (<em>mu-plugin</em>). <strong>Se instala en ocho sitios distintos y cada copia es capaz de reconstruir a las demás</strong>, así que borras una y otra la vuelve a escribir, como un bicho de muchas cabezas.</p>
<p>Casi siempre entra por temas y plugins «gratis» de procedencia dudosa. Te ahorras 60 dólares al año en un negocio con el que se supone que vas a ganar dinero y acabas regalando tu web para que mine criptomonedas. Tú verás.</p>
<p>También comenté el caso de un kit de herramientas que, a gran escala, <strong>ha robado unas 50.000 credenciales de acceso buscando copias de seguridad olvidadas</strong>, como un <code>wp-config.php.bak</code>, un <code>debug.log</code> o las contraseñas que guardan algunos plugins de correo SMTP. Ojito con lo que dejas tirado en el servidor.</p>
<p>Aproveché para hablar de Vigilante 3.0.0, que ahora intenta autoprotegerse. No es invulnerable (nada lo es, y el propio plugin tuvo su vulnerabilidad, de la que aprendí bastante y que os contaré en el blog), pero <strong>se trata de ponerle al campo todas las puertas que puedas</strong>.</p>
<h3>Elementor y un clic que crea administradores</h3>
<p>Elementor ha tenido una semana movidita. Patchstack publicó el 25 de septiembre una vulnerabilidad CSRF (falsificación de peticiones entre sitios) en las versiones 4.3.0 y 4.3.1, con un CVSS de 8,8. <strong>Un administrador con la sesión abierta que hiciera clic en un enlace manipulado podía crear, sin enterarse, otra cuenta de administrador</strong> para el atacante. Está corregida desde la 4.3.2, y con los millones de webs que lo usan todavía queda muchísima gente sin actualizar.</p>
<p>Ya que hablábamos de actualizar, os enseñé mi guía sobre por qué WordPress se actualiza sin tu permiso aunque hayas desactivado las actualizaciones automáticas. <strong>Muchos hostings tienen su propio sistema, que trabaja en un plano donde lo que pongas en WordPress les da igual</strong>, y en la guía repaso los tres casos (alojamiento gestionado, compartido con autoinstalador y servidor propio) y cómo controlar cuándo se actualiza. Mi consejo sigue siendo actualizar, y si tu hosting lo hace por ti y encima hace copia antes, te está haciendo un favor.</p>
<h3>Comunidad: WordPress al frente de la Open Website Alliance y adiós a Meetup</h3>
<p>La parte alegre. <strong>WordPress, a través de la WordPress Foundation, ha asumido la presidencia rotatoria de la Open Website Alliance</strong>, la coalición que agrupa a las organizaciones detrás de WordPress, Drupal, Joomla, TYPO3 y compañía. Se anunció el 25 de septiembre y una de sus líneas de trabajo es la Ley de Ciberresiliencia europea, sobre la que firmaron un informe en agosto. Las normativas europeas tienen su parte buena, siempre que no se vayan de olla y no frenen la innovación con la excusa de protegernos.</p>
<p>La otra noticia chula es events.wordpress.org: <strong>la comunidad va a dejar Meetup.com para usar un sistema propio integrado en WordPress.org</strong>. Ya se ha hecho formación para organizadores y el piloto está en marcha. El punto débil es que, por privacidad, probablemente no se migren las listas de asistentes y haya que animar a la gente a registrarse de nuevo. Si organizas un meetup en España o en cualquier país hispanohablante, te animo a apuntarte al programa piloto desde el equipo de comunidad en make.wordpress.org/community.</p>
<p>Y octubre viene animadísimo:</p>
<ul>
<li>WordPress Agency Forum, el 7 de octubre en Madrid, un evento para profesionales con mucho trabajo en grupo y aforo muy limitado.</li>
<li>WordPress Accessibility Day, el 7 y 8 de octubre, online y gratuito, desde las 17:00 (hora peninsular) y con el responsable de accesibilidad de GitHub abriendo el programa.</li>
<li>Meetups en Palma, Collado Villalba y León, entre otros.</li>
<li>Meetup de A Coruña el 15 de octubre, donde daré una charla sobre seguridad en WordPress con presupuesto cero.</li>
<li>WordCamp Galicia, el 16 de octubre en A Coruña, donde daré un curso gratuito de WordPress a primera hora.</li>
<li>WordCamp Valencia, el 31 de octubre, donde también tendré la suerte de dar una charla.</li>
</ul>
<h3>WooCommerce 11.2 y las nuevas obligaciones europeas</h3>
<p>WooCommerce 11.2 tenía que salir el 6 de octubre con estas novedades:</p>
<ul>
<li>Correos configurables para el derecho de desistimiento.</li>
<li>Campos de fecha en la API de pago con el selector nativo del navegador, útiles para fechas de nacimiento o de entrega.</li>
<li>Un importador CSV que por fin encuentra productos por GTIN, UPC, EAN o ISBN cuando no hay ID ni SKU.</li>
</ul>
<p>Lo del <em>checkout</em> basado en agentes de IA se ha aparcado, así que eso no romperá nada. <strong>Lo que sí conviene revisar con tu desarrollador son los filtros de fecha</strong> si tienes algún desarrollo a medida.</p>
<p>Hablando de obligaciones de la UE, he actualizado mi plugin de derecho de desistimiento para que también muestre la etiqueta de garantía legal, obligatoria desde el 27 de septiembre para quien venda bienes físicos en la Unión Europea. Revisé los plugins que había, <strong>ninguno lo daba todo gratis, así que se lo añadí al mío en una mañana</strong>. En el artículo os comparo las opciones y elegís vosotros.</p>
<h3>Lo último que he publicado en el blog</h3>
<p>También repasé algunos artículos recientes de Ayuda WordPress que creo que os pueden venir bien:</p>
<ul>
<li>Las zonas, clases y métodos de envío de WooCommerce, de lo más raro que tiene el plugin desde siempre y de lo que más me preguntan los clientes.</li>
<li>Cómo servir actualizaciones automáticas de tus propios plugins y temas desde tu web, con el sistema nativo de WordPress y sin obligar al cliente a instalar nada extra. Es lo que uso con plugins premium como Intelimerce.</li>
<li>Dónde poner el código que comparto: <code>functions.php</code> solo para lo que depende del tema, un plugin propio para lo demás y ojo con abusar de los <em>mu-plugins</em>.</li>
</ul>
<h3>Multisitio, robots.txt y un usuario que me hace trabajar</h3>
<p>Saludé a Albert Calzada, un usuario de Vigilante con una red multisitio que me ha ido avisando de cosas mejorables, y gracias a él <strong>Vigilante 3.1 se lleva bastante mejor con multisitio</strong>. Yo recomiendo multisitio para muy pocos casos (él lo usa para webs multilingües, uno de los pocos donde tiene sentido), y por eso casi ningún plugin está bien preparado para él.</p>
<p>Un ejemplo práctico: en una red multisitio con dominios mapeados, <strong>si tienes un robots.txt físico en el sitio principal, todos los sitios comparten ese mismo archivo</strong>. La solución es tirar del robots.txt virtual que WordPress genera de serie y que mi plugin SEO Visibility permite editar por sitio, igual que el llms.txt. Así lo resolví con un cliente que quería bloquear los PDF en el sitio principal pero no en los subsitios.</p>
<h3>WordPress e IA: Novamira, Presence API y un invento raro de Automattic</h3>
<p>Novamira es un plugin que conecta agentes de IA con WordPress mediante un servidor MCP (que, para entendernos, funciona como una API para agentes). Da acceso a ejecución de PHP, sistema de archivos, base de datos, WP-CLI y Gutenberg, se configura con <em>abilities</em>, <em>skills</em> en Markdown y políticas propias, y tiene versión gratuita y una Pro por 49 al año. Me han pedido compatibilidad con SEO Visibility y lo más probable es que le añada la Abilities API (Vigía ya la tiene). <strong>Casi todos los consejos de un chatbot sobre WordPress fallan porque no sabe qué hay en tu web</strong>, y con este tipo de integración sí lo sabe.</p>
<p>También comenté la Presence API, presentada en abril, que muestra en la barra de administración una etiqueta cuando un agente de IA está editando por API o MCP.</p>
<p>Y lo que más me sorprendió: Automattic ha lanzado sin hacer ruido una plataforma que convierte lo que genera un agente de IA en una web con su propia dirección, al estilo de Astro o Next.js. Lo que no entiendo es que, cuando en Twitter le preguntaron a Matt qué iba a hacer WordPress para competir con este tipo de herramientas, enlazara esto. <strong>Con todo lo que tiene WordPress ahora mismo (MCP, Abilities API, Presence API), promocionar otra cosa me parece un tiro en el pie.</strong></p>
<h3>SEO: Google, cada vez más peaje y menos tráfico</h3>
<p>Las AI Overviews ya aparecen en el 80 % de las búsquedas de marca, y sus enlaces ni siquiera llevan a la web de la marca, sino al modo IA. Además, Merchant Center ha activado automáticamente el <em>checkout</em> nativo en el modo IA y en Gemini para las tiendas compatibles con UCP (un protocolo parecido a MCP pero para comercio electrónico). Puedes vender ahí, sí, pero <strong>es como Amazon: al final vas a pagar un peaje</strong>.</p>
<p>Google ya ha empezado a pagar a unos 100 medios por usar su contenido en las vistas creadas con IA, en un programa piloto que supone en torno al 0,1 % de sus ingresos publicitarios. Migajas, pero algo es algo. Y mientras tanto sus directrices piden revisar a mano todo el contenido hecho con IA y dicen que el bueno es el humano, justo el que se está quedando sin incentivos porque ni le dan tráfico, ni enlaces, ni dinero. <strong>Pone normas como si fuera la Unión Europea, pero no hace nada por devolver el tráfico.</strong></p>
<h3>Un hackeo con spam japonés y por qué un 410 lo arregló</h3>
<p>Os conté el caso que explico en mi artículo sobre redirecciones 301, errores 404 y 410. A un cliente le hackearon la web y le llenaron Google de URLs con spam en japonés que desplazaron sus resultados de toda la vida (con los maravillosos filtros antispam de Google mirando para otro lado). Después de limpiar la web, <strong>marcar esas URLs con un 410 hizo que en pocos días desaparecieran del índice</strong> y volvieran a salir las buenas. Lo hice con SEO Visibility, que para eso lo tengo.</p>
<p>También os enseñé el nuevo apartado de «navegación agéntica» que aparece en PageSpeed Insights, que incluso mira el llms.txt, a pesar de que Google dice que pasa de él. En un artículo os explico qué mide y si tenéis que hacer algo, porque vuestros clientes os lo van a preguntar. Para medir estas señales tenéis mi analizador de visibilidad y una auditoría SEO automática más completa, y si no os llega os ofrezco una personalizada.</p>
<p>Respondiendo a un comentario sobre si ayuda mandar traducciones de plugins a WordPress.org: <strong>ayuda muchísimo</strong>, aunque yo no pueda aprobarlas, porque hace que el plugin llegue a más gente en su idioma. Y aproveché para soltar una opinión mía: tengo la sensación de que en el directorio se confía menos en los desarrolladores con apellidos que no suenan anglosajones, algo que comentan mucho los desarrolladores de la India. Llámame loco, pero se nota.</p>
<p>Vídeo completo: <a href="https://www.youtube.com/watch?v=4MWYMHWpVxU">Crónicas WordPress del 5 de octubre en YouTube</a></p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="WordPress explotado en 5 horas, malware que resucita y Google se queda tus ventas #CrónicasWordPress" width="1600" height="900" src="https://www.youtube.com/embed/4MWYMHWpVxU?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>
<p>Si quieres asistir en directo y participar con tus preguntas, suscríbete al <a href="https://www.youtube.com/@AyudaWPes">canal de Ayuda WordPress en YouTube</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/wordpress-7-1-2-a-toda-prisa-malware-de-ocho-cabezas-adios-a-meetup-y-google-cobrando-peaje-cronicaswordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tengo una página que no se si hacer Disallow, noindex o sacarla del mapa del sitio ¿importa o da igual?</title>
		<link>https://ayudawp.com/disallow-noindex-sitemap/</link>
					<comments>https://ayudawp.com/disallow-noindex-sitemap/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 08 Oct 2026 06:28:37 +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[nofollow]]></category>
		<category><![CDATA[noindex]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[robots.txt]]></category>
		<category><![CDATA[Visibility]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160480</guid>

					<description><![CDATA[Hay tres herramientas que casi todo el mundo usa como si fueran la misma cosa, el Disallow del robots.txt, la etiqueta meta noindex y el mapa del sitio, no hacen lo mismo, y mezclarlas sale caro.]]></description>
										<content:encoded><![CDATA[<p>Hay tres herramientas que casi todo el mundo usa como si fueran la misma cosa, el <code>Disallow</code> del <code>robots.txt</code>, la etiqueta meta <code>noindex</code> y el mapa del sitio (el sitemap XML ese de siempre), y no hacen lo mismo ni de lejos, así que <strong>mezclarlas sale caro</strong>.</p>
<p>Las dudas que me llegan son casi siempre estas, y las trataré de contestar todas a lo largo del artículo:</p>
<ul>
<li>Mi aviso legal y mi política de privacidad, ¿los pongo en <code>Disallow</code>, en <code>noindex</code> o en las dos cosas?</li>
<li>¿Los dejo en el mapa del sitio o los quito?</li>
<li>¿Por qué Google Search Console me dice que una página está indexada si yo la había bloqueado?</li>
<li>¿Qué hago con la página de agradecimiento, con los filtros de mi tienda o con esa entrada del blog que no pega con el resto?</li>
</ul>
<p>Si lo tienes claro no sé que haces leyendo aún, sino pues tira, que aquí se viene a aprender, y un poco a discutir también…</p>
<h2>Tres herramientas, tres preguntas distintas</h2>
<p>La forma más fácil de recordarlo es pensar en un edificio de oficinas, o un centro comercial de varias plantas, lo que mejor te encaje o apetezca.</p>
<p>Digamos que el <code>Disallow</code> es el portero, que decide quién pasa a qué plantas o departamentos.  Luego estaría el <code>noindex</code>, que sería como un cartel dentro que dice algo como «Zona privada: prohibido el paso», y terminaríamos con el mapa del sitio, que sería el directorio de secciones o departamentos, de cada planta, que no muestra todo lo que hay, sino solo lo que quieres facilitar el acceso.</p>
<p>Otro modo de explicarlo, ya el de verdad, sería así:</p>
<ul>
<li><strong>Disallow </strong>(en <code>robots.txt</code>)<strong>:</strong> responde a «¿Puede pasar por aquí el rastreador/crawler?». Google explica en su <a href="https://developers.google.com/search/docs/crawling-indexing/robots/intro" target="_blank" rel="nofollow noopener">documentación sobre el robots.txt</a> que sirve sobre todo para no saturar tu web de peticiones y <strong>que no es un mecanismo para mantener una página fuera de Google</strong>, porque si otra web enlaza esa URL Google puede indexarla igualmente, aunque no haya podido leerla.</li>
<li><strong>Noindex</strong> (en el código fuente)<strong>:</strong> responde a «¿Debe salir salir esta URL en los resultados de búsqueda?». Google entra, lee la página, encuentra la etiqueta (o la cabecera HTTP equivalente) y, según su <a href="https://developers.google.com/search/docs/crawling-indexing/block-indexing" target="_blank" rel="nofollow noopener">guía del noindex</a>, <strong>la saca por completo de los resultados</strong>, aunque otras webs la enlacen.</li>
<li><strong>Mapa del sitio</strong> (archivo <code>wp-sitemap.xml</code> o similar en la raíz del sitio)<strong>:</strong> responde a «¿Quieres que pase a ver esta URL?». Es la lista de contenidos que te gustaría que aparezcan en las SERP, y así lo plantea la <a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap" target="_blank" rel="nofollow noopener">guía de Google para crear un sitemap</a>. Que una URL esté en la lista no garantiza que se indexe, ojo, es solo tu forma de decirle cuáles prefieres.</li>
</ul>
<h2>El error más habitual: Disallow y noindex a la vez</h2>
<p>Si bloqueas una URL con <code>Disallow</code> y además le pones <code>noindex</code>, el <code>noindex</code> no sirve de nada, porque <strong>el rastreador no llega a entrar para leerlo</strong>. Es el cartel de la oficina con el portero delante, y nadie llega a verlo.</p>
<p>Lo dice la propia guía del <code>noindex</code> de Google, y es que <strong>para que funcione la página no puede estar en <code>Disallow</code> en el <code>robots.txt</code>, porque si lo está el rastreador nunca verá la regla</strong> y la página puede seguir apareciendo en los resultados si otras páginas la enlazan.</p>
<p>En Search Console lo vas a ver como el aviso <em>«<strong>Se ha indexado aunque un archivo robots.txt la tenía bloqueada</strong>»</em>, dentro del informe de indexación de páginas.</p>
<p>Google explica ahí que la página se ha indexado a pesar del bloqueo porque ha encontrado un enlace a ella en otra web, y que al estar bloqueada <strong>los snippets que salen en los resultados suelen ser muy limitados</strong>.</p>
<p><strong>Pasa lo mismo al revés</strong>. Si quieres que Google sepa que una URL es <code>noindex</code> y no le dejas rastrearla, no se va a enterar. <strong>Lo que toca es dejar el <code>noindex</code> y quitar el <code>Disallow</code></strong>, esperar a que Google vuelva a pasar y, cuando la URL ya haya salido de los resultados, decidir si además quieres ahorrarte el rastreo.</p>
<h2>Qué usar en cada caso</h2>
<p>Esta tabla resume los casos más habituales, y debajo explico los que necesitan algún matiz.</p>
<table style="border-collapse: collapse; width: 100%;" border="1" cellpadding="6">
<thead>
<tr>
<th>Caso</th>
<th>Disallow</th>
<th>Noindex</th>
<th>Mapa del sitio</th>
<th>Por qué</th>
</tr>
</thead>
<tbody>
<tr>
<td>Aviso legal, privacidad, cookies</td>
<td>No</td>
<td>No</td>
<td>Sí</td>
<td>Las legislaciones piden que estén disponibles no que salgan en Google</td>
</tr>
<tr>
<td>Envíos, devoluciones, garantía</td>
<td>No</td>
<td>No</td>
<td>Sí</td>
<td>Para el marcado de políticas de envío y devolución Google pide que la página no esté bloqueada por <code>robots.txt</code>, <code>noindex</code> ni requiera inicio de sesión</td>
</tr>
<tr>
<td>Quiénes somos, contacto</td>
<td>No</td>
<td>No</td>
<td>Sí</td>
<td>Google cita la página «Acerca de» y las páginas de autor entre lo que ayuda al lector a fiarse de un sitio (EEAT)</td>
</tr>
<tr>
<td>Carrito, pago, mi cuenta</td>
<td>No</td>
<td>Sí (WooCommerce ya lo pone)</td>
<td>No</td>
<td>Con un <code>Disallow</code> Google no llegaría a ver el <code>noindex</code></td>
</tr>
<tr>
<td>Filtros y ordenación de la tienda</td>
<td>Sí</td>
<td>Solo si ya se han indexado, y antes del Disallow</td>
<td>No</td>
<td>Google recomienda bloquear el rastreo de estas URLs si no las necesitas indexadas</td>
</tr>
<tr>
<td>Página de agradecimiento</td>
<td>No</td>
<td>Sí</td>
<td>No</td>
<td>No aporta nada en los resultados y solo le interesa a quien acaba de comprar o suscribirse</td>
</tr>
<tr>
<td>Oferta, sorteo o empleo caducados</td>
<td>No</td>
<td>Depende</td>
<td>No</td>
<td>Lo normal es redirigir (301) o borrar (<a href="https://ayudawp.com/contenido-borrado-301-410/" target="_blank" rel="noopener">410</a>)</td>
</tr>
<tr>
<td>Entrada de blog que no pega con el resto</td>
<td>No</td>
<td>Depende</td>
<td>Depende</td>
<td>Depende de si aporta algo a quien lo lea</td>
</tr>
<tr>
<td>Contenido duplicado con canonical a otra URL</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>En el mapa del sitio va la URL preferida, y el <code>noindex</code> no es la forma de elegir la canónica</td>
</tr>
<tr>
<td>Web de pruebas</td>
<td>No</td>
<td>Sí, o mejor una contraseña</td>
<td>No</td>
<td>El <code>Disallow</code> no la saca de Google, y para eso la propia Google habla de <code>noindex</code> o de protegerla con contraseña</td>
</tr>
</tbody>
</table>
<h3>Los filtros y la ordenación de una tienda</h3>
<p>Los filtros de WooCommerce (color, talla, precio…) generan una URL distinta por cada combinación, con parámetros como <code>filter_</code>, <code>min_price</code>, <code>max_price</code> u <code>orderby</code>.</p>
<p>En su guía sobre <a href="https://developers.google.com/crawling/docs/faceted-navigation" target="_blank" rel="nofollow noopener">navegación por facetas</a> <strong>Google recomienda que si no necesitas esas URLs indexadas bloquees su rastreo</strong> con el <code>robots.txt</code>, y del <code>canonical</code> y del <code>nofollow</code> dice que suelen ser menos efectivos a largo plazo. Un ejemplo sencillo sería este:</p>
<pre>User-agent: *
Disallow: /*?*filter_
Disallow: /*?*min_price=
Disallow: /*?*max_price=
Disallow: /*?*orderby=</pre>
<p>Si esas URLs ya están indexadas el <code>Disallow</code> no las va a sacar de Google, así que <strong>primero se pone el <code>noindex</code> , y cuando han desaparecido se bloquea</strong>. Y pruébalo siempre antes, que un patrón mal escrito puede llevarse por delante más URLs de las que querías.</p>
<p>El <a href="https://herramientas.ayudawp.com/robots-txt/" target="_blank" rel="ugc noopener">validador de robots.txt</a> comprueba la sintaxis, y después conviene vigilar el informe de indexación de páginas de Search Console por si empiezan a aparecer URLs bloqueadas que no esperabas.</p>
<h3>Ofertas, sorteos y empleos que ya han caducado</h3>
<p>Si la página tiene enlaces o visitas, lo normal es redirigirla a la oferta vigente o a la categoría, y si no tiene nada que aportar, borrarla y dejar que dé un 410 o un 404.</p>
<p>Aquí el <code>noindex</code> solo tiene sentido si la página debe seguir existiendo para quien ya la conoce, como el histórico de ganadores de un sorteo. Lo tienes explicado con detalle en el artículo sobre <a href="https://ayudawp.com/contenido-borrado-301-410/" target="_blank" rel="ugc noopener">qué hacer con la URL de un contenido borrado</a>.</p>
<h3>La entrada de blog que no tiene mucho que ver con el resto de tu web</h3>
<p>Este es el caso más discutible, y lo siguiente es mi opinión y no una regla o algoritmo de Google. De hecho ya te anticipo que, que yo sepa, Google no dice en ningún sitio que una entrada totalmente ajena a la temática habitual perjudique al resto de tu web, lo que sí pregunta en su <a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" target="_blank" rel="nofollow noopener">guía de contenido útil</a> es si tu sitio tiene un propósito o un enfoque principal.</p>
<p>Tampoco te hagas ilusiones con borrar, porque esa misma guía avisa de que quitar mucho contenido antiguo para que el sitio parezca más fresco no funciona.</p>
<p>Mi criterio es que, si la entrada enseña de verdad a las personas del equipo, cuenta cómo trabajáis o qué os importa, funciona como una extensión de tu página de «Quiénes somos», así que lo dejaría indexable y, solo que si no quieres tampoco reforzarla, la dejes fuera del mapa del sitio.</p>
<p>Si es una entrada de blog puramente de relleno con tres fotos y dos líneas, la mejoraría, la fusionaría con otra o le pondría <code>noindex</code> y arreando. Y si al final la borras, pues que vaya con redirección o un bonito 410.</p>
<h3>Contenido duplicado con canonical a otra URL</h3>
<p>Cuando la misma página existe en dos URLs (un artículo que re-publicas en otro sitio, una variante de una landing), <strong>en el mapa del sitio va la URL que prefieres y no la otra</strong>.</p>
<p>Google lo recuerda en su <a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls" target="_blank" rel="nofollow noopener">guía de canonicalización</a>, donde pide no indicar una URL en el mapa del sitio y otra distinta como canónica para la misma página. Y para elegir la canónica tampoco uses noindex, porque según esa misma guía bloquearía la página por completo en la búsqueda.</p>
<p>Si tu plugin de SEO no saca solo del mapa del sitio las páginas con canonical a otra URL (no todos lo hacen), sácala tú a mano.</p>
<h2>¿Y qué hacemos con la mierda esa de las páginas legales, las indexamos o no?</h2>
<p>Para empezar, <strong>ninguna norma te obliga a indexar el aviso legal, la política de privacidad o la de cookies, pero tampoco nada te lo prohíbe</strong>, lo que piden las legislaciones y reglamentos es que el usuario las vea fácilmente, que no las ocultes.</p>
<p>La LSSI, en su <a href="https://www.boe.es/buscar/act.php?id=BOE-A-2002-13758" target="_blank" rel="nofollow noopener">artículo 10</a>, pide que los datos del titular de la web estén disponibles «de forma permanente, fácil, directa y gratuita», y la <a href="https://lssi.digital.gob.es/lssi/la-ley/preguntas-frecuentes" target="_blank" rel="nofollow noopener">página oficial de la ley</a> aclara que basta con que sean accesibles mediante enlaces visibles con títulos claros, como el típico «quiénes somos».</p>
<p>Con el RGPD pasa algo parecido, y la Agencia Española de Protección de Datos habla en su <a href="https://www.aepd.es/guias/informe-politicas-de-privacidad-adaptacion-rgpd.pdf" target="_blank" rel="nofollow noopener">informe sobre políticas de privacidad</a> de información de fácil acceso, con enlaces en el pie de página y al final de los formularios.</p>
<p><strong>Ni la ley ni el informe de la AEPD mencionan a los buscadores.</strong> Eso sí, yo no soy abogado, así que si tu caso tiene alguna particularidad consúltalo con quien te lleve lo legal.</p>
<p>¿Y Google? En su documentación no he encontrado ninguna regla específica para las páginas legales, así que aquí no hay una verdad oficial a la que agarrarse y toca razonarlo con lo que hace cada herramienta.</p>
<ul>
<li><strong>Disallow:</strong> no sirve para nada, porque no las saca de Google (si alguien las enlaza se pueden indexar igualmente) y encima impediría leer un <code>noindex</code>.</li>
<li><strong>noindex:</strong> las quitaría de los resultados, pero tus visitantes las seguirían encontrando en el enlace del pie, que es lo que pide la ley. Puedes hacerlo sin incumplir nada de lo que he leído, aunque tampoco ganas nada.</li>
<li><strong>Mapa del sitio:</strong> si las dejas indexables, van como cualquier otra página normal.</li>
</ul>
<p>Mi consejo, y es solo eso, un consejo, es<strong> ni Disallow ni noindex</strong>, y si las tienes ahora mismo en <code>noindex</code> tampoco es ningún drama, de hecho yo mi me acordaba y las tenía así de siempre.</p>
<p>Queda el argumento del E-E-A-T, que es el otro que se oye mucho. Google dice en su guía de contenido útil que el E-E-A-T en sí mismo no es un factor de posicionamiento concreto, y cuando habla de lo que ayuda a fiarse de un sitio cita las páginas de autor y la de «Acerca de», sin nombrar las legales.</p>
<p><strong>Lo que sí suma es que se vea quién está detrás de la web</strong> y, en una tienda, cómo son sus envíos y sus devoluciones, y por eso esas páginas van indexables en la tabla.</p>
<h2>Aplicarlo en WordPress, a mano o con plugin</h2>
<p><strong>El <code>Disallow</code> va en el <code>robots.txt</code>.</strong> WordPress genera uno virtual que solo bloquea <code>/wp-admin/</code> (dejando pasar el <code>admin-ajax.php</code>).</p>
<p>Puedes ampliarlo desde un plugin de SEO, y varios traen editor para ello (Visibility, el <del>mejor</del> mío incluido), o subiendo tú un archivo <code>robots.txt</code> real a la raíz de tu web.</p>
<p>Si no quieres escribirlo a mano, el generador de <a href="https://herramientas.ayudawp.com/robots-txt/" target="_blank" rel="ugc noopener">esa misma herramienta</a> te crea uno con las carpetas y los bots que elijas.</p>
<p>Ah, y ojo con la opción «Pedir a los motores de búsqueda que no indexen este sitio» de los ajustes de lectura de tu WordPress, porque mucha gente cree que mete un <code>Disallow: /</code> y lo que hace desde WordPress 5.3 es poner <code>noindex</code> a todo el sitio, como <a href="https://ayudawp.com/wordpress-5-3-cambiara-modo-evitar-indexado-buscadores/" target="_blank" rel="ugc noopener">conté en su día</a>.</p>
<p><strong>El <code>noindex</code> se pone por página</strong>, y para ello Yoast SEO, Rank Math, All in One SEO, SEOPress y Visibility tienen <strong>una casilla en el editor de cada entrada o página</strong>.</p>
<p><a href="https://ayudawp.com/?attachment_id=160491" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160491 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/visibility-noindex-sitemap-nofollow-wp-editor-1200x506.jpg" alt="" width="1200" height="506" srcset="https://ayudawp.com/wp-content/uploads/2026/10/visibility-noindex-sitemap-nofollow-wp-editor-1200x506.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/visibility-noindex-sitemap-nofollow-wp-editor-768x324.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/visibility-noindex-sitemap-nofollow-wp-editor-1536x648.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/10/visibility-noindex-sitemap-nofollow-wp-editor.jpg 1598w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Si prefieres hacerlo a mano este código se lo añade a las páginas que le indiques:</p>
<pre>// Añadir noindex a páginas específicas
add_filter( 'wp_robots', 'ayudawp_noindex_paginas_concretas' );

function ayudawp_noindex_paginas_concretas( $robots ) {
    // Reemplaza los slugs con las páginas que quieras dejar fuera de los resultados
    if ( is_page( array( 'gracias', 'pedido-recibido' ) ) ) {
        $robots['noindex'] = true;
    }

    return $robots;
}</pre>
<p>Y con el mapa del sitio hay que ir con más cuidado, porque <strong>el nativo de WordPress no sabe nada de <code>noindex</code></strong> y lista todas las páginas publicadas (salvo que uses Visibility, que se integra con él y te deja personalizar eso y más cosas).</p>
<p>Por lo que se ve en el código, WooCommerce pone <code>noindex</code> al carrito, al pago y a mi cuenta, pero no las quita del mapa del sitio, eso sería cosa tuya, así que compruébalo abriendo <code>/wp-sitemap-posts-page-1.xml</code> en tu web.</p>
<p style="color: #cc0000;"><a href="https://ayudawp.com/?attachment_id=160490" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160490 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/10/sitemap-cart-checkout-account-1200x1203.jpg" alt="" width="1200" height="1203" srcset="https://ayudawp.com/wp-content/uploads/2026/10/sitemap-cart-checkout-account-1200x1203.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/10/sitemap-cart-checkout-account-150x150.jpg 150w, https://ayudawp.com/wp-content/uploads/2026/10/sitemap-cart-checkout-account-768x770.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/10/sitemap-cart-checkout-account-1532x1536.jpg 1532w, https://ayudawp.com/wp-content/uploads/2026/10/sitemap-cart-checkout-account.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Los plugins de SEO (Yoast SEO, Rank Math, All in One SEO, SEOPress y Visibility) pueden quitar del mapa del sitio lo que marcas como <code>noindex</code>. Para sacar páginas concretas sin ponerles <code>noindex</code>, Rank Math y All in One SEO tienen una lista de exclusión, Visibility una casilla en cada entrada (la puedes ve en la captura de más arriba, y Yoast solo lo permite por código.</p>
<p>Con el mapa nativo, a mano si tu plugin no lo contempla, sería así:</p>
<pre>// Dejar fuera del mapa del sitio de WordPress páginas específicas
add_filter( 'wp_sitemaps_posts_query_args', 'ayudawp_excluir_paginas_del_sitemap', 10, 2 );

function ayudawp_excluir_paginas_del_sitemap( $args, $post_type ) {
    if ( 'page' !== $post_type ) {
        return $args;
    }

    // Reemplaza lo siguiente con los IDs de las páginas que quieras dejar fuera
    $excluded = array( 123, 456 );

    $args['post__not_in'] = array_merge( (array) ( $args['post__not_in'] ?? array() ), $excluded );

    return $args;
}</pre>
<p>Si dudas de dónde meter estos fragmentos, lo tienes explicado en el artículo sobre <a href="https://ayudawp.com/pegar-codigos/" target="_blank" rel="ugc noopener">dónde pegar códigos PHP, JS y CSS en WordPress</a>.</p>
<h2>Comprobarlo en Search Console</h2>
<p>Con la herramienta de inspección de URLs ves cómo ha rastreado e indexado Google una página concreta, y en el informe de indexación de páginas te salen los avisos que más te interesan aquí.</p>
<ul>
<li><strong>«Se ha indexado aunque un archivo robots.txt la tenía bloqueada»:</strong> es el error de Disallow más noindex del que hablábamos, y se arregla quitando el Disallow.</li>
<li><strong>«Página alternativa con etiqueta canónica adecuada»:</strong> es lo normal en las páginas que apuntan con su canonical a otra, y lo que quieres ver.</li>
<li><strong>«Duplicada: Google ha elegido una versión canónica diferente a la del usuario»:</strong> Google no ha hecho caso a tu canonical, así que revisa que el mapa del sitio, tus enlaces internos y la propia etiqueta apunten todos a la misma URL.</li>
</ul>
<h2>Tres preguntas antes de tocar nada</h2>
<p>Cuando dudes con una página, hazte estas preguntas en este orden.</p>
<ol>
<li>¿Quiero que Google pueda entrar a verla? Si no, <code>Disallow</code>, pero solo si no necesitas que lea un <code>noindex</code>.</li>
<li>¿Quiero que la enseñe en los resultados? Si no, <code>noindex</code>, y con la puerta abierta para que pueda leerlo.</li>
<li>¿Quiero recomendársela? Si sí, al mapa del sitio y con la URL que prefieres.</li>
</ol>
<p>Si tienes alguna página que no sabes en cuál de estos casos encaja, me tienes ahí abajo, en los comentarios, y la miramos.</p>
<p>Si lo que te preocupa es la web al completo pásala por la <a href="https://herramientas.ayudawp.com/auditoria-seo/" target="_blank" rel="ugc noopener">auditoría SEO gratuita</a>, que revisa entre otras cosas el <code>robots.txt</code>, los mapas del sitio y la indexación, y si después te siguen quedando dudas puedes pedirme un análisis más completo al final del informe, también gratis.</p>
<p>Por si quieres seguir con el tema, tengo más escrito sobre los <a href="https://ayudawp.com/archivos-fecha-seo/" target="_blank" rel="ugc noopener">archivos por fecha</a> y los <a href="https://ayudawp.com/indexar-archivos-autor/" target="_blank" rel="ugc noopener">archivos de autor</a>, sobre cómo <a href="https://ayudawp.com/mapas-del-sitio-xml-wordpress/" target="_blank" rel="ugc noopener">configurar el mapa del sitio nativo</a>, sobre el <a href="https://ayudawp.com/robots-txt-wordpress-multisitio/" target="_blank" rel="ugc noopener">robots.txt en multisitio</a> y sobre si te conviene <a href="https://ayudawp.com/bloquear-bots-ia/" target="_blank" rel="ugc noopener">bloquear a los bots de IA</a>.</p>
<p>Para todo lo demás, me preguntas ahí abajo en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/disallow-noindex-sitemap/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>