<?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>Tue, 31 Mar 2026 15:39:22 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://ayudawp.com/wp-content/uploads/2021/05/ayudawp135.jpg</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>Contraseñas de aplicación de WordPress ¿qué son, sirven de algo?</title>
		<link>https://ayudawp.com/application-passwords/</link>
					<comments>https://ayudawp.com/application-passwords/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[Contraseñas de aplicación]]></category>
		<category><![CDATA[Experto]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158787</guid>

					<description><![CDATA[Esta guía cubre todo lo que necesitas saber sobre las contraseñas de aplicación de WordPress: qué son, cómo funcionan, para qué sirven, cómo crearlas (desde el panel, con PHP y con WP-CLI) y, sobre todo, los riesgos que tienen y cómo controlarlos.]]></description>
										<content:encoded><![CDATA[<p>Todos conocemos <a href="https://ayudawp.com/tag/404/" target="_blank" rel="noopener ugc">el 404</a>, <a href="https://ayudawp.com/tag/403/" target="_blank" rel="noopener ugc">el 403</a>, incluso <a href="https://ayudawp.com/402-payment-required/" target="_blank" rel="noopener ugc">el 402</a>, y también las contraseñas de WordPress y el login de toda la vida. Pero hay una funcionalidad que lleva en WordPress desde la versión 5.6 (diciembre de 2020) y que la mayoría de usuarios ni sabe que existe, me refiero a las contraseñas de aplicación (<code>application passwords</code>).</p>
<p>Si te dedicas al desarrollo con WordPress o gestionas webs de clientes <strong>las contraseñas de aplicación te van a interesar</strong>. Y si no las usas para nada también te interesa saber que <strong>están ahí activadas por defecto, con algunas implicaciones de seguridad</strong> que merece la pena conocer.</p>
<p>Esta guía cubre <strong>todo lo que necesitas saber sobre las contraseñas de aplicación de WordPress</strong>: qué son, cómo funcionan, para qué sirven, cómo crearlas (desde el panel, con PHP y con WP-CLI) y, sobre todo, los riesgos que tienen y cómo controlarlos.</p>
<h2>Qué son las contraseñas de aplicación</h2>
<p>Una contraseña de aplicación es <strong>una credencial que WordPress genera para que aplicaciones, scripts o servicios externos se identifique a través de la <a href="https://developer.wordpress.org/rest-api/" target="_blank" rel="nofollow noopener">REST API</a></strong> (y también contra XML-RPC, aunque no debería) sin necesitar la contraseña real del usuario.</p>
<p>Lo más relevante:</p>
<ul>
<li>Son contraseñas de <strong>24 caracteres</strong> (letras y números) que WordPress muestra agrupadas en bloques de 4 para que sean más legibles. Los espacios se ignoran al validarlas.</li>
<li>Están <strong>vinculadas a un usuario concreto y heredan sus permisos</strong>. Si la crea un administrador la aplicación tendrá acceso de administrador.</li>
<li>No sirven para entrar en wp-admin, <strong>solo funcionan para peticiones a la API</strong>.</li>
<li>Se almacenan como hash en la tabla <code>usermeta</code>, no en texto plano.</li>
<li><strong>Solo se muestran una vez</strong>, en el momento de crearlas. Si la pierdes toca generar una nueva.</li>
<li>Puedes crear varias para un mismo usuario, una por cada aplicación que necesite acceso.</li>
<li>Se pueden <strong>anular individualmente</strong>.</li>
<li>Por defecto <strong>solo funcionan con HTTPS</strong>.</li>
</ul>
<p>Vienen incluidas en el núcleo de WordPress, no hace falta instalar nada. Si tu sitio funciona con WordPress 5.6 o superior (es decir, prácticamente cualquier instalación actualizada) ya las tienes disponibles.</p>
<h2>Cómo funcionan por dentro</h2>
<p>Cuando una aplicación hace una petición a la REST API envía las credenciales mediante <strong>HTTP Basic Authentication</strong> (<a href="https://datatracker.ietf.org/doc/html/rfc7617" target="_blank" rel="nofollow noopener">RFC 7617</a>). La cabecera <code>Authorization</code> lleva el nombre de usuario y la contraseña de aplicación codificados en Base64.</p>
<p>WordPress recibe esa petición, detecta que viene por una ruta de API y comprueba la contraseña contra los hashes almacenados en <code>usermeta</code>. Si coincide verifica la petición con los permisos del usuario asociado.</p>
<p>Un detalle importante a tener en cuenta es que WordPress solo intenta validar contraseñas de aplicación en contextos que considera «<strong>de aplicación</strong>«, que por defecto son la REST API y XML-RPC. Si una petición llega por otra vía no se procesan. Los desarrolladores pueden ampliar esto con el filtro <code>application_password_is_api_request</code>.</p>
<h2>¿Sirven para algo?</h2>
<p>Pues sí, de hecho si eres desarrollador o trabajas en una agencia que gestiona varias webs WordPress aquí es donde las contraseñas de aplicación empiezan a tener sentido.</p>
<h3>Despliegues y automatización (CI/CD)</h3>
<p>Scripts que publican contenido, limpian <code>transients</code> o gestionan plugins tras un despliegue se pueden <strong>identificar contra la REST API con una contraseña de aplicación en lugar de forzar en el código credenciales de usuario</strong>. Si trabajas con flujos de <a href="https://campus.ayudawp.com/curso-avanzado-de-programacion-profesional-para-wordpress/" target="_blank" rel="noopener ugc">integración y despliegue continuo</a> esto simplifica mucho la gestión de accesos.</p>
<h3>Paneles de gestión para agencias</h3>
<p>Si administras decenas de sitios de clientes puedes construir un panel propio que consulte el estado de cada web, lance actualizaciones o gestione usuarios en bloque, todo identificado con contraseñas de aplicación específicas para cada sitio.</p>
<h3>Sincronización entre sitios</h3>
<p>Mover contenido entre un entorno de staging y producción o sincronizar posts entre varios WordPress de una red, sin compartir contraseñas de usuario reales.</p>
<h3>WordPress headless</h3>
<p>Cuando usas WordPress como backend y el frontend va con Next.js, Nuxt u otro framework, las peticiones identificadas a la REST API necesitan credenciales. Las contraseñas de aplicación son la forma nativa de resolverlo.</p>
<h3>Integraciones WooCommerce a medida</h3>
<p>Sincronizar inventario con un ERP propio, gestionar pedidos desde herramientas internas o conectar sistemas de facturación. Cada integración puede tener su propia contraseña con acceso limitado al perfil necesario.</p>
<h3>Scripts de mantenimiento</h3>
<p>Limpieza de revisiones, comprobación de salud del sitio, informes periódicos automatizados, todo lo que un script necesita hacer de forma programada contra la API.</p>
<h3>Apps móviles propias</h3>
<p>Si desarrollas una app para que los clientes de una agencia publiquen contenido o gestionen sus webs sin entrar en <code>wp-admin</code>, la identificación con contraseñas de aplicación es la solución nativa.</p>
<h3>Testing automatizado</h3>
<p>Son muy prácticas para pruebas contra la REST API en entornos de desarrollo, sin tener que  arriesgar con credenciales reales. También funcionan para conectar servicios externos como Zapier o Make, o para hacer pruebas con Postman, pero esos son casos más puntuales.</p>
<p>La ventaja común a todos estos escenarios es triple:</p>
<ol>
<li>No compartes tu contraseña real</li>
<li>Puedes anular el acceso de un script concreto sin tocar nada más</li>
<li>La automatización no se bloquea por el 2FA</li>
</ol>
<h2>Cómo crear y gestionar contraseñas de aplicación</h2>
<p>Hay tres formas, desde el panel de administración, con PHP y con WP-CLI.</p>
<h3>Desde el perfil de usuario (wp-admin)</h3>
<p>Es la forma más directa y la que usará cualquier usuario que necesite crear una.</p>
<ol>
<li>Entra en <strong>Usuarios → Perfil</strong> (o edita el perfil de otro usuario si eres administrador).</li>
<li>Baja hasta la sección <strong>Contraseñas de aplicación</strong>.</li>
<li>Escribe un nombre descriptivo para identificar la aplicación (por ejemplo: «Script para producción», «Panel de agencia», «Aplicación móvil»).</li>
<li>Pulsa en «<strong>Añadir nueva contraseña de aplicación</strong>»</li>
<li><strong>Copia la contraseña inmediatamente</strong> porque no se vuelve a mostrar.</li>
</ol>
<p><img fetchpriority="high" decoding="async" class="sombra alignnone wp-image-158796 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/nueva-contrasena-aplicacion-wordpress-1200x298.jpg" alt="nueva contraseña aplicacion wordpress" width="1200" height="298" srcset="https://ayudawp.com/wp-content/uploads/2026/04/nueva-contrasena-aplicacion-wordpress-1200x298.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/nueva-contrasena-aplicacion-wordpress-768x191.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/nueva-contrasena-aplicacion-wordpress-1536x382.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/nueva-contrasena-aplicacion-wordpress.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<p>En esa misma sección puedes <strong>ver las contraseñas creadas</strong>, cuándo se usaron por última vez, desde qué IP y anularlas individualmente.</p>
<p><img decoding="async" class="sombra alignnone wp-image-158797 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/application-password-wordpress-1200x658.jpg" alt="application password wordpress" width="1200" height="658" srcset="https://ayudawp.com/wp-content/uploads/2026/04/application-password-wordpress-1200x658.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/application-password-wordpress-768x421.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/application-password-wordpress-1536x842.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/application-password-wordpress.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<h3>Con PHP</h3>
<p>Desde WordPress 5.6 tienes la clase <code>WP_Application_Passwords</code> para gestionar contraseñas de aplicación por código. Esto es lo que usarías en un plugin o en un <code>mu-plugin</code> para automatizar la creación.</p>
<pre>// Crear una contraseña de aplicación para el usuario con ID 1
$user_id = 1;
$app_name = 'Mi script de despliegue';

$result = WP_Application_Passwords::create_new_application_password(
    $user_id,
    array( 'name' =&gt; $app_name )
);

if ( is_wp_error( $result ) ) {
    // Error al crear la contraseña
    error_log( $result-&gt;get_error_message() );
} else {
    // $result[0] = la contraseña en texto plano (solo ahora)
    // $result[1] = array con los datos almacenados (uuid, name, etc.)
    $password = $result[0];
    $app_data = $result[1];
    
    // Guarda $password de forma segura, no se puede recuperar después
}
</pre>
<p>Para listar las contraseñas de un usuario:</p>
<pre>// Obtener todas las contraseñas de aplicación de un usuario
$passwords = WP_Application_Passwords::get_user_application_passwords( $user_id );

foreach ( $passwords as $app_pass ) {
    // $app_pass['name'] = nombre de la aplicación
    // $app_pass['uuid'] = identificador único
    // $app_pass['created'] = timestamp de creación
    // $app_pass['last_used'] = timestamp del último uso
    // $app_pass['last_ip'] = última IP que la usó
}
</pre>
<p>Para anular una contraseña concreta por su UUID:</p>
<pre>// Anular una contraseña de aplicación específica
$uuid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
$deleted = WP_Application_Passwords::delete_application_password( $user_id, $uuid );

if ( is_wp_error( $deleted ) ) {
    error_log( 'No se pudo anular: ' . $deleted-&gt;get_error_message() );
}
</pre>
<p>Y para anular todas las de un usuario de golpe:</p>
<pre>// Anular todas las contraseñas de aplicación de un usuario
WP_Application_Passwords::delete_all_application_passwords( $user_id );
</pre>
<h3>Con WP-CLI</h3>
<p>Si gestionas el servidor por SSH, WP-CLI te permite hacer lo mismo desde el terminal:</p>
<pre># Crear una contraseña para el usuario con ID 1
wp user application-password create 1 "Script de despliegue"

# Crear y mostrar solo la contraseña (útil para scripts)
wp user application-password create 1 "Script CI" --porcelain

# Listar contraseñas con detalle
wp user application-password list 1 --fields=uuid,name,created,last_used,last_ip

# Anular una contraseña por UUID
wp user application-password delete 1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
</pre>
<p>La documentación completa está en la <a href="https://developer.wordpress.org/cli/commands/user/application-password/" target="_blank" rel="nofollow noopener">referencia de WP-CLI</a>.</p>
<h2>Ejemplo práctico: autenticación con la REST API</h2>
<p>Una vez que tienes una contraseña de aplicación usarla es sencillo. Las peticiones van con <strong>HTTP Basic Auth</strong>, pasando el nombre de usuario y la contraseña de aplicación.</p>
<h3>Leer datos del usuario autenticado</h3>
<pre>curl --user "tuusuario:xxxx xxxx xxxx xxxx xxxx xxxx" \
  https://tusitio.com/wp-json/wp/v2/users/me
</pre>
<h3>Crear una entrada nueva</h3>
<pre>curl --user "tuusuario:xxxx xxxx xxxx xxxx xxxx xxxx" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"title":"Entrada de prueba","content":"Creada desde la API","status":"draft"}' \
  https://tusitio.com/wp-json/wp/v2/posts
</pre>
<h3>Listar los ajustes del sitio</h3>
<pre>curl --user "tuusuario:xxxx xxxx xxxx xxxx xxxx xxxx" \
  https://tusitio.com/wp-json/wp/v2/settings
</pre>
<p>Los espacios en la contraseña se pueden incluir o no, WordPress los elimina antes de validar. Si usas la contraseña en un script, es más práctico quitarlos.</p>
<h3>Lo mismo con PHP</h3>
<p>Si prefieres hacerlo desde PHP con la HTTP API de WordPress (por ejemplo, desde otro WordPress o desde un script):</p>
<pre>// Petición identificada a la REST API de otro sitio WordPress
$response = wp_remote_get(
    'https://otrowp.com/wp-json/wp/v2/posts',
    array(
        'headers' =&gt; array(
            'Authorization' =&gt; 'Basic ' . base64_encode( 'usuario:xxxxxxxxxxxxxxxxxxxxxx' ),
        ),
        'timeout' =&gt; 10,
    )
);

if ( ! is_wp_error( $response ) &amp;&amp; 200 === wp_remote_retrieve_response_code( $response ) ) {
    $posts = json_decode( wp_remote_retrieve_body( $response ), true );
    // Procesar los posts
}
</pre>
<h2>Riesgos de usar las contraseñas de aplicación de WordPress</h2>
<p>Las contraseñas de aplicación son una buena solución para la identificación programática, pero tienen algunos puntos chungos que conviene que tengas claros.</p>
<h3>Se saltan el 2FA, los CAPTCHA y los límites de login</h3>
<p>Este es el más gordo. Cuando WordPress detecta que una petición viene por la API con una contraseña de aplicación la identifica directamente, la da por buena. No pide doble verificación, no muestra CAPTCHA y no aplica los límites de intentos de acceso que tengas configurados. Es lógico, porque una máquina no puede resolver un CAPTCHA, pero significa que <strong>si alguien consigue una contraseña de aplicación tiene acceso directo y no le afecta ninguna medida de seguridad para el inicio de sesión</strong>.</p>
<h3>Todos los usuarios pueden crearlas</h3>
<p>Por defecto, <strong>cualquier usuario registrado puede generar contraseñas de aplicación</strong> desde su perfil, incluidos los suscriptores. En la mayoría de los sitios los suscriptores no necesitan acceso a la API, así que dejarles crear credenciales persistentes para ello es <strong>dejar abierta una posible vía de ataque</strong> innecesaria.</p>
<h3>No caducan</h3>
<p>Una contraseña de aplicación es válida hasta que alguien la revoque manualmente. <strong>No hay caducidad automática ni recordatorios de renovación</strong>. Si creas una, la usas tres meses para un proyecto y luego te olvidas de ella, seguirá funcionando indefinidamente.</p>
<h3>No tienen permisos selectivos</h3>
<p>La contraseña hereda los permisos completos del usuario que la crea. <strong>No puedes limitar una contraseña de aplicación</strong> para que solo pueda leer entradas pero no crearlas, o para que solo acceda a ciertos <code>endpoints</code>. Si la crea un administrador tiene acceso de administrador a toda la API.</p>
<h3>Fuerza bruta contra la API</h3>
<p>Aunque las contraseñas son largas (24 caracteres alfanuméricos) la protección contra fuerza bruta depende de lo que tengas configurado a nivel de servidor o de plugin de seguridad. WordPress por defecto no limita los intentos de identificación en la REST API de la misma forma que limita los intentos de login en <code>wp-login.php</code>.</p>
<h3>Funcionan también sobre XML-RPC</h3>
<p>Las contraseñas de aplicación no solo autentican peticiones a la REST API, también sirven para XML-RPC. Y XML-RPC es un protocolo que arrastra problemas de seguridad desde hace años: permite ataques de fuerza bruta amplificados (con <code>system.multicall</code> puedes probar cientos de contraseñas en una sola petición), es vector habitual de ataques DDoS y ofrece una superficie de ataque que la REST API ya cubre con más control.</p>
<p>La mayoría de los sitios WordPress actuales no necesitan XML-RPC para nada. Tenía sentido cuando se usaban clientes de escritorio como Windows Live Writer o la app móvil antigua, pero hoy la REST API lo sustituye en todos los escenarios. Sin embargo, XML-RPC sigue activado por defecto en WordPress, y las contraseñas de aplicación le dan una vía de identificación adicional.</p>
<p>Si no usas XML-RPC (y casi seguro que no lo usas) lo más sensato es desactivarlo. Plugins como <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilant</a> lo bloquean por defecto nada más activarlo, sin que tengas que configurar nada. También puedes hacerlo manualmente añadiendo <code>add_filter( 'xmlrpc_enabled', '__return_false' );</code> a un mu-plugin.</p>
<h3>Entonces, ¿son un riesgo real?</h3>
<p>Depende del contexto. Algunos plugins de seguridad como <a href="https://getshieldsecurity.com/blog/wordpress-application-passwords/" target="_blank" rel="nofollow noopener">Shield Security</a> argumentan que si nunca creas una contraseña de aplicación el sistema no intenta validar por esa vía, así que el riesgo sería mínimo. Y tienen razón en parte, porque si no las usas no añaden posibilidad de ataque.</p>
<p>Pero <strong>el problema es que están activadas por defecto para todos los usuarios</strong>, y no todo el mundo sabe qué son ni qué implicaciones tiene crearlas. Para un sitio con pocos usuarios de confianza no supone un drama, para uno con registro abierto y cientos de suscriptores es un punto que vale la pena controlar.</p>
<h2>Buenas prácticas de seguridad</h2>
<p><strong>Si vas a usar contraseñas de aplicación</strong> sigue estas pautas:</p>
<ul>
<li><strong>Una contraseña por aplicación:</strong> Así puedes anular el acceso de una integración sin afectar a las demás.</li>
<li><strong>Mínimo privilegio:</strong> No crees la contraseña desde una cuenta de administrador si la aplicación solo necesita leer o editar posts. Usa un usuario con perfil de editor o autor.</li>
<li><strong>Revisa periódicamente:</strong> Comprueba las contraseñas activas de cada usuario y revoca las que ya no se usen.</li>
<li><strong>Guarda las contraseñas de forma segura:</strong> Trátalas como cualquier otra credencial sensible: gestor de contraseñas, variables de entorno, nunca en el código fuente.</li>
<li><strong>Monitoriza el uso:</strong> WordPress registra la fecha y la IP del último uso de cada contraseña. Si ves algo raro, revoca.</li>
<li><strong>Limita quién puede crearlas:</strong> Si tus usuarios no necesitan acceso a la API, desactívalas para sus perfiles.</li>
</ul>
<h2>Cómo desactivar o controlar las contraseñas de aplicación</h2>
<p>Si has decidido que no las necesitas, o que quieres limitar quién puede usarlas, tienes varias opciones.</p>
<h3>Desactivarlas para todo el sitio (PHP)</h3>
<p>Con una línea en un mu-plugin o en <code>functions.php</code> puedes desactivar la funcionalidad por completo:</p>
<pre>// Desactivar las contraseñas de aplicación en todo el sitio
add_filter( 'wp_is_application_passwords_available', '__return_false' );
</pre>
<p>Esto hace que desaparezca la sección del perfil de usuario y que las contraseñas existentes dejen de funcionar.</p>
<h3>Limitarlas por perfil de usuario (PHP)</h3>
<p>Si quieres que solo los administradores puedan crearlas y usarlas, puedes filtrar por usuario:</p>
<pre>// Solo permitir contraseñas de aplicación a administradores
add_filter( 'wp_is_application_passwords_available_for_user', 'ayudawp_limitar_app_passwords', 10, 2 );
function ayudawp_limitar_app_passwords( $available, $user ) {
    // Solo administradores pueden crear y usar contraseñas de aplicación
    if ( ! user_can( $user, 'manage_options' ) ) {
        return false;
    }
    return $available;
}
</pre>
<p>Esto es lo más recomendable en la mayoría de los sitios: mantener la funcionalidad disponible para quienes realmente la necesitan y cerrarla para el resto.</p>
<h3>Forzar su funcionamiento sin HTTPS (solo para desarrollo)</h3>
<p>Por defecto, las contraseñas de aplicación solo se procesan en conexiones HTTPS. Si estás en un entorno de desarrollo local sin certificado SSL, puedes forzar su disponibilidad:</p>
<pre>// Permitir contraseñas de aplicación sin HTTPS (solo en local)
add_filter( 'wp_is_application_passwords_available', '__return_true' );
</pre>
<p><strong>No uses esto en producción.</strong> Las credenciales viajan en texto plano por HTTP y cualquiera que intercepte el tráfico puede leerlas.</p>
<h3>Con plugins</h3>
<p><img decoding="async" class="sombra alignnone wp-image-158799 size-full" src="https://ayudawp.com/wp-content/uploads/2026/04/vigilant-application-paasswords.jpg" alt="vigilant application paasswords" width="1200" height="814" srcset="https://ayudawp.com/wp-content/uploads/2026/04/vigilant-application-paasswords.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/vigilant-application-paasswords-768x521.jpg 768w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<p>Si prefieres no tocar código hay plugins que te lo resuelven con un clic. El plugin <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilant</a> (gratuito) incluye la opción de desactivar las contraseñas de aplicación desde su módulo de seguridad en el acceso. También existe <a href="https://es.wordpress.org/plugins/disable-application-passwords/" target="_blank" rel="nofollow noopener">Disable Application Passwords</a> que hace solo eso, es una sola función, lo activas y listo. Otros plugins como WP Cerber o Advanced Access Manager ofrecen control más detallado por perfiles si es algo que necesitas de manera específica.</p>
<h2>Filtros y ganchos disponibles para desarrolladores</h2>
<p>Si estás desarrollando un plugin que interactúa con las contraseñas de aplicación estos son los filtros que te interesan:</p>
<ul>
<li><code>wp_is_application_passwords_available</code>: Controla si la funcionalidad está disponible en el sitio (true/false).</li>
<li><code>wp_is_application_passwords_available_for_user</code>: Controla si un usuario concreto puede crear y usar contraseñas de aplicación.</li>
<li><code>application_password_is_api_request</code>: Permite marcar peticiones que no sean REST API ni XML-RPC como «peticiones de aplicación» para que WordPress valide contraseñas de aplicación en ellas.</li>
<li><code>wp_is_application_passwords_supported</code>: Comprueba si el entorno admite la funcionalidad (requiere HTTPS por defecto).</li>
</ul>
<p>La clase principal es <code>WP_Application_Passwords</code> y los endpoints REST están en <code>/wp/v2/users/&lt;user_id&gt;/application-passwords</code>. La <a href="https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/" target="_blank" rel="nofollow noopener">guía de integración original</a> del equipo de WordPress Core sigue siendo la referencia técnica más completa.</p>
<h2>Preguntas frecuentes</h2>
<h3>¿Se pueden usar para entrar en wp-admin?</h3>
<p><strong>No</strong>. Las contraseñas de aplicación solo funcionan para autenticar peticiones a la REST API y XML-RPC. Si intentas iniciar sesión en <code>wp-login.php</code> con una contraseña de aplicación, WordPress la rechazará.</p>
<h3>Si cambio mi contraseña de WordPress, ¿dejan de funcionar?</h3>
<p><strong>No</strong>. Las contraseñas de aplicación son independientes de la contraseña del usuario. Cambiar una no afecta a la otra. Para invalidar una contraseña de aplicación tienes que anularla explícitamente.</p>
<h3>¿Funcionan sin HTTPS?</h3>
<p><strong>Por defecto, no</strong>. WordPress las desactiva en conexiones HTTP para evitar que las credenciales viajen en texto plano. Se puede forzar con un filtro, pero solo tiene sentido en desarrollo local.</p>
<h3>¿Puedo limitar lo que puede hacer cada contraseña?</h3>
<p><strong>No directamente</strong>. La contraseña hereda los permisos del usuario que la creó. No hay un sistema nativo de scopes o permisos por contraseña. La forma de limitar es crear la contraseña desde un usuario con el perfil mínimo necesario.</p>
<h3>¿Son compatibles con plugins de seguridad?</h3>
<p><strong>Depende del plugin</strong>. Algunos como Wordfence, Shield Security o WP Cerber tienen compatibilidad específica para contraseñas de aplicación, otros pueden bloquearlas o interferir con la verificación de la API. Si usas un plugin de seguridad y las contraseñas de aplicación no te funcionan revisa sus ajustes de API y autenticación.</p>
<h3>¿Cuántas puedo crear por usuario?</h3>
<p><strong>No hay límite definido por WordPress</strong>. Puedes crear tantas como necesites, aunque lo sensato es tener una por cada integración y anular las que ya no uses.</p>
<h3>¿Qué pasa con las contraseñas existentes si desactivo la funcionalidad?</h3>
<p>Si desactivas las contraseñas de aplicación con el filtro <code>wp_is_application_passwords_available</code> o un plugin de seguridad o rendimiento las contraseñas existentes dejan de funcionar. No se borran de la base de datos, pero WordPress no las valida. Si vuelves a activar la funcionalidad seguirán ahí y volverán a funcionar.</p>
<h2>Documentación oficial y referencias</h2>
<ul>
<li><a href="https://developer.wordpress.org/advanced-administration/security/application-passwords/" target="_blank" rel="nofollow noopener">Application Passwords – Advanced Administration Handbook</a> (WordPress.org).</li>
<li><a href="https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/" target="_blank" rel="nofollow noopener">Application Passwords: Integration Guide</a> (Make WordPress Core).</li>
<li><a href="https://developer.wordpress.org/cli/commands/user/application-password/" target="_blank" rel="nofollow noopener">wp user application-password</a> (referencia WP-CLI).</li>
<li><a href="https://github.com/WordPress/application-passwords" target="_blank" rel="nofollow noopener">Repositorio original en GitHub</a> (el plugin que se integró en el core).</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/application-passwords/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Si quieres eliminar shortcodes en WordPress aquí tienes la guía completa, ¿qué digo completa, completísima? Todo probado por mi y funciona 100%</title>
		<link>https://ayudawp.com/eliminar-shortcodes/</link>
					<comments>https://ayudawp.com/eliminar-shortcodes/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Shortcode]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158501</guid>

					<description><![CDATA[Este artículo cubre absolutamente todo lo que necesitas saber sobre los shortcodes huérfanos, qué son exactamente, por qué aparecen, dónde se esconden (en más sitios de los que crees), cómo encontrarlos con diferentes herramientas y todos los métodos disponibles para eliminarlos o neutralizarlos, desde el más sencillo hasta el más avanzado, para todos los niveles, con código listo para usar.]]></description>
										<content:encoded><![CDATA[<p>Si llevas tiempo con WordPress hay bastantes posibilidades de que tu base de datos esté llena de <strong>restos de plugins y temas que ya no existen</strong>. Hoy me refiero en concreto a todos esos <strong>shortcodes que un día hacían algo útil y ahora no sirven absolutamente para nada</strong>, pero siguen ahí, impresos en el contenido de tus páginas, entradas, widgets y opciones del tema, como fantasmas.</p>
<p>Algunos se ven directamente en pantalla tal cual, con sus corchetes y todo, otros no se ven porque WordPress los ignora en silencio, pero <strong>siguen ocupando espacio, ensuciando el HTML que ve Google y ralentizando las consultas a la base de datos</strong>. En los casos más extremos, como cuando usabas un maquetador visual basado en shortcodes, <strong>pueden dejar páginas enteras completamente ilegibles</strong>.</p>
<p>Este artículo cubre absolutamente <strong>todo lo que necesitas saber sobre los shortcodes huérfanos</strong>, qué son exactamente, por qué aparecen, dónde se esconden (en más sitios de los que crees), cómo encontrarlos con diferentes <strong>herramientas y todos los métodos disponibles para eliminarlos o neutralizarlos, desde el más sencillo hasta el más avanzado</strong>, para todos los niveles, con código listo para usar.</p>
<h2>Qué es un shortcode y por qué se queda huérfano</h2>
<p>Un shortcode es ese <strong>fragmento entre corchetes que WordPress interpreta y convierte en algo concreto</strong>, ya sea un formulario de contacto, un slider, una galería de imágenes, un botón, un bloque de contenido, una restricción de acceso. Lo registra el plugin o el tema que lo utiliza a través de la función <code>add_shortcode()</code>, y mientras ese plugin o tema está activo, WordPress sabe exactamente qué hacer con él.</p>
<p>El problema llega cuando ese plugin ya no está. Si desinstalaste el plugin, cambiaste de tema o simplemente lo desactivaste sin limpiar el contenido antes, los shortcodes se quedan ahí, huérfanos, sin nadie que los interprete. A partir de ese momento pueden pasar dos cosas:</p>
<ol>
<li><strong>Que WordPress los ignore y no muestre nada</strong>, que es el comportamiento más habitual en versiones modernas de WordPress. El shortcode está en la base de datos pero no se procesa, así que en pantalla no aparece nada donde antes había algo.</li>
<li><strong>Que WordPress los muestre literalmente en pantalla</strong>, tal cual, con sus corchetes. Esto depende de cómo está configurado WordPress y de si hay algún filtro interviniendo.</li>
</ol>
<p>Lo segundo es lo peor porque tus visitantes ven algo así en medio del texto de una página que debería tener un formulario de contacto:</p>
<pre>[contact-form-7 id="48" title="Formulario de contacto"]</pre>
<p>O algo bastante más caótico si era de un maquetador visual:</p>
<pre>[et_pb_section fb_built="1" _builder_version="4.16.0"][et_pb_row _builder_version="4.16.0"][et_pb_column type="4_4" _builder_version="4.16.0"][et_pb_text _builder_version="4.16.0"]Tu contenido de aquí[/et_pb_text][/et_pb_column][/et_pb_row][/et_pb_section]</pre>
<p>Ninguna de las dos situaciones es buena. Aunque no se vean hay razones suficientes para limpiarlos.</p>
<blockquote><p>Nota: Revisa manualmente los códigos de ejemplos para Contact Form 7, no los apliques directamente porque como yo lo uso y se rompería la página al tratar de mostrarlos les he añadido un espacio entre el primer corchete (<code>[</code>) y el identificador <code>contact-form-7</code>).</p></blockquote>
<h3>El impacto en SEO, rendimiento y base de datos de los shortcodes huérfanos</h3>
<p><strong>El argumento de que los shortcodes no afectan al SEO porque Google solo ve el HTML es verdad a medias</strong>.</p>
<p>Si el plugin está activo y el shortcode se procesa correctamente Google ve el HTML resultante, hasta aquí bien. Pero si el shortcode está huérfano y aparece en pantalla como texto en crudo, Google lo ve exactamente igual que un visitante humano, como <strong>texto basura que no aporta nada al contenido</strong> de la página.</p>
<p>Incluso cuando no se muestran en pantalla, <strong>los shortcodes de maquetadores generan un volumen de código en la base de datos que puede ser enorme</strong>. Una sola página construida con el viejo Visual Composer puede tener KBs de shortcodes almacenados en <code>post_content</code>.</p>
<p>Ese contenido tiene que viajar de la base de datos al servidor con cada carga de página, procesarse y descartarse. En webs con muchas páginas eso es un montón.</p>
<p>En cuanto al rendimiento, cada shortcode que aparece en el contenido pasa por el sistema de procesado de shortcodes de WordPress aunque devuelva vacío. No es dramático en una web pequeña pero <strong>en una instalación grande con cientos de entradas heredadas puede tener un impacto alto en los tiempos de respuesta</strong>.</p>
<p>Y luego está la cuestión de mantenimiento, porque una base de datos limpia es más fácil de auditar, de migrar y de depurar cuando algo falla.</p>
<h2>¿De quién es la culpa de que haya shortcodes huérfanos?</h2>
<p>Antes de ponerse a buscar y eliminar, conviene tener claro de dónde viene el problema en tu caso concreto. Los orígenes más habituales son los que te cuento a continuación, habrá más (o no) pero estos están seguro.</p>
<h3>Maquetadores visuales</h3>
<p>Son <strong>los mayores generadores de shortcodes huérfanos por volumen</strong>. Divi, WP Bakery (antes Visual Composer), Beaver Builder, King Composer, SiteOrigin y otros. Todos ellos (o al menos sus versiones más antiguas) almacenan el contenido de tus páginas como shortcodes en la base de datos. Cuando cambias de maquetador o de tema sin migrar el contenido primero, lo que queda puede ser cientos o miles de líneas de shortcodes en cada página.</p>
<h3>Plugins de formularios</h3>
<p>Este es el caso que más se pasa por alto y que más shortcodes huérfanos genera en todo tipo de webs. Contact Form 7 es el plugin de WordPress más instalado del mundo, y su shortcode <code>[ contact-form-7 id="X" ]</code> aparece literalmente en <strong>millones de páginas de contacto, páginas de presupuesto, pies de página y widgets.</strong></p>
<p>Cuando alguien migra a otro plugin de formularios (Gravity Forms, WPForms, Fluent Forms) o simplemente desinstala CF7, esos shortcodes se quedan ahí donde estuvieran, sin uso ni beneficio.</p>
<p>Gravity Forms (<code>[gravityform id="1"]</code>), WPForms (<code>[wpforms id="52"]</code>), Ninja Forms (<code>[ninja_form id="1"]</code>), Formidable Forms (<code>[formidable id="2"]</code>) y prácticamente <strong>cualquier plugin de formularios tiene exactamente el mismo problema</strong>.</p>
<h3>Plugins de sliders y galerías</h3>
<p>Elige tu diversión. Revolution Slider, Meta Slider, Soliloquy, Smart Slider 3, Nivo Slider, Envira Gallery, FooGallery, y prácticamente <strong>todos los carruseles de contenido o imágenes usan shortcodes</strong> para incrustar su contenido en páginas y entradas. Si en algún momento cambiaste de plugin de sliders o galerías sin limpiar el contenido, esos shortcodes siguen ahí.</p>
<h3>Plugins de membresía y restricción de contenido</h3>
<p>MemberPress, Restrict Content Pro, s2Member, LearnDash y similares usan <strong>shortcodes para proteger fragmentos de contenido o mostrar mensajes</strong> según el nivel de acceso del usuario. Son especialmente delicados cuando quedan huérfanos porque pueden ocultar partes del contenido o mostrar mensajes de acceso denegado sin sentido.</p>
<h3>Plugins de redes sociales, botones de compartir, incrustados</h3>
<p>Muchos plugins de generaciones anteriores insertaban sus botones de compartir mediante shortcodes en el contenido, y si usaste shortcodes para insertar vídeos seguro que también viste Mazinger Z o cera le andas. Si los usaste hace años y luego los cambiaste por soluciones más modernas esos shortcodes pueden seguir en tus entradas más antiguas.</p>
<h3>WooCommerce y sus extensiones</h3>
<p>WooCommerce incluye <a href="https://ayudawp.com/todos-los-shortcodes-de-woocommerce-y-como-utilizarlos/" target="_blank" rel="noopener ugc">sus propios shortcodes nativos</a> (<code>[products]</code>, <code>[woocommerce_cart]</code>, <code>[woocommerce_checkout]</code>, <code>[woocommerce_my_account]</code>) que se registran mientras el plugin esté activo. Pero el problema mayor viene de las extensiones de WooCommerce, como filtros de productos, comparadores, listas de deseos, tabs de producto con contenido personalizado.</p>
<p>Si desinstalaste alguna de estas extensiones sin limpiar el contenido sus shortcodes siguen en páginas y en las descripciones de productos.</p>
<h3>Temas mutipropósito premium con shortcodes propios</h3>
<p>Muchos temas de sitios como ThemeForest y otros marketplaces llevan incorporados sus propios shortcodes para crear elementos de diseño como cajas de información, iconos, columnas, botones, secciones destacadas.</p>
<p>Cuando cambias de tema o plugin todo eso se convierte en texto inútil.</p>
<h2>Dónde se esconden</h2>
<p>El error más habitual cuando alguien busca y elimina shortcodes es hacerlo solo en el contenido de entradas y páginas. Eso es quedarse muy a medias. Los shortcodes pueden estar en muchos más sitios, y si no los limpias todos, el problema persiste.</p>
<ul>
<li><strong>Contenido de entradas y páginas</strong>: la tabla <code>wp_posts</code>, columna <code>post_content</code>. Es el sitio más obvio.</li>
<li><strong>Extractos</strong>: la columna <code>post_excerpt</code> de la misma tabla y se olvida con mucha frecuencia. Si pusiste un shortcode en el extracto de una entrada para mostrar algo en las páginas de archivo o en el feed ese shortcode puede seguir ahí.</li>
<li><strong>Tipos de contenido personalizados</strong>: también en <code>wp_posts</code> pero con diferentes valores en <code>post_type</code>. Si usas CPTs (productos de WooCommerce, portfolios, cursos, propiedades), sus contenidos también pueden tener shortcodes.</li>
<li><strong>Metadatos de entradas y campos personalizados</strong>: la tabla <code>wp_postmeta</code>. Muchos plugins guardan contenido con shortcodes en campos personalizados. ACF en particular puede tener campos de tipo <code>textarea</code> o contenido WYSIWYG llenos de ellos. Las descripciones cortas de productos de WooCommerce (<code>_woocommerce_short_description</code>) también van aquí.</li>
<li><strong>Widgets</strong>: los widgets de texto clásicos, los widgets del editor de bloques y los de cualquier plugin de widgets personalizados se guardan en <code>wp_options</code> con la clave <code>widget_text</code> o similares. Si usabas un shortcode de formulario en la barra lateral y desinstalaste el plugin, ese widget sigue teniendo el shortcode.</li>
<li><strong>Opciones del tema y del personalizador</strong>: también en <code>wp_options</code>. Algunos temas permiten insertar shortcodes en campos de texto del personalizador, en el pie de página, cabeceras fijas, avisos legales, textos de copyright, etc. Estos son especialmente difíciles de encontrar porque no hay una clave estándar para buscarlos.</li>
<li><strong>Menús de navegación</strong>: algunos plugins añaden shortcodes en los títulos o en el CSS de los elementos de menú. Raro, pero existe.</li>
<li><strong>Plantillas de correo electrónico personalizadas</strong>: si usas WooCommerce o algún plugin de email marketing con plantillas editables desde el escritorio, esas plantillas pueden tener shortcodes. Al cambiar de plugin, los shortcodes quedan en las plantillas guardadas.</li>
<li><strong>Bloques del editor de bloques (Gutenberg)</strong>: cuando importas o migras contenido clásico a Gutenberg, los shortcodes a veces acaban dentro de bloques de párrafo o bloques clásicos. Gutenberg tiene un bloque específico llamado shortcode para procesarlos, pero si están dentro de un bloque de párrafo normal no se procesan.</li>
<li><strong>Opciones de SEO y meta descriptions</strong>: plugins como Yoast SEO o Rank Math permiten personalizar los snippets de SEO, y algunos usuarios han introducido shortcodes ahí. Si el plugin que generaba ese shortcode ya no está el texto puede aparecer raro en las etiquetas meta.</li>
</ul>
<h2>¿Donde puedes encontrar los shortcodes huérfanos?</h2>
<p>Antes de eliminar nada hay que <strong>saber qué tienes y dónde están</strong>. Lanzarse a borrar sin localizar primero puede dejarte con contenido roto o con shortcodes que crees que has eliminado pero siguen apareciendo en algún widget olvidado, y como acabamos de ver antes pueden estar en montones de sitios, algunos nada obvios.</p>
<h3>Con un shortcode de diagnóstico temporal</h3>
<p>Una técnica elegante para localizar shortcodes concretos en el contenido de entradas y páginas sin instalar ningún plugin es crear un shortcode de diagnóstico temporal, sí otro. ¿A que es algo casi poético empezar la eliminación de shortcodes creando uno nuevo?</p>
<p>Lo añades al <code>functions.php</code> del tema hijo o a <a href="https://ayudawp.com/mejor-plugin-wordpress-fragmentos-codigo/" target="_blank" rel="noopener ugc">un plugin de snippets</a>, usas el shortcode en una página nueva para obtener el listado y luego lo eliminas.</p>
<pre>/* Shortcode de diagnóstico temporal: encuentra entradas que contienen un shortcode concreto */
// Uso: [ayudawp_buscar_shortcode find="nombre-del-shortcode"]
// Ejemplo: [ayudawp_buscar_shortcode find="contact-form-7"]
// IMPORTANTE: elimina este código una vez usado
add_shortcode( 'ayudawp_buscar_shortcode', 'ayudawp_shortcode_finder' );
function ayudawp_shortcode_finder( $atts ) {
    // Solo accesible para administradores
    if ( ! current_user_can( 'manage_options' ) ) {
        return '';
    }

    $atts = shortcode_atts( array(
        'find' =&gt; '',
    ), $atts );

    if ( empty( $atts['find'] ) ) {
        return '&lt;p&gt;Indica el shortcode a buscar con el atributo find="nombre".&lt;/p&gt;';
    }

    // Busca en entradas, páginas y cualquier CPT publicado
    $args = array(
        's'              =&gt; $atts['find'],
        'posts_per_page' =&gt; -1,
        'post_type'      =&gt; 'any',
        'post_status'    =&gt; array( 'publish', 'draft', 'private' ),
    );

    $query = new WP_Query( $args );

    if ( ! $query-&gt;have_posts() ) {
        return '&lt;p&gt;No se han encontrado entradas con ese shortcode.&lt;/p&gt;';
    }

    $output  = '&lt;p&gt;&lt;strong&gt;Entradas que contienen [' . esc_html( $atts['find'] ) . ']:&lt;/strong&gt;&lt;/p&gt;';
    $output .= '&lt;ul&gt;';
    while ( $query-&gt;have_posts() ) {
        $query-&gt;the_post();
        $output .= '&lt;li&gt;&lt;a href="' . esc_url( get_edit_post_link() ) . '"&gt;';
        $output .= esc_html( get_the_title() ) . ' (' . esc_html( get_post_type() ) . ')&lt;/a&gt;&lt;/li&gt;';
    }
    $output .= '&lt;/ul&gt;';
    wp_reset_postdata();

    return $output;
}</pre>
<p>Una vez añadido el código, crea una página nueva (en borrador, no hace falta que la publiques) y escribe en su contenido:</p>
<pre>[ayudawp_buscar_shortcode find="contact-form-7"]</pre>
<p>Al previsualizar la página verás un listado de todas las entradas y páginas donde aparece ese shortcode, con enlace directo al editor (<em>Dato curioso: también verás la actual</em>).</p>

<a href="https://ayudawp.com/eliminar-shortcodes/entrada-con-shortcode-para-buscar-shortcodes/" rel="nofollow"><img width="1200" height="675" src="https://ayudawp.com/wp-content/uploads/2026/03/entrada-con-shortcode-para-buscar-shortcodes-1200x675.jpg" class="attachment-medium size-medium" alt="entrada con shortcode para buscar shortcodes" srcset="https://ayudawp.com/wp-content/uploads/2026/03/entrada-con-shortcode-para-buscar-shortcodes-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/entrada-con-shortcode-para-buscar-shortcodes-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/entrada-con-shortcode-para-buscar-shortcodes-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/entrada-con-shortcode-para-buscar-shortcodes.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px" decoding="async" fetchpriority="high"></a>
<a href="https://ayudawp.com/eliminar-shortcodes/shortcode-mostrando-donde-hay-shortcodes/" rel="nofollow"><img width="1200" height="675" src="https://ayudawp.com/wp-content/uploads/2026/03/shortcode-mostrando-donde-hay-shortcodes-1200x675.jpg" class="attachment-medium size-medium" alt="shortcode mostrando donde hay shortcodes" srcset="https://ayudawp.com/wp-content/uploads/2026/03/shortcode-mostrando-donde-hay-shortcodes-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/shortcode-mostrando-donde-hay-shortcodes-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/shortcode-mostrando-donde-hay-shortcodes-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/shortcode-mostrando-donde-hay-shortcodes.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<p>Cuando termines elimina el código del <code>functions.php</code>.</p>
<p>Ten en cuenta que este método busca en el contenido (<code>post_content</code>) mediante la búsqueda nativa de WordPress, que no siempre indexa todo perfectamente.</p>
<h3>Con un plugin</h3>
<p>La opción más mencionada históricamente para localizar shortcodes ha sido el plugin <a href="https://wordpress.org/plugins/shortcodes-in-use/" target="_blank" rel="nofollow noopener">Shortcodes in Use</a>. Y sí, permite buscar shortcodes concretos en el contenido de tus entradas filtrando por tipo de contenido (páginas, entradas, CPTs, widgets), pero tiene un problema, que lleva varios años sin actualizarse y su compatibilidad con versiones modernas de WordPress no está garantizada. Puedes probarlo pero ojito.</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Para sustituir <em>Shortcodes in Use</em> he encontrado <strong><a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://wordpress.org/plugins/shortcodes-finder/">Shortcodes Finder</a></strong>, que hace lo mismo y mucho más porque encuentra todos los shortcodes por tipo de contenido, muestra los huérfanos sin usar y permite desactivarlos con un clic desde el panel. Es el sustituto natural.</p>
<h3>Con consultas SQL</h3>
<p>Esta es <strong>la manera más directa y completa de saber qué shortcodes tienes y dónde</strong>. Accede a tu base de datos desde phpMyAdmin (en tu panel de hosting), Adminer o cualquier cliente SQL que uses.</p>
<p>Antes de ejecutar nada, un par de notas importantes:</p>
<ul>
<li>Sustituye siempre <code>wp_</code> por el prefijo real de tu base de datos (puedes verlo en tu archivo <code>wp-config.php</code>)</li>
<li>Ejecuta primero las consultas <code>SELECT</code> para ver los resultados antes de hacer ningún <code>UPDATE</code>.</li>
</ul>
<p>Para <strong>buscar un shortcode concreto en el contenido de entradas y páginas</strong>:</p>
<pre>SELECT ID, post_title, post_type, post_status
FROM wp_posts
WHERE post_content LIKE '%[contact-form-7]+)[^\]]*\]/', $post-&gt;post_content, $matches );

    if ( empty( $matches[1] ) ) {
        return;
    }

    foreach ( array_unique( $matches[1] ) as $tag ) {
        if ( ! array_key_exists( $tag, $shortcode_tags ) ) {
            add_shortcode( $tag, '__return_empty_string' );
        }
    }
}</pre>
<h3>Función strip_shortcodes() y filtros sobre the_content</h3>
<p>WordPress incluye de serie la función <code>strip_shortcodes()</code> que <strong>elimina los shortcodes del texto</strong> que procesa. La diferencia con el método anterior es que actúa en el filtro de salida del contenido, así que los shortcodes no se procesan, simplemente <strong>se eliminan del HTML antes de mostrarlo al visitante</strong>.</p>
<p>La forma más sencilla de usarlo es aplicarlo al filtro <code>the_content</code>:</p>
<pre>// Elimina todos los shortcodes no reconocidos del contenido antes de mostrarlo.
// Atención: strip_shortcodes() elimina TODOS los shortcodes no registrados.
add_filter( 'the_content', 'ayudawp_strip_orphan_shortcodes', 5 );
function ayudawp_strip_orphan_shortcodes( $content ) {
    global $shortcode_tags;
    $registered = array_keys( $shortcode_tags );

    // Buscamos shortcodes en el contenido
    preg_match_all( '/\[([a-zA-Z_\-]+)[^\]]*\]/', $content, $matches );

    if ( empty( $matches[1] ) ) {
        return $content;
    }

    foreach ( array_unique( $matches[1] ) as $tag ) {
        // Solo eliminamos los que no están registrados
        if ( ! in_array( $tag, $registered, true ) ) {
            // Elimina la etiqueta de apertura con cualquier combinación de atributos
            $content = preg_replace(
                '/\[' . preg_quote( $tag, '/' ) . '(?:\s[^\]]*)?\/?\]/',
                '',
                $content
            );
            // Elimina la etiqueta de cierre si existe
            $content = preg_replace(
                '/\[\/' . preg_quote( $tag, '/' ) . '\]/',
                '',
                $content
            );
        }
    }

    return $content;
}</pre>
<p>La prioridad <code>5</code> hace que se ejecute antes que el procesado normal de shortcodes de WordPress (prioridad 11), lo correcto en este tipo de acciones.</p>
<p>La limitación importante de este enfoque con expresiones regulares básicas es que <strong>no maneja bien los shortcodes con etiqueta de cierre que envuelven contenido</strong>, como <code>[shortcode]contenido envuelto[/shortcode]</code>. Si eliminas solo las etiquetas el contenido interior puede quedar suelto en el HTML de forma inesperada.</p>
<h3>Eliminar shortcodes con etiqueta de cierre y contenido anidado</h3>
<p>Los shortcodes más complejos, especialmente los de maquetadores visuales como Divi o WP Bakery, tienen estructura de apertura y cierre, y además se anidan unos dentro de otros:</p>
<pre>[et_pb_section][et_pb_row][et_pb_column]contenido[/et_pb_column][/et_pb_row][/et_pb_section]</pre>
<p>Para estos casos <strong>necesitas una estrategia diferente que elimine tanto las etiquetas como el contenido que envuelven</strong>.</p>
<p>El siguiente código hace justamente eso:</p>
<pre>// Elimina shortcodes con estructura de apertura y cierre (y su contenido interior).
// Especialmente útil para maquetadores como Divi o WP Bakery.
add_filter( 'the_content', 'ayudawp_strip_wrapping_orphan_shortcodes', 5 );
function ayudawp_strip_wrapping_orphan_shortcodes( $content ) {
    global $shortcode_tags;

    // Patrón que captura shortcodes con cierre: [tag atributos]...contenido...[/tag]
    // El modificador 's' hace que el punto también coincida con saltos de línea
    $pattern = '/\[([a-zA-Z_\-]+)(?:\s[^\]]*)?\](.*?)\[\/\1\]/s';

    preg_match_all( $pattern, $content, $matches, PREG_SET_ORDER );

    if ( empty( $matches ) ) {
        return $content;
    }

    foreach ( $matches as $match ) {
        $tag = $match[1];
        // Solo actúa si el shortcode no está registrado
        if ( ! array_key_exists( $tag, $shortcode_tags ) ) {
            // Elimina el bloque completo: apertura + contenido + cierre
            $content = str_replace( $match[0], '', $content );
        }
    }

    return $content;
}</pre>
<p>Si en lugar de eliminar el contenido interior prefieres conservarlo (quitando solo las etiquetas del shortcode pero manteniendo lo que había dentro) cambia <code>str_replace( $match[0], '', $content )</code> por <code>str_replace( $match[0], $match[2], $content )</code>.</p>
<p>Para una limpieza completa de maquetadores como Divi o WP Bakery lo más efectivo es combinar este código con el método de buscar y reemplazar en base de datos que veremos enseguida. El código resuelve el problema de visualización de forma inmediata, el reemplazo en base de datos lo resuelve de forma permanente.</p>
<h3>Buscar y reemplazar en la base de datos</h3>
<p>Este es <strong>el método que elimina los shortcodes de verdad, borrándolos de la base de datos</strong>. Los resultados son permanentes así que la regla de oro es siempre hacer una copia de seguridad completa antes de ejecutar nada, sin excepciones.</p>
<p><strong>Con Better Search Replace</strong></p>
<p><a href="https://es.wordpress.org/plugins/better-search-replace/" target="_blank" rel="nofollow noopener">Better Search Replace</a> es el plugin de referencia para esto. Gratuito, bien mantenido y con una interfaz clara. Permite buscar un texto concreto en cualquier tabla de la base de datos y reemplazarlo por otro (o por nada).</p>
<p>El flujo de trabajo correcto es este: instala y activa el plugin, ve a Herramientas › Better Search Replace, introduce el shortcode exacto en el campo «Buscar», deja «Reemplazar por» vacío para eliminarlo, selecciona las tablas donde quieres buscar (<code>wp_posts</code> y <code>wp_options</code> como mínimo, todas si no estás seguro) y marca «Ejecutar como prueba» la primera vez. Eso te mostrará cuántos reemplazos haría sin ejecutarlos realmente. Si el número tiene sentido, repite sin la opción de prueba.</p>
<p>El límite de este plugin es que trabaja con texto literal. Si el shortcode tiene atributos variables (como un ID diferente en cada uso), necesitas hacerlo con expresiones regulares, lo que requiere WP-CLI o SQL directo.</p>
<p><strong>Con WP-CLI</strong></p>
<p>WP-CLI incluye el comando <code>search-replace</code> que admite expresiones regulares, lo que lo convierte en la herramienta perfecta para shortcodes con atributos variables. Siempre empieza con <code>--dry-run</code> para ver qué va a pasar antes de ejecutar de verdad:</p>
<p>Para un shortcode con texto exacto:</p>
<pre>wp search-replace '[ contact-form-7 id="48" title="Formulario de contacto 1"]' '' wp_posts --dry-run</pre>
<p>Para un shortcode con cualquier combinación de atributos (usando regex):</p>
<pre>wp search-replace '\[ contact-form-7[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<p>Para limpiar shortcodes de Divi (prefijo et_pb_) en todo el contenido:</p>
<pre>wp search-replace '\[/?et_pb_[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<p>Para WP Bakery (prefijo <code>vc_</code>):</p>
<pre>wp search-replace '\[/?vc_[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<p>Cuando el resultado del dry-run es el esperado, ejecuta sin esa opción. El flujo completo recomendado, que hace copia de seguridad, ejecuta el reemplazo y limpia la caché:</p>
<pre>wp db export backup-antes-limpieza-shortcodes.sql &amp;&amp; wp search-replace '\[contact-form-7]]*\]' '' wp_posts --regex --report-changed-only &amp;&amp; wp cache flush</pre>
<p>Si el shortcode afecta también a metadatos o a opciones, añade las tablas correspondientes al comando:</p>
<pre>wp search-replace '\[ contact-form-7[^\]]*\]' '' wp_posts wp_postmeta wp_options --regex --report-changed-only</pre>
<p><strong>Con SQL directo en phpMyAdmin</strong></p>
<p>Para shortcodes con texto exacto e idéntico en todos los usos, la función <code>REPLACE</code> de MySQL es directa:</p>
<pre>-- Primero comprueba cuántas filas afectaría
SELECT COUNT(*) FROM wp_posts
WHERE post_content LIKE '%[ contact-form-7 id="48" title="Formulario de contacto 1"]%';

-- Si el resultado es el esperado, ejecuta el reemplazo
UPDATE wp_posts
SET post_content = REPLACE(
    post_content,
    '[ contact-form-7 id="48" title="Formulario de contacto 1"]',
    ''
)
WHERE post_content LIKE '%contact-form-7%';</pre>
<p>Para shortcodes con atributos variables necesitas <code>REGEXP_REPLACE</code>, disponible desde MySQL 8.x o MariaDB 10.x (comprueba la versión de tu servidor antes de usarlo):</p>
<pre>-- Elimina todas las variantes del shortcode independientemente de sus atributos
UPDATE wp_posts
SET post_content = REGEXP_REPLACE(
    post_content,
    '\\[ contact-form-7[^\\]]*\\]',
    ''
)
WHERE post_content REGEXP '\\[contact-form-7]+[^\\]]*\\].*?\\[/et_pb_[a-z_]+\\]',
    ''
)
WHERE post_content REGEXP '\\[et_pb_';</pre>
<p>Con este último mucho cuidado, si el contenido que está dentro de las etiquetas del maquetador lo quieres conservar de alguna forma <strong>esta consulta lo borra todo</strong>. Úsalo cuando las páginas van a ser reconstruidas de cero con el nuevo tema o maquetador.</p>
<h3>Ejecutar un script PHP de limpieza masiva con WP_Query</h3>
<p>Una alternativa intermedia entre editar a mano y hacer un reemplazo global en la base de datos es usar un script PHP que <strong>recorra todas las entradas afectadas y limpie cada una individualmente</strong>, con más control sobre qué se elimina. Esto es muy útil cuando quieres <strong>eliminar shortcodes de apertura y cierre pero conservar el contenido interior</strong>.</p>
<p>El siguiente script busca todas las entradas que contienen un shortcode concreto y <strong>elimina solo las etiquetas (apertura y cierre), conservando el texto que había dentro</strong>:</p>
<pre>&lt;?php
/**
 * Plugin Name: Limpiador de shortcodes huérfanos (ejecutar una vez)
 * Description: Elimina las etiquetas de shortcodes huérfanos conservando el contenido interior.
 *              IMPORTANTE: desactivar y eliminar este plugin después de usarlo.
 * Version:     1.0
 * Author:      Fernando Tellado
 */

// Solo se ejecuta cuando un administrador accede al escritorio
add_action( 'admin_init', 'ayudawp_limpiar_shortcodes_una_vez' );
function ayudawp_limpiar_shortcodes_una_vez() {
    // Comprobación de seguridad: solo administradores
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }

    // Evita ejecuciones múltiples usando una opción de control
    if ( get_option( 'ayudawp_limpieza_shortcodes_ejecutada' ) ) {
        return;
    }

    // Lista de shortcodes a limpiar (solo las etiquetas, el contenido interior se conserva)
    $shortcodes_a_limpiar = array(
        'custom_shortcode',
        'clima_semanal',
        'privado',
        // Añade aquí los shortcodes que quieras limpiar
    );

    // Construye el patrón regex para todos los shortcodes de la lista
    $tags_patron = implode( '|', array_map( 'preg_quote', $shortcodes_a_limpiar ) );

    // Patrón para etiqueta de apertura (con o sin atributos) y etiqueta de cierre
    $patron_apertura = '/\[(?:' . $tags_patron . ')(?:\s[^\]]*)?\]/';
    $patron_cierre   = '/\[\/(?:' . $tags_patron . ')\]/';

    // Obtiene todas las entradas publicadas (y borradores) de cualquier tipo
    $args = array(
        'posts_per_page' =&gt; -1,
        'post_type'      =&gt; 'any',
        'post_status'    =&gt; array( 'publish', 'draft', 'private' ),
        'fields'         =&gt; 'ids',
    );

    $posts = get_posts( $args );
    $contador = 0;

    foreach ( $posts as $post_id ) {
        $post = get_post( $post_id );
        $contenido_original = $post-&gt;post_content;

        // Aplica la limpieza
        $contenido_limpio = preg_replace( $patron_apertura, '', $contenido_original );
        $contenido_limpio = preg_replace( $patron_cierre, '', $contenido_limpio );

        // Solo actualiza si ha habido cambios reales
        if ( $contenido_limpio !== $contenido_original ) {
            wp_update_post( array(
                'ID'           =&gt; $post_id,
                'post_content' =&gt; $contenido_limpio,
            ) );
            $contador++;
        }
    }

    // Marca la limpieza como ejecutada para no repetirla
    update_option( 'ayudawp_limpieza_shortcodes_ejecutada', true );

    // Registra un mensaje en el log para confirmación
    error_log( 'AyudaWP: Limpieza de shortcodes completada. Entradas modificadas: ' . $contador );
}</pre>
<p>Este script se ejecuta una sola vez (gracias al control mediante <code>get_option</code>). Después de que se ejecute desactívalo y elimínalo. Si quieres reiniciarlo para volver a ejecutarlo (por ejemplo, con una lista diferente de shortcodes), elimina la opción de control desde el escritorio de WordPress o con WP-CLI:</p>
<pre>wp option delete ayudawp_limpieza_shortcodes_ejecutada</pre>
<h2>Casos especiales: maquetadores y plugins populares</h2>
<p>Los shortcodes huérfanos más habituales no vienen de plugins raros, vienen de herramientas muy extendidas que la gente usa durante años y luego cambia o abandona. Aquí están los casos que más aparecen y cómo tratarlos.</p>
<h3>Contact Form 7</h3>
<p>Conviene dedicarle un apartado propio porque el volumen de webs afectadas es enorme. Contact Form 7 es el plugin de WordPress más instalado del mundo y su shortcode aparece en prácticamente cualquier página de contacto, y más sitios.</p>
<p>Cuando alguien migra a otro plugin de formularios o simplemente desinstala CF7 sin limpiar, ese shortcode queda por todas partes.</p>
<p>La particularidad de CF7 es que el ID del formulario varía en cada instalación y en cada uso, así que no sirve hacer un reemplazo de texto literal. Necesitas <code>regex</code>:</p>
<pre>-- Busca todas las entradas con shortcodes de CF7
SELECT ID, post_title FROM wp_posts
WHERE post_content REGEXP '\\[ contact-form-7[^\\]]*\\]'
  AND post_status NOT IN ('auto-draft', 'trash');</pre>
<p>Con WP-CLI para eliminarlos:</p>
<pre>wp search-replace '\[ contact-form-7[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<p>Si migras a WPForms, Gravity Forms u otro plugin, el proceso es el mismo: localiza los shortcodes del plugin anterior, elimínalos de la base de datos e inserta manualmente los nuevos shortcodes en las páginas correspondientes.</p>
<h3>Gravity Forms, WPForms, Ninja Forms y Formidable</h3>
<p>Mismo patrón que CF7 pero con diferentes nombres de shortcode. Para localizarlos y eliminarlos:</p>
<pre>-- Gravity Forms: [gravityform id="X" title="false"]
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%[gravityform%' AND post_status NOT IN ('auto-draft','trash');

-- WPForms: [wpforms id="X"]
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%[wpforms%' AND post_status NOT IN ('auto-draft','trash');

-- Ninja Forms: [ninja_form id="X"]
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%[ninja_form%' AND post_status NOT IN ('auto-draft','trash');</pre>
<h3>Divi (versiones anteriores a Divi 5)</h3>
<p>Divi es el caso más extremo de dependencia de shortcodes y el que más desastres causa cuando alguien cambia de tema sin preparar el terreno. Hasta la versión 4.x, absolutamente todo el contenido generado con su maquetador visual estaba almacenado como shortcodes anidados en la base de datos. Una sola página podía tener cientos de líneas así:</p>
<pre>[et_pb_section fb_built="1" _builder_version="4.21.0" _module_preset="default"]
[et_pb_row _builder_version="4.21.0" _module_preset="default"]
[et_pb_column type="4_4" _builder_version="4.21.0" _module_preset="default"]
[et_pb_text _builder_version="4.21.0" _module_preset="default"]
Aquí el contenido real de la página
[/et_pb_text]
[/et_pb_column]
[/et_pb_row]
[/et_pb_section]</pre>
<p>Si cambias de tema sin convertir ese contenido primero lo que te queda en las entradas es un muro de shortcodes absolutamente ilegible. Y no es un problema pequeño pues en algunas instalaciones con Divi el volumen de shortcodes en la base de datos es tal que la diferencia de tamaño de <code>wp_posts</code> antes y después de la limpieza puede ser de varios <em>megas</em><em>.</em></p>
<p><strong>Opción 1: migrar a Divi 5 </strong></p>
<p>Divi 5 ya está disponible y ha reescrito el framework desde cero. Lo más importante para el asunto del que estamos hablando es que Divi 5 abandona completamente los shortcodes y pasa a un sistema basado en bloques, similar en concepto a Gutenberg, pero con su propio motor.</p>
<p>El contenido de Divi ya no se almacena como shortcodes en <code>post_content</code>, sino en una estructura mucho más limpia y portable.</p>
<p>Al migrar de Divi 4.x a Divi 5 el propio proceso de migración convierte el contenido al nuevo formato, eliminando los shortcodes de la base de datos. Puedes leer los detalles en el <a href="https://ayudawp.com/migracion-divi-5/" target="_blank" rel="noopener ugc">esta guía de migración a Divi 5</a>. Migrar a Divi 5 es la solución más limpia y con más futuro a largo plazo.</p>
<p><strong>Opción 2: limpiar los shortcodes con buscar y reemplazar</strong></p>
<p>Si cambias a otro tema o maquetador y necesitas limpiar los shortcodes de Divi, el prefijo <code>et_pb_</code> es tu punto de partida. Con WP-CLI:</p>
<pre>-- Primero, comprueba cuántas entradas tienen shortcodes de Divi
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_content LIKE '%[et_pb_%' AND post_status NOT IN ('auto-draft','trash');"

-- Dry-run para ver qué pasaría
wp search-replace '\[/?et_pb_[^\]]*\]' '' wp_posts --regex --dry-run

-- Si el resultado es correcto, ejecuta sin dry-run
wp search-replace '\[/?et_pb_[^\]]*\]' '' wp_posts --regex --report-changed-only</pre>
<p>Ten en cuenta que esto elimina todo el contenido que estaba dentro de los módulos de Divi. Si las páginas tienen texto real que quieres conservar, necesitas extraerlo antes de limpiar los shortcodes. Una estrategia posible es exportar el contenido de cada página a un archivo de texto, copiar solo el texto relevante y reconstruir la página con el nuevo maquetador.</p>
<p><strong>Opción 3: neutralizar temporalmente mientras reconstruyes</strong></p>
<p>Si el volumen de páginas es grande y necesitas tiempo para reconstruirlas, el código de neutralización es lo más recomendable. Lo activas, los shortcodes dejan de mostrarse en pantalla y puedes reconstruir las páginas a tu ritmo sin que los visitantes vean el caos.</p>
<h3>WP Bakery Page Builder (Visual Composer)</h3>
<p>El otro gran generador de shortcodes masivos. WP Bakery usa prefijos como <code>vc_row</code>, <code>vc_column</code>, <code>vc_column_text</code>, <code>vc_section</code> y muchos más. El impacto es similar a Divi, o sea, páginas construidas íntegramente con WP Bakery pueden tener cientos de shortcodes anidados.</p>
<p>Para localizar el alcance del problema:</p>
<pre>SELECT ID, post_title, post_type
FROM wp_posts
WHERE post_content LIKE '%[vc_%'
  AND post_status NOT IN ('auto-draft', 'trash')
ORDER BY post_type, ID;</pre>
<p>Para limpiar con WP-CLI:</p>
<pre>-- Elimina todas las etiquetas de WP Bakery (apertura y cierre)
wp search-replace '\[/?vc_[a-z_]+[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<p>Un detalle importante de WP Bakery es que también puede dejar rastro en el metadato <code>_wpb_vc_js_status</code> y en algunas opciones propias. Después de limpiar <code>wp_posts</code>, vale la pena hacer una búsqueda en <code>wp_postmeta</code>:</p>
<pre>SELECT post_id, meta_key FROM wp_postmeta
WHERE meta_key LIKE '_wpb_%' OR meta_key LIKE '_vc_%';</pre>
<h3>Beaver Builder</h3>
<p>Beaver Builder gestiona el contenido de forma diferente a Divi y WP Bakery, lo que hace que el impacto de dejarlo sea menor en cuanto a shortcodes visibles. En lugar de guardar todo como shortcodes en <code>post_content</code>, guarda la configuración de los módulos en metadatos (<code>wp_postmeta</code>) y el shortcode que aparece en <code>post_content</code> suele ser simplemente <code>[fl_builder_insert_layout]</code> o similar.</p>
<p>Esto significa que si dejas de usar Beaver Builder, el impacto visible en el contenido es mucho menor. Pero sigue quedando basura en la base de datos en forma de metadatos. Para limpiarla tienes esta consulta SQL:</p>
<pre>-- Encuentra los metadatos de Beaver Builder
SELECT post_id, meta_key
FROM wp_postmeta
WHERE meta_key LIKE '_fl_builder%'
ORDER BY post_id;

-- Si quieres eliminarlos (con cuidado)
DELETE FROM wp_postmeta WHERE meta_key LIKE '_fl_builder%';</pre>
<p>Y para el shortcode que puede quedar en el contenido, con WP-CLI:</p>
<pre>wp search-replace '\[fl_builder_insert_layout[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<h3>Elementor y sus extensiones</h3>
<p>Elementor en sí mismo no usa shortcodes para almacenar el contenido, guarda todo en JSON en <code>wp_postmeta</code> con la clave <code>_elementor_data</code>. Esto es una ventaja importante en términos de portabilidad respecto a maquetadores más antiguos.</p>
<p>Sin embargo, muchas extensiones de Elementor (packs de widgets de terceros como Essential Addons, Ultimate Addons, JetElements, etc.) sí generan shortcodes que se insertan dentro de los widgets de texto de Elementor o en otras partes del contenido. Si usaste alguna de estas extensiones y lo desinstalaste esos shortcodes pueden aparecer dentro del contenido JSON de Elementor o en los widgets de texto de la barra lateral.</p>
<p>Para buscarlos, la consulta en <code>wp_postmeta</code> con el shortcode concreto es el punto de partida:</p>
<pre>SELECT pm.post_id, p.post_title, LEFT(pm.meta_value, 300) AS fragmento
FROM wp_postmeta pm
JOIN wp_posts p ON p.ID = pm.post_id
WHERE pm.meta_key = '_elementor_data'
  AND pm.meta_value LIKE '%nombre-del-shortcode%';</pre>
<h3>Revolution Slider, Meta Slider y similares</h3>
<p>Revolution Slider es uno de los más habituales. Su shortcode tiene la forma <code>[rev_slider alias="nombre-del-slider"]</code>. Si cambias de plugin de sliders sin limpiar primero, ese shortcode queda en todas las páginas donde tenías un slider.</p>
<p>Para localizarlos:</p>
<pre>SELECT ID, post_title FROM wp_posts
WHERE post_content LIKE '%[rev_slider%'
  AND post_status NOT IN ('auto-draft', 'trash');</pre>
<p>Y para limpiarlos con WP-CLI:</p>
<pre>wp search-replace '\[rev_slider[^\]]*\]' '' wp_posts --regex --dry-run</pre>
<p>Meta Slider (<code>[metaslider id="X"]</code>), Smart Slider 3 (<code>[smartslider3 slider="X"]</code>) y el resto siguen el mismo patrón.</p>
<h3>Plugins de membresía, cursos y restricción de contenido</h3>
<p>MemberPress, Restrict Content Pro, s2Member, LearnDash, Sensei y similares usan shortcodes para proteger fragmentos de contenido o mostrar elementos propios. Son especialmente problemáticos cuando quedan huérfanos porque pueden ocultar partes del contenido que deberían ser visibles o mostrar mensajes de acceso denegado sin sentido. Hay que localizarlos y limpiarlos con especial cuidado porque el contenido interior puede ser relevante.</p>
<p>En estos casos el método que conserva el contenido interior (eliminar solo las etiquetas del shortcode, no lo que hay dentro) suele ser el más apropiado.</p>
<h2>Eliminar shortcodes de los resultados de la API REST</h2>
<p>Si tu WordPress alimenta una aplicación externa, un marketplace, una app móvil o cualquier integración que consuma datos vía API REST de WordPress, los shortcodes huérfanos son un problema específicamente feo: en lugar de procesar el shortcode, la API devuelve el texto tal cual, y el sistema receptor lo muestra literalmente al usuario final.</p>
<p>Este problema es muy habitual cuando se conecta una tienda WooCommerce con marketplaces como Amazon, Miravia u otros, o cuando se construye una app sobre un WordPress que tiene contenido generado con maquetadores. El plugin del marketplace usa la API REST para leer las descripciones de los productos, y si esas descripciones están llenas de shortcodes de Divi o de WP Bakery, eso es exactamente lo que recibe y muestra.</p>
<p>La solución es filtrar la salida de la API para procesar o eliminar los shortcodes antes de que se envíen en la respuesta. Para el contenido general de entradas y páginas mediante la API REST estándar de WordPress:</p>
<pre>// Elimina shortcodes no registrados del contenido que devuelve la API REST de entradas.
add_filter( 'rest_prepare_post', 'ayudawp_clean_shortcodes_rest_api', 10, 3 );
function ayudawp_clean_shortcodes_rest_api( $response, $post, $request ) {
    if ( isset( $response-&gt;data['content']['raw'] ) ) {
        // Procesamos el raw: eliminamos shortcodes no registrados y procesamos los registrados
        $content = strip_shortcodes( $response-&gt;data['content']['raw'] );
        $response-&gt;data['content']['rendered'] = apply_filters( 'the_content', $content );
    }
    return $response;
}</pre>
<p>Para páginas, el hook es <code>rest_prepare_page</code>, para tipos de contenido personalizados, <code>rest_prepare_{post_type}</code>.</p>
<p>Para el caso específico de productos de WooCommerce en su API REST:</p>
<pre>// Elimina shortcodes de la descripción de productos en la API REST de WooCommerce.
add_filter( 'woocommerce_rest_prepare_product_object', 'ayudawp_clean_shortcodes_woo_rest', 10, 3 );
function ayudawp_clean_shortcodes_woo_rest( $response, $product, $request ) {
    $post_object = get_post( $product-&gt;get_id() );
    if ( ! $post_object ) {
        return $response;
    }

    // Elimina todos los shortcodes del contenido (descripción larga)
    $content = preg_replace( '/\[[^\]]+\]/', '', $post_object-&gt;post_content );
    $response-&gt;data['description'] = apply_filters( 'the_content', $content );

    // Hace lo mismo con la descripción corta si la hay
    if ( ! empty( $response-&gt;data['short_description'] ) ) {
        $short = preg_replace( '/\[[^\]]+\]/', '', $product-&gt;get_short_description() );
        $response-&gt;data['short_description'] = apply_filters( 'the_content', $short );
    }

    return $response;
}</pre>
<p>Si en lugar de eliminar los shortcodes quieres que se procesen (para que la API devuelva el HTML resultante en lugar del shortcode en crudo), sustituye el <code>preg_replace</code> que elimina shortcodes por <code>do_shortcode</code>. Tiene sentido cuando el plugin que genera el shortcode sigue activo pero la API no lo procesa por defecto.</p>
<h2>Eliminar shortcodes del feed RSS</h2>
<p>El feed RSS de WordPress es otro lugar donde los shortcodes huérfanos causan problemas. Los lectores de feeds y los agregadores de contenido muestran el shortcode en texto plano, lo que da muy mala imagen.</p>
<p>Y si tienes configurada alguna integración de email marketing que consume el feed automáticamente para enviar newsletters (algo habitual en plataformas como Mailchimp, MailerLite o ConvertKit con la opción RSS-to-email), ese shortcode en crudo llega directamente a la bandeja de entrada de tus suscriptores.</p>
<p>La solución es limpiar el contenido antes de que se vuelque en el feed. El código actúa sobre dos filtros: <code>the_content_feed</code> para el contenido completo de las entradas en el feed, y <code>the_excerpt_rss</code> para los extractos:</p>
<pre>// Elimina shortcodes del contenido que aparece en el feed RSS.
// Afecta solo al feed, no al contenido visible en la web.
add_filter( 'the_content_feed', 'ayudawp_strip_shortcodes_rss' );
add_filter( 'the_excerpt_rss', 'ayudawp_strip_shortcodes_rss' );
function ayudawp_strip_shortcodes_rss( $content ) {
    // strip_shortcodes() elimina todos los shortcodes no registrados
    // do_shortcode() procesa los que sí están registrados antes de eliminar los huérfanos
    return strip_shortcodes( do_shortcode( $content ) );
}</pre>
<p>El orden importa aquí: primero se procesan con <code>do_shortcode</code> los que tienen un plugin activo que los gestiona (convirtiendo esos shortcodes en HTML correcto), y luego <code>strip_shortcodes</code> elimina los que han quedado sin procesar porque no tienen plugin que los gestione.</p>
<p>Si prefieres eliminar absolutamente todos los shortcodes del feed, incluyendo los que sí están registrados, simplifica el snippet a solo <code>return strip_shortcodes( $content );</code>.</p>
<h2>Cómo no volver a estar en esta situación</h2>
<p>Arreglar el problema está bien. No volver a tenerlo está mucho mejor. Estas son las costumbres que marcan la diferencia a largo plazo.</p>
<ul>
<li><strong>Limpia antes de desinstalar:</strong> Cuando vayas a eliminar un plugin que usa shortcodes, búscalos primero (con cualquiera de los métodos de localización que hemos visto) y reemplázalos por el contenido real o elimínalos antes de desactivar el plugin. Una vez desactivado, pierdes la referencia de qué shortcodes usaba, así que es mucho más difícil localizarlos.</li>
<li><strong>Instala el plugin sustituto antes de desinstalar el anterior:</strong> Si cambias de plugin de formularios, de sliders o de cualquier otra herramienta que use shortcodes, activa el nuevo plugin antes de desactivar el anterior. Así tienes tiempo de migrar el contenido con ambos activos y puedes verificar que todo funciona antes de hacer la transición definitiva.</li>
<li><strong>Documenta qué shortcodes usa cada plugin activo:</strong> En webs con mucho contenido o en webs de clientes, tener un registro de qué plugin gestiona cada shortcode que aparece en el contenido puede ahorrarte horas de investigación en el futuro. No hace falta nada sofisticado: una nota en el bloc o un documento compartido con el cliente es suficiente.</li>
<li><strong>Haz auditorías periódicas:</strong> Una vez al año, o cada vez que hagas una ronda de limpieza de plugins, ejecuta las consultas SQL de localización para ver si hay shortcodes sin procesar en el contenido. Con la práctica tarda cinco minutos y puede evitar problemas mayores.</li>
<li><strong>Prioriza herramientas que no creen dependencia de shortcodes:</strong> El ecosistema WordPress ha evolucionado mucho en este sentido. Gutenberg y los maquetadores modernos guardan el contenido en formatos más portátiles. Elementor guarda en JSON, Gutenberg en HTML con atributos de bloque, Divi 5 también ha abandonado los shortcodes. Si vas a empezar un proyecto nuevo o a rediseñar uno existente, ten en cuenta la portabilidad del contenido: qué pasa con lo que has construido si dentro de tres años cambias de herramienta.</li>
<li><strong>Para formularios, usa bloques Gutenberg cuando puedas:</strong> Plugins modernos como WPForms, Gravity Forms o Fluent Forms ofrecen tanto shortcode como bloque de Gutenberg. Si usas el bloque de Gutenberg para insertar el formulario, el contenido es mucho más portable y no te deja shortcodes huérfanos si cambias de plugin: simplemente el bloque dejará de procesarse.</li>
</ul>
<h2>¿Qué método deberías usar según el caso?</h2>
<p>Con tantas opciones, puede ser útil tener claro cuándo usar cada una. La elección depende del volumen de shortcodes afectados, de si quieres eliminarlos de la base de datos o solo evitar que se muestren, y de tu nivel de comodidad técnica.</p>
<ul>
<li><strong>Si tienes pocos shortcodes en pocas páginas</strong>, edítalas a mano. Es lo más limpio, tienes control total y no hay riesgo de romper nada.</li>
<li><strong>Si tienes muchos shortcodes y necesitas una solución inmediata sin tocar la base de datos</strong>, el códigio de neutralización con <code>add_shortcode</code> devolviendo vacío es tu primer paso. Los shortcodes desaparecen de pantalla en segundos. Después planifica la limpieza definitiva.</li>
<li><strong>Si los shortcodes son todos exactamente iguales</strong> (mismo texto en todos los usos), Better Search Replace o un <code>UPDATE</code> directo de SQL lo resuelve en minutos.</li>
<li><strong>Si los shortcodes tienen atributos variables</strong> (IDs diferentes en cada uso, como es el caso de todos los formularios y sliders), necesitas expresiones regulares. WP-CLI con <code>--regex</code> o <code>REGEXP_REPLACE</code> de MySQL son las herramientas adecuadas.</li>
<li><strong>Si los shortcodes tienen etiqueta de cierre y envuelven contenido que quieres conservar</strong>, el script PHP de limpieza masiva (método 6) es el más apropiado: elimina las etiquetas pero mantiene el texto interior.</li>
<li><strong>Si el problema está en la API REST o en el feed RSS</strong>, los filtros específicos de esos apartados resuelven el problema de forma aislada sin tocar el contenido de la base de datos ni afectar a la web visible.</li>
<li><strong>Si el origen del problema es Divi 4.x</strong> la migración a Divi 5 es la solución que resuelve el problema de los shortcodes de raíz y de paso te da acceso a un maquetador más moderno y más rápido.</li>
</ul>
<p>Si aún te quedan dudas me preguntas en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/eliminar-shortcodes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GitHub va a usar tu código para entrenar la IA de Microsoft … si no haces nada para evitarlo</title>
		<link>https://ayudawp.com/github-entrenar-ia-microsoft/</link>
					<comments>https://ayudawp.com/github-entrenar-ia-microsoft/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 30 Mar 2026 06:28:55 +0000</pubDate>
				<category><![CDATA[Inteligencia Artificial y WordPress]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Copilot]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[RGPD]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158820</guid>

					<description><![CDATA[El 25 de marzo de 2026 GitHub publicó una actualización de su política de datos de interacción con Copilot junto con cambios en su política de privacidad y condiciones de servicio. El cambio principal es que los datos de interacción con GitHub Copilot de los usuarios de los planes Free, Pro y Pro+ se van a utilizar para entrenar y mejorar modelos de IA, salvo que el usuario se niegue.]]></description>
										<content:encoded><![CDATA[<p>GitHub va a usar tu código para entrenar su IA. Si no haces nada, ya estás dentro.</p>
<p>Si ayer te llegó <strong>un email de GitHub</strong> con un tono muy amable hablándote de «<strong>mejoras en la asistencia de IA</strong>» y «<strong>prácticas habituales en la industria</strong>«, que sepas que <strong>lo que te están diciendo, en plata, es que a partir del 24 de abril van a usar todo lo que hagas con Copilot para entrenar los modelos de inteligencia artificial de Microsoft</strong>.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158823 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/carta-github-entrenar-ia-con-tu-codigo.jpg" alt="carta github entrenar ia con tu codigo" width="1200" height="1398" srcset="https://ayudawp.com/wp-content/uploads/2026/03/carta-github-entrenar-ia-con-tu-codigo.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/carta-github-entrenar-ia-con-tu-codigo-768x895.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Tu código, tus conversaciones con Copilot, la estructura de tus proyectos, los nombres de tus archivos, tus comentarios en el código, todo</strong>. Y lo peor es que s<strong>i no entras en los ajustes y lo desactivas tú, es posible que ya estés dentro</strong>. Esto es lo que se llama un modelo <code>opt-out</code>, es decir, que cuentan contigo salvo que digas expresamente que no.</p>
<p>Vamos a ver qué hay detrás de este cambio, <strong>qué implica para los que desarrollamos con WordPress</strong> y cómo protegerte si no te hace gracia.</p>
<h2>¿Qué ha cambiado exactamente?</h2>
<p>El 25 de marzo de 2026 GitHub publicó <a href="https://github.blog/news-insights/company-news/updates-to-github-copilot-interaction-data-usage-policy/" target="_blank" rel="nofollow noopener">una actualización de su política de datos de interacción con Copilot</a> junto con <a href="https://github.blog/changelog/2026-03-25-updates-to-our-privacy-statement-and-terms-of-service-how-we-use-your-data/" target="_blank" rel="nofollow noopener">cambios en su política de privacidad y condiciones de servicio</a>. El cambio principal es que <strong>los datos de interacción con GitHub Copilot de los usuarios de los planes Free, Pro y Pro+ se van a utilizar para entrenar y mejorar modelos de IA</strong>, salvo que el usuario se niegue.</p>
<p>La fecha límite es el <strong>24 de abril de 2026</strong>. A partir de ese día, si no has tocado nada en tus ajustes, tus datos entran en el saco del entrenamiento.</p>
<p>Los usuarios de Copilot Business y Enterprise no se ven afectados, sus acuerdos prohíben usar esos datos para entrenamiento, los estudiantes y profesores con acceso gratuito a Copilot Pro tampoco, pero si pagas tu suscripción individual o usas el plan gratuito sí te afecta.</p>
<h2>¿Qué datos recogen?</h2>
<p>El alcance es bastante amplio. Cuando tienes la opción activada (que es como viene por defecto salvo una excepción que te cuento luego), <strong>GitHub puede recoger y usar para entrenamiento</strong>:</p>
<ul>
<li>Las <strong>sugerencias de código que aceptas o modificas</strong>.</li>
<li><strong>Lo que envías a Copilot</strong>, incluidos los fragmentos de código que ve el modelo.</li>
<li>El <strong>contexto de código</strong> alrededor de tu cursor.</li>
<li><strong>Comentarios y documentación</strong> que escribas.</li>
<li><strong>Nombres</strong> de archivos, <strong>estructura</strong> de repositorios y <strong>patrones</strong> de navegación.</li>
<li>Tus <strong>interacciones</strong> con las funciones de Copilot (chat, sugerencias inline, etc.).</li>
<li>Tus <strong>valoraciones</strong> (pulgar arriba o abajo).</li>
</ul>
<p>Es decir, <strong>prácticamente todo lo que haces mientras Copilot está activo</strong>.</p>
<p>Hay un detalle que pasa desapercibido y es importante, y es que GitHub distingue entre el código de tus repositorios privados «en reposo» (que dicen que no usan) y el código que <strong>Copilot procesa activamente cuando lo estás usando</strong>. Ese segundo caso sí entra en el entrenamiento.</p>
<p>Lo dicen ellos mismos en el anuncio, con las palabras exactas «<strong>at rest</strong>«, para dejar claro que <strong>mientras trabajas con Copilot en un repo privado, ese código sí puede acabar en el dataset</strong>.</p>
<h2>¿Con quién comparten tus datos?</h2>
<p>GitHub dice que estos datos se comparten con sus «afiliados», que en la práctica significa Microsoft y sus filiales. Personal de GitHub y Microsoft que trabaja en desarrollo de modelos de IA puede acceder a ellos, y también pueden contratar proveedores de servicios para ayudar con el entrenamiento, aunque bajo contrato.</p>
<p><strong>Lo que dicen que no hacen</strong> es compartir estos datos con proveedores de modelos de IA de terceros ni venderlos. Eso sí, que los datos acaben en Microsoft, la empresa matriz que controla GitHub, y casualmente también accionista mayoritaria de OpenAI, no es exactamente que se queden «en casa».</p>
<p>Puedes consultar la <a href="https://github.com/orgs/community/discussions/188488" target="_blank" rel="nofollow noopener">FAQ oficial de GitHub con todas las preguntas frecuentes</a> sobre este cambio.</p>
<h2>El problema del opt-out en Europa</h2>
<p>Desde el punto de vista legal, GitHub justifica el uso de datos de usuarios europeos apelando al «interés legítimo» como base legal bajo el RGPD. Es la misma estrategia que han usado Meta con los datos de Instagram y Facebook, y LinkedIn con los datos de sus usuarios para entrenar sus modelos.</p>
<p>El <a href="https://www.edpb.europa.eu/news/news/2024/edpb-opinion-ai-models-gdpr-principles-support-responsible-ai_en" target="_blank" rel="nofollow noopener">Comité Europeo de Protección de Datos (EDPB) reconoció en su dictamen de diciembre de 2024</a> que el interés legítimo puede servir como base para entrenar modelos de IA, pero con condiciones estrictas, vamos, que hay que demostrar que es necesario, hacer un análisis de proporcionalidad y tener en cuenta las «expectativas razonables» de los usuarios. Ofrecer un mecanismo de <code>opt-out</code> incondicional cuenta como medida positiva, y GitHub lo ofrece.</p>
<p>Pero la cosa no está tan clara como parece.</p>
<p>La autoridad italiana de protección de datos multó a OpenAI con 15 millones de euros en diciembre de 2024 por fallos en la evaluación del interés legítimo y en la transparencia al entrenar ChatGPT. Y NOYB, la organización de Max Schrems, ha presentado denuncias contra Meta en 11 países de la UE y contra X en 9 jurisdicciones por usar datos personales para entrenamiento de IA sin consentimiento explícito. Su posición es que el <code>opt-out</code> (aceptación implícita) no basta, debería ser <code>opt-in</code> (aceptación explícita).</p>
<p>Contra GitHub no hay denuncia todavía pero el patrón es idéntico al de Meta y X así que no sería raro que llegue.</p>
<p>Para los que vivimos en España la clave es que el RGPD exige que el consentimiento sea libre, específico, informado e inequívoco.</p>
<p>email con 30 días de aviso diciendo «si no haces nada, entendemos que aceptas» encaja mal con esa definición. Otra cosa es que GitHub pueda argumentar que no necesita consentimiento sino que se apoya en interés legítimo, pero esa base legal está siendo cuestionada en toda Europa para estos casos.</p>
<h2>Lo que afecta a los desarrolladores WordPress</h2>
<p>Aquí viene la parte que más nos toca. Si eres desarrollador WordPress y usas Copilot mientras trabajas en proyectos de clientes, piénsalo dos veces.</p>
<p>Cuando usas Copilot, el modelo tiene acceso al contexto de tu código, el archivo en el que estás, los archivos relacionados, los nombres de funciones, la estructura del proyecto. Si estás trabajando en el tema personalizado de un cliente, en un plugin con lógica de negocio específica o en cualquier código que no sea tuyo, fragmentos de ese trabajo pueden acabar en el dataset de entrenamiento de Microsoft.</p>
<p>Esto tiene <strong>implicaciones de confidencialidad serias</strong>.</p>
<p>Si tienes un contrato con tu cliente que incluye <strong>cláusulas de confidencialidad o de propiedad intelectual</strong> (y si no lo tienes, deberías), el hecho de que partes de su código puedan acabar alimentando un modelo de IA de una tercera empresa es, como mínimo, un <strong>problema contractual</strong>.</p>
<p>Y si tu cliente está en la UE y su código contiene datos personales (nombres en bases de datos, emails en configuraciones, etc.), también es un problema de RGPD.</p>
<p>La solución más directa es desactivar el entrenamiento en tus ajustes de Copilot. Puedes seguir usando Copilot con normalidad, simplemente tus datos no se envían para entrenar modelos.</p>
<h2>Y para el proyecto WordPress en GitHub, ¿qué pasa?</h2>
<p>El desarrollo de WordPress depende cada vez más de GitHub. La <a href="https://github.com/WordPress" target="_blank" rel="nofollow noopener">organización WordPress en GitHub</a> tiene <strong>191 repositorios públicos</strong>, siendo los más importantes <a href="https://github.com/WordPress/gutenberg" target="_blank" rel="nofollow noopener">Gutenberg</a> (el editor de bloques, con más de 11.500 estrellas), <a href="https://github.com/WordPress/wordpress-develop" target="_blank" rel="nofollow noopener">wordpress-develop</a> (el repo de desarrollo del core), <a href="https://github.com/WordPress/wordpress-playground" target="_blank" rel="nofollow noopener">WordPress Playground</a> (WordPress en el navegador), Openverse (búsqueda de medios con licencia libre) y uno bastante goloso que se llama <a href="https://github.com/WordPress/agent-skills" target="_blank" rel="nofollow noopener">agent-skills</a>, que proporciona conocimiento sobre WordPress a asistentes de código con IA.</p>
<p>El core de WordPress se sigue gestionando con Subversion como fuente canónica, y los repos de GitHub son espejos de solo lectura, pero Gutenberg se desarrolla de forma nativa en GitHub, con <code>issues</code>, <code>pull requests</code> y toda la infraestructura de CI/CD integrada. Incluso si quieres avisar de un fallo en el editor de WordPress en el Trac de WordPress te lo cierran y te mandan a GitHub.</p>
<p>Un matiz importante es que WordPress en GitHub no opera como una organización de pago con las protecciones de Copilot Business o Enterprise. Eso significa que la exención de entrenamiento para organizaciones de pago no se le aplican al proyecto.</p>
<p>Si un contribuidor a WordPress usa Copilot con su cuenta personal mientras trabaja en Gutenberg y no ha desactivado el entrenamiento, sus datos de interacción (que incluyen el contexto del código de Gutenberg) pueden acabar en el dataset.</p>
<p>Y lo más llamativo es que WordPress publicó en febrero de 2026 unas <a href="https://make.wordpress.org/ai/2026/02/01/ai-guidelines-for-wordpress/" target="_blank" rel="nofollow noopener">directrices de IA para contribuidores</a> que dicen expresamente que se puede usar Copilot para contribuir al proyecto, siempre que se declare el uso, el resultado sea compatible con la GPL v2 y se revise todo, pero esas directrices se escribieron <strong>antes</strong> de este cambio de política. No dicen nada sobre el entrenamiento de datos, porque cuando se redactaron, este cambio no existía.</p>
<p>Tampoco hay <strong>ningún mecanismo a nivel de repositorio para impedir que los datos se usen</strong>. Un contribuidor del hilo de la FAQ de GitHub lo preguntó directamente, y GitHub confirmó que no hay opt-out por repositorio. Copilot funciona a nivel de cuenta individual, y la configuración del repositorio no puede anular la del usuario.</p>
<p>Comparado con otros proyectos de código abierto, <strong>la postura de WordPress es bastante permisiva con la IA</strong>. Gentoo Linux, por ejemplo, <a href="https://www.phoronix.com/news/Gentoo-Starts-Codeberg-Use" target="_blank" rel="nofollow noopener">empezó a migrar de GitHub a Codeberg</a> en febrero de 2026 precisamente por la presión de Copilot, y prohíbe directamente las contribuciones generadas con IA. La <a href="https://sfconservancy.org/blog/?tag=Git" target="_blank" rel="nofollow noopener">Software Freedom Conservancy abandonó GitHub en 2022</a> y lanzó una campaña de «<strong>Give Up GitHub</strong>» por los mismos motivos.</p>
<p>WordPress ha ido en la dirección contraria: repositiorio de <code>agent-skills</code>, archivos <code>AGENTS.md</code> en Gutenberg para dar contexto a los asistentes de código, Matt Mullenweg hablando con entusiasmo de que Claude Code y herramientas similares van a generar la mayoría de contribuciones en unos años. E</p>
<p>s una apuesta clara por la IA como herramienta de desarrollo, pero este nuevo cambio de GitHub plantea una pregunta que nadie ha respondido aún, y es que <strong>¿debería el proyecto WordPress actualizar sus directrices para recomendar a sus contribuidores que desactiven el entrenamiento de datos cuando trabajan en repositorios del proyecto?</strong></p>
<h2>La cuestión de la GPL</h2>
<p>WordPress usa la licencia GPL v2, y hay un debate legal abierto sobre si entrenar una IA con código GPL obliga a que el modelo resultante también sea GPL. A día de hoy ningún tribunal ha dictaminado eso. La GPL se escribió pensando en código fuente legible por humanos y en programas que «contienen» o «enlazan» código GPL, no en matrices de parámetros estadísticos que codifican patrones extraídos de millones de líneas de código.</p>
<p>Donde sí hay un problema real es en la salida. GitHub reconoce que aproximadamente un 1% de las sugerencias de Copilot pueden contener fragmentos de más de 150 caracteres que coinciden con el código de entrenamiento. <strong>Si Copilot reproduce código GPL tal cual, sin atribución ni aviso de licencia, eso es una violación práctica de la licencia</strong> aunque la teoría sobre el modelo en sí no esté resuelta.</p>
<p>El caso legal más relevante es <strong>Doe v. GitHub</strong>, la <a href="https://githubcopilotlitigation.com/case-updates.html" target="_blank" rel="nofollow noopener">demanda colectiva presentada en noviembre de 2022</a> que acusa a Copilot de haberse entrenado con miles de millones de líneas de código sin respetar las licencias de código abierto. El tribunal desestimó las reclamaciones de copyright y DMCA, pero las de incumplimiento de contrato y violación de licencias open source siguen adelante. El caso está ahora en el noveno circuito de apelaciones y podría tener sentencia en 2026. Si sale a favor de los demandantes cambia las reglas para todo el sector.</p>
<h2>Cómo desactivar el entrenamiento de la IA de Microsoft</h2>
<p><strong>El proceso es sencillo</strong> y no afecta al funcionamiento de Copilot. Sigues recibiendo sugerencias con normalidad, lo único que cambia es que tus datos dejan de alimentar los modelos.</p>
<ol>
<li>Ve a <a href="https://github.com/settings/copilot" target="_blank" rel="nofollow noopener"><strong>github.com/settings/copilot</strong></a>.</li>
<li>Busca la sección de <strong>Privacy</strong> (Privacidad).</li>
<li>Desactiva la opción que permite a GitHub usar tus datos para entrenamiento de modelos de IA.</li>
<li>Guarda los cambios.</li>
</ol>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158821 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/desactivar-entrenamiento-ia-codigo-copilot-github.jpg" alt="desactivar entrenamiento ia codigo copilot github" width="1200" height="338" srcset="https://ayudawp.com/wp-content/uploads/2026/03/desactivar-entrenamiento-ia-codigo-copilot-github.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/desactivar-entrenamiento-ia-codigo-copilot-github-768x216.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Si ya tenías desactivada la opción anterior de recopilación de datos</strong> para mejoras del producto, tu configuración se ha mantenido y no necesitas hacer nada.</p>
<p><strong>Mi consejo es que lo desactives</strong>, especialmente si trabajas con código de clientes o contribuyes a proyectos de código abierto. <strong>No pierdes nada en la experiencia de uso de Copilot y te ahorras posibles problemas de confidencialidad y de cumplimiento normativo</strong>.</p>
<h2>¿Y ahora qué?</h2>
<p>Este cambio de GitHub no es un caso aislado ni de lejos, es la misma jugada que ya hemos visto con Meta, LinkedIn, X y Adobe de cambiar las condiciones por defecto, confiar en que la mayoría de usuarios no va a leerse el email ni cambiar nada, y usar esa inercia como base de datos de entrenamiento gratuita.</p>
<p>La diferencia con GitHub es que aquí no hablamos de fotos de vacaciones o publicaciones en redes sociales, hablamos de código. <strong>En GitHub subes código de trabajo, código de clientes, código de proyectos de código abierto con licencias específicas</strong>. El impacto potencial es más técnico, más contractual y más difícil de deshacer.</p>
<p>Mientras tanto, el caso Doe v. GitHub sigue su curso en apelación, las autoridades europeas de protección de datos siguen cuestionando los modelos de aceptación explícita (<code>opt-out</code>) para entrenamiento de IA, y la comunidad de código abierto sigue dividida entre los que abrazan la IA como herramienta de desarrollo y los que ven cómo su trabajo acaba alimentando modelos propietarios sin contrapartida.</p>
<p>Yo no estoy ni en un extremo ni en otro, sino en lo que creo que es lo más lógico, además de legítimo: abrazo la IA como herramienta, pero no admito que las empresas que <em>venden</em> la herramienta se apropien de mi contenido, creado con la herramienta o no.</p>
<p>Lo que sí puedes hacer ya mismo es entrar en <a href="https://github.com/settings/copilot" target="_blank" rel="nofollow noopener">tus ajustes de Copilot en GitHub</a> y decidir por tu cuenta si quieres que tu código sirva para entrenar la IA de Microsoft. Eso no te lo puede decidir nadie más.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/github-entrenar-ia-microsoft/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo crear un plugin WordPress con IA sin tener ni idea de programar</title>
		<link>https://ayudawp.com/vibe-coding-plugin-wordpress/</link>
					<comments>https://ayudawp.com/vibe-coding-plugin-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 07:28:00 +0000</pubDate>
				<category><![CDATA[Inteligencia Artificial y WordPress]]></category>
		<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158610</guid>

					<description><![CDATA[Si llevas tiempo usando WordPress seguramente has pensado alguna vez «me gustaría un plugin que hiciera exactamente esto» pero lo has descartado porque no sabes programar o no tenías dinero para contratar a alguien que te lo programe. Eso, hasta hace poco, era un muro infranqueable, pero la realidad es que ya no.]]></description>
										<content:encoded><![CDATA[<p>Si llevas tiempo usando WordPress seguramente has pensado alguna vez «<strong>me gustaría un plugin que hiciera exactamente esto</strong>» pero lo has descartado porque no sabes programar o no tenías dinero para contratar a alguien que te lo programe. Eso, hasta hace poco, era un muro infranqueable, pero la realidad es que ya no.</p>
<p>Con la inteligencia artificial conversacional <strong>puedes crear un plugin de WordPress completo, funcional, seguro</strong> y hasta publicable en el repositorio oficial de WordPress.org sin escribir ni una sola línea de código tú mismo. Se le llama <strong><em>vibe coding</em></strong> y, <a href="https://ayudawp.com/vibe-agentic-coding/" target="_blank" rel="noopener ugc">como ya te conté en detalle</a>, consiste en <strong>describir lo que quieres a una IA y dejar que ella genere el código por ti</strong>.</p>
<p>Pero ojo, que no sea magia no significa que no requiera trabajo. La IA escribe el código, sí, pero tú tienes que saber qué pedirle, cómo probarlo y cómo asegurarte de que lo que te ha dado funciona de verdad y no es un desastre que va a romper tu web. Eso es exactamente lo que vamos a hacer en este tutorial.</p>
<p>Vamos a crear juntos, paso a paso, un plugin de barra de progreso de lectura con tiempo estimado. Un plugin real, útil, con página de ajustes, permisos por rol, selección de tipos de contenido, personalización de colores y posición. Al final del tutorial lo tendrás funcionando en tu WordPress de prueba y, si quieres, publicado en tu web, GitHub o incluso en el repositorio oficial de WordPress.org, esto ya lo decides al final.</p>
<p>Si quieres contexto sobre <a href="https://ayudawp.com/crear-plugins-con-ia/" target="_blank" rel="noopener ugc">por qué es bueno que más gente cree plugins con IA</a> o prefieres valorar <a href="https://ayudawp.com/inteligencia-artificial-crear-contenidos-codigo/" target="_blank" rel="nofollow noopener">los argumentos en contra</a> y <a href="https://ayudawp.com/ia-crear-contenidos-codigo/" target="_blank" rel="noopener ugc">a favor</a> antes de empezar, ahí tienes los artículos. Aquí vamos directos a la práctica.</p>
<h2>Lo que necesitas antes de empezar</h2>
<p>No necesitas saber programar, pero sí tener unas cuantas herramientas preparadas. Sin ellas el tutorial no funciona.</p>
<p><strong>Un sitio WordPress de prueba:</strong> Esto es innegociable: nunca pruebes un plugin nuevo en tu web en producción. Necesitas un WordPress local o un staging donde puedas romper cosas sin consecuencias. Si no tienes uno montado, <a href="https://ayudawp.com/entornos-desarrollo-local-wordpress/" target="_blank" rel="noopener ugc">sigue esta guía de entornos de desarrollo local</a> y vuelve aquí cuando lo tengas listo.</p>
<p><strong>Un editor de texto/código:</strong> Te recomiendo <a href="https://code.visualstudio.com/" target="_blank" rel="nofollow noopener">Visual Studio Code</a>, que es gratuito, funciona en todos los sistemas operativos y es el que usa casi todo el mundo. No vas a escribir código en él, pero lo necesitas para organizar los archivos del plugin y copiar lo que te dé la IA en cada archivo correspondiente.</p>
<p><strong>Acceso a una IA conversacional:</strong> No voy a recomendar ninguna en concreto. Hay varias buenas para generar código (Claude, ChatGPT, Gemini, Copilot…) y cada una tiene sus ventajas. Lo que sí te digo es que para generar código de plugins las versiones de pago suelen dar resultados bastante mejores que las gratuitas, y lo ideal es una que permita conversaciones largas y adjuntar archivos. Si quieres ahorrar costes, <a href="https://ayudawp.com/ia-local/" target="_blank" rel="noopener ugc">también puedes usar IA en local</a>, aunque los resultados para código complejo suelen ser inferiores a los de los modelos grandes.</p>
<p><strong><a href="https://es.wordpress.org/plugins/plugin-check/" target="_blank" rel="nofollow noopener">Plugin Check</a> (PCP):</strong> Instálalo en tu WordPress de prueba. Es el plugin oficial del equipo de revisión de WordPress.org y analiza tu plugin buscando problemas de seguridad, rendimiento y cumplimiento de estándares. Vas a usarlo bastante.</p>
<p><strong>Query Monitor:</strong> Otro plugin imprescindible para el WordPress de prueba. <a href="https://wordpress.org/plugins/query-monitor/" target="_blank" rel="nofollow noopener">Query Monitor</a> te muestra indicadores visuales de si algo va mal: consultas lentas a la base de datos, errores de PHP, problemas de rendimiento… No necesitas entender el código para ver que hay alertas rojas donde no debería haberlas.</p>
<p><a href="https://es.wordpress.org/plugins/wp-crontrol/" target="_blank" rel="nofollow noopener"><strong>WP Crontrol</strong></a>: También obligatorio, y no solo como desarrollador. Este plugin sirva para <em>crontrolar</em> lo que hacen las tareas en segundo plano que se ejecutan en WordPress, de plugins, temas, del mismo WordPress. A los efectos de desarrollo muchas veces te va a ayudar a parar procesos, ejecutarlos anticipadamente para comprobar si funcionan, montones de cosas que cuando las necesites me entenderás.</p>
<p><a href="https://es.wordpress.org/plugins/anticache/" target="_blank" rel="nofollow noopener"><strong>Kit de emergencia anti-caché</strong></a>: ¿A que no quieres tener que andar vaciando cachés cada vez que hagas un cambio? Pues instala este plugin, <a href="https://ayudawp.com/desactivar-caches/" target="_blank" rel="noopener ugc">lo creé justo para no pelearte con la caché en entornos de desarrollo</a>, y <em>Vibe Coder</em> o no, estás en modo desarrollo ¿o no te habías dado cuenta?</p>
<p><a href="https://es.wordpress.org/plugins/download-plugin/" target="_blank" rel="nofollow noopener"><strong>Download Plugin</strong></a>: Este plugin no hace falta que lo tengas siempre instalado, pero conviene para después de hacer las pruebas, para descargarte el zip finalizado de la instalación de desarrollo. Cuando lo activas añade un enlace en la pantalla de plugins para descargarlo fácilmente.</p>
<p><strong>Activar el modo debug:</strong> Tienes dos opciones. La sencilla es instalar un plugin como <a href="https://es.wordpress.org/plugins/debug-log-manager/" target="_blank" rel="nofollow noopener">Debug Log Manager</a>, que te permita activar y desactivar las constantes de depuración de WordPress directamente desde el escritorio, sin tocar archivos, y que además incluye un visor del registro de errores integrado.</p>
<p>La manual pasa por abrir el archivo <code>wp-config.php</code> de tu instalación (está en la carpeta raíz de WordPress) y añadir estas líneas justo antes de donde dice <code>/* That's all, stop editing! */</code>:</p>
<pre>define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );</pre>
<p>Con esto WordPress guardará todos los errores en un archivo llamado <code>debug.log</code> dentro de la carpeta <code>wp-content</code>. Si estás en local cualquiera de las dos opciones te vale, si estás en un staging online el plugin es más cómodo.</p>
<p>Para una visión completa de todas las herramientas disponibles para desarrollo WordPress tienes <a href="https://ayudawp.com/herramientas-desarrollo-wordpress-imprescindibles/" target="_blank" rel="noopener ugc">este artículo con todas las imprescindibles</a>.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158626 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/plugins-depuracion-vibe-coding-1200x726.jpg" alt="plugins depuracion vibe coding" width="1200" height="726" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugins-depuracion-vibe-coding-1200x726.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugins-depuracion-vibe-coding-768x464.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugins-depuracion-vibe-coding-1536x929.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugins-depuracion-vibe-coding.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<h2>Antes de pedirle nada a la IA, piensa y planifica</h2>
<p>Este es el paso que separa un plugin decente de un engendro con 47 errores, y también es un paso previo que a la larga te va a ahorrar una enorme pérdida de tiempo posterior. Hazme caso, aprende de mis errores y antes de abrir la IA, siéntate y piensa.</p>
<h3>¿Hace falta tu plugin?</h3>
<p>Antes de dedicar tiempo a crearlo, comprueba lo más obvio:</p>
<ul>
<li>Busca en el <a href="https://wordpress.org/plugins/" target="_blank" rel="nofollow noopener">directorio de plugins de WordPress.org</a> con diferentes términos. ¿Existe ya algo que hace exactamente lo mismo?</li>
<li>Si hay varios que hacen algo parecido, ¿el tuyo aporta algo diferente? ¿Lo resuelve de otra forma, es más sencillo, más ligero, tiene un enfoque distinto?</li>
<li>¿Resuelve un problema real que tenga suficiente gente, o es un capricho personal que no le interesa a nadie más?</li>
</ul>
<p>Si la respuesta honesta es «<strong>ya hay cinco que lo hacen igual de bien</strong>», ahórrate el tiempo y usa uno de esos. No pasa nada, la idea es crear cosas que aporten, no duplicar por duplicar.</p>
<h3>Ten muy claro qué es lo que quieres</h3>
<p>Esto <strong>es lo que va a convertirse en tu prompt</strong>, así que cuanto más claro lo tengas aquí, mejor será el resultado. Tienes obligatoriamente que hacerte estas preguntas:</p>
<ul>
<li>¿Qué hace el plugin exactamente? Funcionalidad concreta, nada de ideas vagas tipo «algo para mejorar la experiencia de lectura».</li>
<li>¿Dónde aparece? ¿Solo en el frontend, solo en el panel de administración, en ambos?</li>
<li>¿Qué opciones puede configurar el usuario?</li>
<li>¿Quién puede configurarlo? ¿Solo el administrador, también los editores?</li>
<li>¿En qué tipos de contenido funciona? ¿Entradas, páginas, custom post types?</li>
<li>¿Qué NO debe hacer? Limitar el alcance es tan importante como definir lo que sí hace.</li>
</ul>
<p>Para nuestro plugin de ejemplo, la especificación quedaría así:</p>
<ul>
<li><strong>Qué hace</strong>: muestra una barra de progreso de lectura que avanza según el usuario hace scroll, y el tiempo estimado de lectura del contenido.</li>
<li><strong>Dónde aparece</strong>: la barra en el frontend (parte superior o inferior de la ventana), el tiempo estimado dentro del contenido. Los ajustes en el panel de administración.</li>
<li><strong>Opciones configurables</strong>: color de la barra, posición (arriba o abajo), altura de la barra, mostrar u ocultar el tiempo estimado, velocidad de lectura en palabras por minuto, en qué tipos de contenido aparece.</li>
<li><strong>Quién lo configura</strong>: solo usuarios con rol de administrador.</li>
<li><strong>En qué contenido</strong>: entradas por defecto, pero configurable para incluir páginas u otros tipos de contenido.</li>
<li><strong>Qué NO hace</strong>: no guarda datos de los visitantes, no añade analytics, no se conecta a servicios externos, no modifica el contenido del post.</li>
</ul>
<h2>Dale habilidades a la IA: skills para WordPress</h2>
<p>Antes de pedirle que genere código hay algo que <strong>marca la diferencia entre un resultado mediocre y uno profesional</strong>, y es ni más ni menos algo que habrás leído por ahí que es un nivel avanzado, pero que resulta que es muy sencillo de aplicar. Me refiero a <strong>darle a la IA conocimiento especializado sobre cómo se programa bien en WordPress</strong>.</p>
<p>Las <strong><em>skills</em> o instrucciones especializadas</strong> son archivos de texto que <strong>enseñan a la IA las buenas prácticas, los patrones correctos y los errores más comunes</strong>, en este caso en el desarrollo de plugins. Sin ellas, la IA tiende a generar código anticuado, con fallos de seguridad o que no pasaría la revisión del directorio de plugins de WordPress.org, que <strong>debe ser nuestro estándar a conseguir</strong>, lo vayamos a publicar o no.</p>
<p>¿Y por qué te importa esto si no sabes programar? Porque tú no puedes revisar si el código sigue los estándares de WordPress, pero si la IA tiene instrucciones claras sobre esos estándares antes de empezar, <strong>las probabilidades de que lo haga bien suben mucho</strong>.</p>
<p><strong>Dónde conseguir skills de IA:</strong></p>
<ul>
<li>Las <a href="https://github.com/fernandotellado/ai-skills" target="_blank" rel="nofollow noopener">skills de AyudaWP</a> están enfocadas específicamente a desarrollo de plugins, seguridad y rendimiento en WordPress. Son las que yo uso y las que te recomiendo como punto de partida.</li>
<li>El <a href="https://github.com/WordPress/agent-skills" target="_blank" rel="nofollow noopener">repositorio oficial de WordPress (agent-skills)</a> tiene un conjunto más amplio que cubre también bloques, temas y la API REST.</li>
<li>Tanto <a href="https://github.com/anthropics/skills" target="_blank" rel="nofollow noopener">Anthropic</a> como <a href="https://github.com/openai/skills" target="_blank" rel="nofollow noopener">OpenAI</a> tienen sus propios repositorios de skills con instrucciones genéricas y específicas para distintos tipos de desarrollo.</li>
</ul>
<p><strong>Cómo usar skills de IA:</strong></p>
<p>Cada IA tiene su forma de cargar este tipo de instrucciones. Algunas permiten adjuntar archivos al inicio de la conversación, otras tienen carpetas de configuración donde las detectan automáticamente, y otras aceptan que pegues las instrucciones directamente en el primer mensaje. Lo importante es que la IA las tenga disponibles <strong>antes</strong> de pedirle que genere código, no después.</p>
<p>Si quieres profundizar en cómo configurar cada IA concreta (Claude, ChatGPT, Copilot, Cursor…) para que cargue estas instrucciones de forma permanente, tienes <a href="https://ayudawp.com/configurar-ia-programar-wordpress/" target="_blank" rel="noopener ugc">esta guía completa sobre cómo configurar las IAs para programar WordPress</a>.</p>
<h2>El prompt: unas buenas instrucciones definen la calidad del resultado</h2>
<blockquote><p><strong>No pidas todo de golpe</strong></p></blockquote>
<p>Este es probablemente <strong>el consejo más importante de todo este tutorial</strong>. La tentación es describir el plugin entero en un mensaje enorme del tipo «quiero una barra de lectura con ajustes de color, posición, tiempo estimado, permisos por rol, selector de tipos de contenido…».</p>
<p>El problema con las IAs, y en general en la vida, es que <strong>cuantas más cosas metes en un solo prompt, más probabilidades hay de que algo falle</strong>. Y cuando falla no sabes si el error está en la barra, en los ajustes, en los permisos o en la interacción entre todos ellos.</p>
<p>El enfoque que funciona es <strong>hacer peticiones por versiones</strong>, de manera que empieces con la versión más básica que haga algo visible y funcional, y una vez eso funcione y esté probado, añades la siguiente pieza, y así paso a paso hasta completar el plugin.</p>
<p>Para nuestro ejemplo, como yo abordaría las versiones sería así:</p>
<ul>
<li><strong>Versión 1</strong>: solo la barra de progreso, con un color fijo, que aparezca en todas las entradas. Sin ajustes, sin extras. Lo mínimo para ver que funciona.</li>
<li><strong>Versión 2</strong>: página de ajustes con selector de color, posición de la barra (arriba/abajo), altura y selector de tipos de contenido.</li>
<li><strong>Versión 3</strong>: cálculo y visualización del tiempo estimado de lectura, con opción de activarlo o desactivarlo y configurar las palabras por minuto.</li>
<li><strong>Versión 4</strong>: permisos por rol para acceder a la página de ajustes.</li>
</ul>
<h3>Cómo escribir un buen prompt para un plugin de WordPress</h3>
<p>La estructura que mejor funciona tiene estas partes:</p>
<ol>
<li><strong>Rol y contexto</strong>: dile a la IA quién es y para qué trabaja.</li>
<li><strong>Qué tiene que hacer esta versión concreta</strong>: solo la funcionalidad de esta versión, nada más.</li>
<li><strong>Requisitos técnicos no negociables</strong>: estándares de WordPress, seguridad, compatibilidad PHP, archivos separados para CSS y JS, funciones con prefijo propio, preparado para traducción.</li>
<li><strong>Estructura de archivos esperada</strong>: que sepa de antemano cómo organizar el código.</li>
<li><strong>Lo que NO quieres</strong>: que no añada nada que no hayas pedido, que no proponga extras, que no sugiera mejoras.</li>
</ol>
<p>Aquí tienes el <strong>prompt real para la versión 1 de nuestro plugin</strong> de ejemplo. Puedes copiarlo tal cual y/o adaptarlo a tu propio plugin:</p>
<pre>Eres un desarrollador WordPress senior especializado en creación de plugins para el repositorio oficial de WordPress.org.

TAREA:
Crea la versión 1.0.0 de un plugin llamado "Reading Time Progress Bar Pro" con el slug "reading-time-progress-bar-pro" y el prefijo "rpb_" para todas las funciones, clases, constantes y handles.

FUNCIONALIDAD DE ESTA VERSIÓN (solo esto, nada más):
- Muestra una barra de progreso horizontal fija en la parte superior de la ventana del navegador.
- La barra avanza de 0% a 100% según el usuario hace scroll por el contenido del post.
- Solo aparece en entradas individuales (single posts).
- Color fijo: #2563eb (azul).
- Altura fija: 4px.
- La barra debe estar por encima de cualquier otro elemento (z-index alto).

REQUISITOS TÉCNICOS OBLIGATORIOS:
- Cumplir los WordPress Coding Standards.
- Compatible con PHP 7.4 hasta PHP 8.3.
- Todo el CSS en un archivo externo en /assets/css/, cargado con wp_enqueue_style().
- Todo el JavaScript en un archivo externo en /assets/js/, cargado con wp_enqueue_script().
- NUNCA imprimir etiquetas script o style directamente con PHP.
- Todas las cadenas de texto preparadas para traducción con el text domain 'reading-time-progress-bar-pro'.
- Escapar todo el output.
- Incluir archivo readme.txt válido para WordPress.org.
- El archivo PHP principal solo debe contener la cabecera del plugin, constantes y la carga de los archivos de /includes/.
- Cada funcionalidad en su archivo separado dentro de /includes/.
- Entrega todo en un archivo comprimido ZIP, listo para instalar.

ESTRUCTURA DE ARCHIVOS:
reading-time-progress-bar-pro/
├── reading-time-progress-bar-pro.php (archivo principal, solo bootstrap)
├── readme.txt
├── assets/
│   ├── css/
│   │   └── frontend.css
│   └── js/
│       └── frontend.js
└── includes/
    └── class-rpb-frontend.php

NO QUIERO:
- Nada de página de ajustes en esta versión.
- Nada de opciones configurables.
- Nada de funcionalidades extra que no haya descrito.
- Nada de sugerencias de mejoras futuras.
- Nada de explicaciones largas, solo el código de cada archivo.</pre>
<h3>Optimiza el prompt antes de enviarlo</h3>
<p>Si quieres <strong>asegurarte de que el prompt tiene buena estructura y no te falta nada importante</strong>, puedes pasarlo por el <a href="https://herramientas.ayudawp.com/#prompt-optimizer" target="_blank" rel="noopener ugc">optimizador de prompts de AyudaWP</a>.</p>
<p>Selecciona la plantilla de «<strong>Desarrollo de código WordPress</strong>», pega tu instrucción principal, ajusta el rol a desarrollador senior, marca las restricciones que apliquen (WordPress Coding Standards, sin anglicismos, código comentado) y genera la versión optimizada. Muchas veces añade contexto que se te había pasado por alto.</p>
<p>Ajustes que te recomiendo si usas el optimizador de prompts para esta tarea:</p>
<ol>
<li><strong>Plantilla inicial </strong>– Utiliza la de desarrollador de código WordPress, te ahorra clics en todos estos ajustes:
<ul>
<li>Rol e identidad de la IA.</li>
<li>Contexto y audiencia.</li>
<li>Formato de salida.</li>
</ul>
</li>
<li><strong>Restricciones y lo que debe evitar </strong>– Unos pequeños ajustes te quitarán ruido a la respuesta y aportan mejoras:
<ul>
<li>No repetir información básica obvia</li>
<li>Código siempre comentado</li>
<li>Seguir WordPress Coding Standards</li>
</ul>
</li>
<li><strong>Técnicas avanzadas –</strong> Te ayudarán y mucho:
<ul>
<li>Usar etiquetas XML para estructurar</li>
<li>Permitir preguntas de aclaración</li>
<li>Incluir ejemplo de entrada/salida (few-shot)</li>
</ul>
</li>
</ol>
<p><a href="https://ayudawp.com/?attachment_id=158656" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158656 size-thumbnail" src="https://ayudawp.com/wp-content/uploads/2026/03/prompt-inicial-vibe-coding-mejorado-150x150.jpg" alt="prompt inicial vibe coding mejorado" width="150" height="150"></a></p>
<blockquote><p>Lo mejor de usar el optimizador de prompts es que puedes descargarte los prompts mejorados y tener varias versiones, guardarlos para uso futuro, tener el historial. Vamos, imprescindible.</p></blockquote>
<h2>Bola extra: Proyectos y tareas</h2>
<p><a href="https://ayudawp.com/?attachment_id=158661" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158661 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/proyecto-plugin-reading-bar-progress-1200x633.jpg" alt="proyecto plugin reading bar progress" width="1200" height="633" srcset="https://ayudawp.com/wp-content/uploads/2026/03/proyecto-plugin-reading-bar-progress-1200x633.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/proyecto-plugin-reading-bar-progress-768x405.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/proyecto-plugin-reading-bar-progress-1536x810.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/proyecto-plugin-reading-bar-progress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Si tu IA favorita lo permite <strong>organiza tus tareas usando proyectos</strong>, carpetas o como lo llame. Este tipo de herramienta facilita cosas muy importantes:</p>
<ol>
<li>Tener tu trabajo organizado</li>
<li>Ajustes personalizados para cada tarea, distintos de las preferencias generales</li>
<li>Mantener contexto entre distintos prompts del mismo trabajo</li>
<li>Memoria contextual del trabajo al estar todo en un mismo entorno</li>
</ol>
<blockquote><p>¿Te había dicho ya que en el trabajo con IAs generativas el contexto lo es todo? Pues es así, y usando proyectos, tareas o carpetas, como se estructure tu IA, es el modo más efectivo.</p></blockquote>
<h2>Gestionar la conversación con la IA</h2>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-158659 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coder-keyboard.jpg" alt="vibe coder keyboard" width="1006" height="573" srcset="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coder-keyboard.jpg 1006w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coder-keyboard-768x437.jpg 768w" sizes="auto, (max-width: 1006px) 100vw, 1006px"></p>
<p>Antes de ver el proceso versión por versión, tres reglas que aplican a cada interacción con la IA durante todo el desarrollo del plugin:</p>
<ul>
<li><strong>La IA va a preguntar, y eso es normal:</strong> Si has hecho bien el prompt, las preguntas serán pocas y concretas: «¿quieres que el z-index sea 9999 o prefieres otro valor?», «¿el color hexadecimal incluye transparencia?». Responde solo a lo que pregunte, sin añadir ideas nuevas. Cada cosa que añadas fuera de plan es una puerta abierta a complicaciones.</li>
<li><strong>Frena la verborrea:</strong> Hay IAs que por cada línea de código te sueltan tres párrafos explicando por qué han tomado esa decisión, qué alternativas había y qué podrías mejorar en el futuro. Si te pasa, córtala: «Genera solo el código tal como lo he descrito. Sin explicaciones adicionales, sin alternativas, sin sugerencias. Solo los archivos con su código.»</li>
<li><strong>La trampa de las sugerencias infinitas:</strong> Esto es especialmente común con GPT, aunque todas lo hacen en mayor o menor medida. No hace más que de darte el código y enseguida te va a soltar cosas como, «¿quieres que añada también un modo oscuro? ¿lo integramos con Google Analytics? ¿quieres que sea compatible con AMP?». La respuesta es <strong>siempre NO</strong>. Si no estaba en la especificación que preparaste no entra. Anota las ideas que te parezcan buenas para futuras versiones, pero sigue con lo que tenías planeado, no te dejes engatusar.</li>
</ul>
<p>Si caes en esa espiral de «sí, ponle eso también», <strong>en dos horas tienes un engendro</strong> con 15 funcionalidades a medio hacer, errores que se cruzan entre sí y ninguna posibilidad real de arreglarlo que no sea empezar de cero.</p>
<p>Dicho esto, pasamos a la acción… ¿no?</p>
<h2>Versión 1: Tu primer plugin funcional</h2>
<p>Esta <strong>es la versión más importante</strong> de todo el proceso. Y no lo es porque sea la más completa (es la más básica), sino porque <strong>es donde aprendes el ciclo</strong> completo: pedir, montar, probar, corregir, auditar. Cuando domines este ciclo con la V1, repetirlo con las demás versiones es más mecánico.</p>
<h3>Paso 1: Enviar el prompt</h3>
<p><a href="https://ayudawp.com/?attachment_id=158662" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158662 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/primer-prompt-ia-plugin-wordpress-vibe-coding-1200x773.jpg" alt="primer prompt ia plugin wordpress vibe coding" width="1200" height="773" srcset="https://ayudawp.com/wp-content/uploads/2026/03/primer-prompt-ia-plugin-wordpress-vibe-coding-1200x773.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/primer-prompt-ia-plugin-wordpress-vibe-coding-768x495.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/primer-prompt-ia-plugin-wordpress-vibe-coding-1536x990.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/primer-prompt-ia-plugin-wordpress-vibe-coding.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Toma el prompt que preparaste en la sección anterior (o adáptalo a tu propio plugin) y <strong>suéltaselo a la IA</strong>. Si has cargado las skills de WordPress previamente mejor, si no, al menos pégalas en este primer mensaje o adjúntalas como archivo.</p>
<p>Recuerda que <strong>este prompt es solo para la versión 1</strong>.  Aquí solo queremos la barra de progreso con color fijo, sin ajustes, sin extras.</p>
<p>Es tentador añadir «y ya que estás, ponle también los ajustes» pero no lo hagas. <strong>Queremos algo pequeño</strong>, que podamos probar por completo y asegurarnos de que funciona antes de añadir nada más.</p>
<p><strong>Regálate pequeños triunfos</strong>, no una tarea enorme desde el principio.</p>
<h3>Paso 2: Evaluar lo que te devuelve</h3>
<p><a href="https://ayudawp.com/?attachment_id=158663" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158663 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/version-1-plugin-wordpress-vibe-coding-tras-primer-prompt-1200x773.jpg" alt="version 1 plugin wordpress vibe coding tras primer prompt" width="1200" height="773" srcset="https://ayudawp.com/wp-content/uploads/2026/03/version-1-plugin-wordpress-vibe-coding-tras-primer-prompt-1200x773.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/version-1-plugin-wordpress-vibe-coding-tras-primer-prompt-768x495.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/version-1-plugin-wordpress-vibe-coding-tras-primer-prompt-1536x990.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/version-1-plugin-wordpress-vibe-coding-tras-primer-prompt.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>La IA te debería dar un zip con todos los archivos, y si por algún motivo no puede (limitaciones de su sistema) te entregará los archivos por separado con indicaciones de cómo organizarlos en carpetas. En cualquier caso, y siempre antes de instalar tu recién y flamante nuevo plugin versión 1.0, haz una comprobación rápida:</p>
<p><strong>¿Te ha dado todos los archivos que pediste?</strong></p>
<p>Revisa que estén todos los de la estructura que indicaste en el prompt. En nuestro ejemplo deberían ser cinco: <code>reading-time-progress-bar-pro.php</code>, <code>readme.txt</code>, <code>includes/class-rpb-frontend.php</code>, <code>assets/css/frontend.css</code> y <code>assets/js/frontend.js</code>.</p>
<p>Si falta alguno, pídeselo:</p>
<pre>Falta el archivo assets/js/frontend.js. Genéralo siguiendo las mismas instrucciones del prompt original.</pre>
<p><strong>¿Ha añadido algo que no pediste?</strong></p>
<p>Mira por encima si hay archivos extra, si ha metido una página de ajustes que no tocaba, o si ha añadido funcionalidades que no estaban en el prompt. Si es así, díselo claramente:</p>
<pre>Has añadido una página de ajustes y un selector de color. No los he pedido en esta versión. Elimínalos y dame solo lo que indicaba el prompt: la barra básica con color fijo, sin opciones.</pre>
<p><strong>¿Ha empezado a hacer preguntas o sugerencias en vez de darte el código?</strong></p>
<p>Esto pasa bastante. La IA te responde con «Antes de empezar, tengo algunas preguntas sobre la implementación…» seguido de diez preguntas sobre cosas que ya estaban claras en el prompt. Si el prompt estaba bien hecho y las preguntas no aportan nada, responde:</p>
<pre>Toda la información necesaria está en el prompt. Genera el código tal como lo he descrito.</pre>
<p>Si alguna pregunta es realmente necesaria (algo que se te olvidó especificar) respóndela de forma escueta y pídele que genere el código.</p>
<h3>Paso 3: Instalar, activar y primera comprobación</h3>
<p>Ve a la pantalla de plugins en el escritorio de WordPress y haz clic en «Añadir nuevo &gt; Subir», esto ya sabes hacerlo, sube el zip y tras subirlo actívalo. Tu plugin debería aparecer en la lista con el nombre «<strong>Reading Time Progress Bar Pro</strong>», la descripción y los datos de versión que indicaste en el prompt.</p>
<p>Si por lo que sea <strong>no aparece</strong> comprueba que la carpeta está dentro de <code>wp-content/plugins/</code>, que el archivo PHP principal tiene la cabecera correcta y que no has dejado la carpeta del plugin metida dentro de otra carpeta extra (un error muy habitual al descomprimir ZIPs: <code>plugins/reading-time-progress-bar-pro/reading-time-progress-bar-pro/</code>).</p>
<p>Si aparece actívalo, y pueden pasar tres cosas:</p>
<ul>
<li><strong>Se activa sin problema:</strong> Perfecto, pasa al siguiente paso.</li>
<li><strong>Aparece un mensaje de error pero el sitio sigue funcionando:</strong> Copia el mensaje de error exacto. Lo vas a necesitar.</li>
<li><strong>Pantalla blanca o error grave:</strong> No te asustes. Accede a tu carpeta de plugins por FTP o gestor de archivos y cambia el nombre de la carpeta del plugin (por ejemplo, de <code>reading-time-progress-bar-pro</code> a <code>reading-time-progress-bar-pro-OFF</code>). Esto lo desactiva inmediatamente. Luego abre el debug log (<code>wp-content/debug.log</code>) y copia el último error que aparezca.</li>
</ul>
<p>Si has tenido un error salta directamente al paso 7 (corrección). Si todo ha ido bien sigue a continuación con el paso 5.</p>
<h3>Paso 4: Probar que funciona de verdad</h3>
<p><a href="https://ayudawp.com/?attachment_id=158667" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158667 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-activo-1200x654.jpg" alt="plugin vibe coding v1 activo" width="1200" height="654" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-activo-1200x654.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-activo-768x419.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-activo-1536x838.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-activo.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>¿A que da como gustirrinín? No me negarás que <strong>es un subidón que se active tu primer plugin hecho con IA</strong> ¿verdad?</p>
<p>Pero, ah, el hecho de que se haya activado sin errores no significa que funcione. Ahora <strong>toca comprobarlo en la web</strong>.</p>
<p>Visita una entrada de tu blog de prueba y comprueba:</p>
<ul>
<li>¿Se ve la barra azul en la parte superior de la ventana del navegador?</li>
<li>¿La barra avanza según haces scroll hacia abajo?</li>
<li>¿Llega al 100% cuando llegas al final del contenido?</li>
<li>¿Se restablece a 0% cuando vuelves arriba del todo?</li>
</ul>
<p><a href="https://ayudawp.com/?attachment_id=158669" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158669 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-funcionando-barra-progreso-visible-1200x654.jpg" alt="plugin vibe coding v1 funcionando barra progreso visible" width="1200" height="654" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-funcionando-barra-progreso-visible-1200x654.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-funcionando-barra-progreso-visible-768x419.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-funcionando-barra-progreso-visible-1536x838.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-v1-funcionando-barra-progreso-visible.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Ahora <strong>comprueba donde no debería aparecer</strong>:</p>
<ul>
<li>Visita la página de inicio o el archivo del blog. ¿Sale la barra? No debería.</li>
<li>Visita una página (no una entrada). ¿Sale? No debería en esta versión.</li>
<li>Entra en el panel de administración. ¿Sale? No debería aparecer nunca ahí.</li>
</ul>
<p>Prueba también en otro navegador (si usas Chrome, prueba en Firefox o al revés) y en el móvil (o usando el modo responsive de las herramientas de desarrollo del navegador, pulsando F12 y el icono de dispositivo).</p>
<p><strong>Si algo no funciona como debería</strong> anota exactamente qué falla para luego <em>decírselo</em> a la IA: «la barra aparece pero no se mueve al hacer scroll», «la barra no aparece en ningún sitio», «la barra aparece también en páginas y no debería». Cuanto más preciso seas más fácil será para la IA corregirlo.</p>
<h3>Paso 5: El documento resumen (tu mapa del plugin)</h3>
<p>Antes de seguir adelante, pídele a la IA un documento que te explique en lenguaje normal qué hace cada archivo del plugin y cómo se conectan entre sí:</p>
<pre>Te adjunto todos los archivos de mi plugin Reading Time Progress Bar Pro versión 1. Necesito un documento resumen en español que explique:

1. Qué hace cada archivo y cuál es su función dentro del plugin.
2. Cómo se conectan los archivos entre sí (qué archivo carga a cuál).
3. Qué hace cada sección o función principal, explicado para alguien que no sabe programar.
4. Dónde está la lógica del frontend (lo que ve el visitante).

El documento es para mi uso interno, para poder hablar contigo sobre el plugin sabiendo a qué parte me refiero.</pre>
<p><a href="https://ayudawp.com/?attachment_id=158670" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158670 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-doc-v1-1200x707.jpg" alt="plugin wordpress vibe coding doc v1" width="1200" height="707" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-doc-v1-1200x707.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-doc-v1-768x452.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-doc-v1-1536x905.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-doc-v1.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<blockquote><p>Este documento es tu salvavidas. Cuando algo falle más adelante, necesitas poder decirle a la IA «el problema está en la función que calcula el porcentaje de scroll» en vez de «no funciona». Guárdalo junto al código del plugin como oro en paño, expórtalo, adjúntalo al proyecto, copiapega en un Word, lo que te sea más cómodo.</p></blockquote>
<h3>Paso 6: Comprobaciones de seguridad y calidad</h3>
<p>Incluso si todo parece funcionar hay cosas que no se ven a simple vista. Estas herramientas las detectan por ti:</p>
<p><strong>Plugin Check (PCP)</strong>: ve a <code>Herramientas → Comprobar plugins</code> en tu escritorio de WordPress, selecciona tu plugin, activa todas las casillas y ejecuta el análisis, te dará una lista de resultados:</p>
<ul>
<li><strong>Errores</strong>: hay que corregirlos sí o sí. Son problemas de seguridad, funciones mal usadas o incumplimientos graves de los estándares.</li>
<li><strong>Advertencias</strong>: recomendaciones que conviene atender. No son graves pero pueden dar problemas en la revisión de WordPress.org.</li>
<li><strong>Recomendaciones</strong>: mejoras a tener en cuenta, casi siempre de rendimiento.</li>
</ul>
<p><a href="https://ayudawp.com/?attachment_id=158671" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158671 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v1-pcp-errores-1200x729.jpg" alt="plugin wordpress vibe coding v1 pcp errores" width="1200" height="729" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v1-pcp-errores-1200x729.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v1-pcp-errores-768x467.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v1-pcp-errores-1536x934.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v1-pcp-errores.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Si tienes errores no los ignores. Copia cada mensaje de error exacto (el texto completo, con la ruta del archivo y el número de línea), o exporta el listado completo usando los botones que ofrece Plugin Check porque los vas a necesitar en el paso siguiente.</p>
<blockquote><p>Si dudas qué formato elegir descárgalo en formato <strong>markdown</strong>, es muy ligero y a las IA les encanta.</p></blockquote>
<p><strong>Debug Log</strong>: abre la pantalla del plugin Debug Log Viewer y mira el visor del log, o abre directamente <code>wp-content/debug.log</code> con VS Code, lo que prefieras. Busca líneas que contengan el nombre de tu plugin o sus archivos. Los «<code>Fatal error</code>» y «<code>Error</code>» son problemas graves, los «<code>Warning</code>» y «<code>Notice</code>» son menores pero conviene corregirlos. Copia todo lo que encuentres y luego se lo <em>cascas</em> a la IA.</p>
<p><a href="https://ayudawp.com/?attachment_id=158672" rel="attachment wp-att-158672 nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158672 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/debug-log-manager-fernando-tellado-1200x729.jpg" alt="debug log manager fernando tellado" width="1200" height="729" srcset="https://ayudawp.com/wp-content/uploads/2026/03/debug-log-manager-fernando-tellado-1200x729.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/debug-log-manager-fernando-tellado-768x467.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/debug-log-manager-fernando-tellado-1536x934.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/debug-log-manager-fernando-tellado.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p><strong>Query Monitor</strong>: mira su panel en la barra de administración mientras visitas una entrada con la barra activa. Fíjate en dos cosas, si la pestaña de errores PHP muestra algo en rojo y si la pestaña de consultas a la base de datos tiene números inusualmente altos o alertas (suele ponerse en rojo). Para una versión 1 tan sencilla no debería haber consultas a la base de datos propias del plugin, si las hay es señal de que algo no está bien.</p>
<p><a href="https://ayudawp.com/?attachment_id=158673" rel="attachment wp-att-158673 nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158673 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/query-monitor-plugin-vibe-coding-v1-1200x774.jpg" alt="query monitor plugin vibe coding v1" width="1200" height="774" srcset="https://ayudawp.com/wp-content/uploads/2026/03/query-monitor-plugin-vibe-coding-v1-1200x774.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/query-monitor-plugin-vibe-coding-v1-768x496.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/query-monitor-plugin-vibe-coding-v1-1536x991.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/query-monitor-plugin-vibe-coding-v1.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h3>Paso 7: Correcciones y cambios – El segundo prompt casi siempre es el más importante</h3>
<p>Si las pruebas o las comprobaciones han detectado problemas toca corregir. La forma en que le describes el error a la IA es casi tan importante como el prompt original. No vale con decir «no funciona». Necesitas darle toda la información:</p>
<pre>El plugin Reading Time Progress Bar Pro versión 1 tiene los siguientes problemas.

PROBLEMA 1 - Error en el debug log:
[pega aquí el mensaje de error exacto, incluyendo archivo y número de línea]

PROBLEMA 2 - Error de Plugin Check:
[pega aquí el mensaje de PCP exacto]

PROBLEMA 3 - Funcional:
La barra aparece correctamente en las entradas pero también aparece en las páginas, y en esta versión solo debería mostrarse en entradas individuales.

Corrige estos tres problemas. No cambies nada más del código, no añadas funcionalidades nuevas, no hagas mejoras que no te haya pedido.</pre>
<p>Fíjate en lo último: «<strong>no cambies nada más</strong>». Esto es importante porque muchas IAs aprovechan una corrección para «mejorar» otras cosas que no les habías pedido, y eso puede romper lo que antes funcionaba. Tú ni caso, aunque insista.</p>
<p>Una vez te dé las correcciones, aplícalas y <strong>vuelve al paso 5</strong>, probando todo desde el principio. No solo lo que se ha corregido, sino <strong>también lo que antes funcionaba, porque una corrección puede romper otra cosa</strong>.</p>
<blockquote><p><strong>Regla de los tres intentos</strong>: si llevas tres o cuatro rondas para el mismo problema y la IA no lo resuelve, <strong>para</strong>. Borra esa parte y pídesela de nuevo desde cero en un mensaje nuevo y más claro. Es más rápido que seguir apilando parches.</p></blockquote>
<h3>Paso 8: Mejorar y auditar</h3>
<p>Cuando todo funciona y las comprobaciones salen limpias, quedan dos pasadas finales antes de dar la versión 1 por cerrada.</p>
<p><strong>Pasada de mejora: «Mejóralo»</strong></p>
<p>Pídele a la IA que revise su propio código:</p>
<pre>Te adjunto el código completo del plugin Reading Time Progress Bar Pro versión 1. Funciona correctamente y pasa Plugin Check sin errores.

Revisa todo el código buscando:
1. Problemas de seguridad que se te hayan pasado (sanitización, escapado, comprobaciones).
2. Problemas de rendimiento (assets cargándose donde no deben, código ejecutándose en cada petición innecesariamente).
3. Incumplimientos de los WordPress Coding Standards.

Dame solo las correcciones necesarias, sin añadir funcionalidades nuevas.</pre>
<p>Casi siempre encuentra algo. A veces un <code>esc_html()</code> que falta, a veces un archivo CSS cargándose también en el admin cuando solo debería cargarse en la web. Aplica las correcciones y <strong>vuelve a probar desde el principio</strong>.</p>
<p><strong>Pasada de auditoría cruzada:</strong> Coge todo el código y dáselo a la misma IA en una <strong>conversación nueva</strong> (sin contexto previo, sin historial de cómo se generó), o mejor aún, a una IA diferente:</p>
<pre>Eres un auditor de seguridad y calidad de plugins de WordPress. Te adjunto el código completo de un plugin llamado Reading Time Progress Bar Pro.

Analiza todo el código buscando:
1. Vulnerabilidades de seguridad (XSS, CSRF, inyección SQL, falta de sanitización o escapado).
2. Problemas de rendimiento.
3. Incumplimientos de los WordPress Coding Standards y de las directrices del repositorio de WordPress.org.
4. Errores lógicos o bugs potenciales.

Sé riguroso. Lista cada problema encontrado con su ubicación exacta (archivo y sección) y la corrección propuesta.</pre>
<p>La conversación nueva o con una IA diferente son importantes pues al no tener el contexto de cómo se generó el código, lo analiza con ojos frescos y podría <strong>detectar cosas que en la conversación original se pasaron por alto</strong>.</p>
<p>Aplica las correcciones relevantes, prueba una última vez, y la versión 1 está lista.</p>
<p><a href="https://ayudawp.com/?attachment_id=158674" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158674 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/pcp-plugin-vibe-coding-v1-sin-errores-1200x729.jpg" alt="pcp plugin vibe coding v1 sin errores" width="1200" height="729" srcset="https://ayudawp.com/wp-content/uploads/2026/03/pcp-plugin-vibe-coding-v1-sin-errores-1200x729.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/pcp-plugin-vibe-coding-v1-sin-errores-768x467.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/pcp-plugin-vibe-coding-v1-sin-errores-1536x934.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/pcp-plugin-vibe-coding-v1-sin-errores.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h2>Versión 2: Añadir la página de ajustes</h2>
<p>Con la versión 1 funcionando y auditada, es hora de empezar a hacer un plugin ya algo más pro, añadirle la funcionalidad de que el usuario pueda configurar el plugin sin tocar código.</p>
<h3>El prompt</h3>
<p>El prompt para cada nueva versión siempre <strong>empieza adjuntando el código completo de la versión anterior</strong>. La IA necesita saber qué hay hecho para construir encima:</p>
<pre>Te adjunto el código completo y funcional del plugin Reading Time Progress Bar Pro versión 1.0.0.

TAREA:
Actualiza el plugin a la versión 2.0.0 añadiendo SOLO lo siguiente:

PÁGINA DE AJUSTES:
- Añadir una página de ajustes dentro del menú Ajustes de WordPress (Settings API).
- Solo los usuarios con la capacidad manage_options pueden acceder.
- Los ajustes se almacenan en una única opción en la base de datos (no una opción por cada ajuste).

OPCIONES DE LA BARRA:
- Color de la barra: campo de tipo color con valor por defecto #2563eb.
- Posición: selector con dos opciones, arriba o abajo de la ventana. Por defecto arriba.
- Altura: campo numérico en píxeles, por defecto 4, mínimo 1, máximo 20.

OPCIONES DE CONTENIDO:
- Checkboxes para seleccionar en qué tipos de contenido aparece la barra. Listar todos los post types públicos del sitio dinámicamente.
- Por defecto solo 'post' (entradas) activado.

IMPLEMENTACIÓN:
- El frontend ahora debe leer los ajustes guardados en vez de usar valores fijos.
- El CSS dinámico (color, altura, posición) debe aplicarse con wp_add_inline_style(), no con estilos inline en el HTML.
- Crear un nuevo archivo includes/class-rpb-admin.php para toda la lógica de administración.
- Crear un nuevo archivo assets/css/admin.css para los estilos de la página de ajustes.
- Actualizar el readme.txt con la nueva funcionalidad.

REQUISITOS TÉCNICOS:
[los mismos que en la versión 1: WordPress Coding Standards, PHP 7.4+, archivos separados, prefijo rpb_, translation-ready, escapar todo]

NO QUIERO:
- Nada de tiempo estimado de lectura en esta versión.
- Nada de permisos por rol más allá de manage_options.
- Nada de preview en vivo de los ajustes.
- Nada de funcionalidades extra.
- Nada de sugerencias de mejoras.</pre>
<h3>¡Revisa todo!</h3>
<p>Cuando la IA te devuelva el código <strong>comprueba que los archivos originales de la V1 se han actualizado</strong> (no reemplazado por completo con algo diferente) y que los archivos nuevos (<code>class-rpb-admin.php</code>, <code>admin.css</code>) están incluidos.</p>
<p>A veces la IA te da solo los archivos nuevos y te dice «el resto queda igual», si es así pídele todos los archivos completos:</p>
<pre>Dame todos los archivos del plugin completos, incluidos los que no han cambiado. No quiero tener que adivinar cuáles se han modificado y cuáles no</pre>
<p>Monta los archivos igual que con la V1 si fuese necesario, o sea, sustituye los que han cambiado, añade los nuevos y <strong>revisa la estructura de carpetas</strong>.</p>
<h3>Probar la versión 2</h3>
<p>Primero, repite <strong>todas</strong> las pruebas de la versión 1. <strong>La barra tiene que seguir funcionando exactamente igual que antes</strong> en la web, pues si algo se ha roto al añadir los ajustes necesitas detectarlo ahora.</p>
<p>Luego, las <strong>pruebas específicas de los ajustes</strong>:</p>
<ul>
<li>Ve a <em>Ajustes</em> en el menú del escritorio. ¿Aparece la opción del plugin?</li>
<li>Entra en la página de ajustes. ¿Se ven todos los campos (color, posición, altura, tipos de contenido)?</li>
<li>¿Los valores por defecto son correctos sin haber guardado nada? (Azul, arriba, 4px, solo entradas marcado.)</li>
<li>Cambia el color a rojo, la posición a abajo, la altura a 8px, quita la marca de entradas y cámbialo a páginas. Guarda. ¿Sale el mensaje de confirmación de WordPress?</li>
<li>Recarga la página de ajustes. ¿Los valores se han guardado correctamente?</li>
<li>Ve a la web y visita una página. ¿La barra ahora es roja, de 8px y está abajo?</li>
<li>Visita ahora una entrada y comprueba que no se ve ninguna barra de progreso.</li>
</ul>

<a href="https://ayudawp.com/vibe-coding-plugin-wordpress/plugin-wordpress-vibe-coding-v2-pagina-ajustes/" rel="nofollow"><img width="1200" height="626" src="https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v2-pagina-ajustes-1200x626.jpg" class="attachment-medium size-medium" alt="plugin wordpress vibe coding v2 pagina ajustes" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v2-pagina-ajustes-1200x626.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v2-pagina-ajustes-768x401.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v2-pagina-ajustes-1536x802.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-wordpress-vibe-coding-v2-pagina-ajustes.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/vibe-coding-plugin-wordpress/plugin-vibe-coding-cambio-ajustes/" rel="nofollow"><img width="1200" height="626" src="https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-cambio-ajustes-1200x626.jpg" class="attachment-medium size-medium" alt="plugin vibe coding cambio ajustes" srcset="https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-cambio-ajustes-1200x626.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-cambio-ajustes-768x401.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-cambio-ajustes-1536x802.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/plugin-vibe-coding-cambio-ajustes.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<ol>
<li><strong>Prueba de permisos:</strong> si tienes un usuario con perfil de editor o autor en tu WordPress de prueba, inicia sesión con ese usuario o cambia al usuario tras activar el plugin <em>User Switching</em>. ¿Puede ver la opción de ajustes del plugin en el menú? No debería, y si puede acceder es un problema de seguridad que hay que corregir.</li>
<li><strong>Plugin Check, Debug Log y Query Monitor</strong>: ejecútalos igual que con la V1. Ahora que hay ajustes guardados en la base de datos Query Monitor debería mostrar las consultas correspondientes, pero no deberían ser excesivas (una o dos como mucho para leer las opciones).</li>
</ol>
<p><strong>Si hay problemas corrígelos con el mismo patrón del paso 8 de la V1</strong>: error exacto, qué esperabas, qué pasa, código adjunto.</p>
<p>Cuando todo esté limpio haz las <strong>dos pasadas de mejora y auditoría con los mismos prompts adaptados a la versión 2</strong> y pasa a la siguiente.</p>
<h2>Versión 3: Tiempo estimado de lectura</h2>
<p>Esta versión añade la funcionalidad que convierte el plugin de algo «útil» a un plugin «completo», que <strong>muestra al visitante cuánto tardará en leer el contenido</strong>.</p>
<h3>El prompt</h3>
<pre>Te adjunto el código completo y funcional del plugin Reading Time Progress Bar Pro versión 2.0.0.

TAREA:
Actualiza el plugin a la versión 3.0.0 añadiendo SOLO lo siguiente:

TIEMPO ESTIMADO DE LECTURA:
- Calcular el tiempo estimado de lectura del contenido del post actual en PHP.
- Mostrar el tiempo estimado en el frontend, justo antes del contenido del post, con el formato "X min de lectura".
- El cálculo se basa en las palabras del contenido divididas entre las palabras por minuto configuradas.
- Usar el filtro the_content para insertar el tiempo estimado. No modificar plantillas del tema.

NUEVOS AJUSTES (añadir a la página existente):
- Activar/desactivar la visualización del tiempo estimado (checkbox, activado por defecto).
- Palabras por minuto: campo numérico, por defecto 200, mínimo 100, máximo 400.

IMPLEMENTACIÓN:
- Crear un nuevo archivo includes/class-rpb-reading-time.php para la lógica de cálculo e inserción.
- El HTML del tiempo estimado debe tener una clase CSS propia para que el usuario pueda personalizarlo con CSS del tema si quiere.
- Actualizar el readme.txt.

REQUISITOS TÉCNICOS:
[los mismos de siempre]

NO QUIERO:
- Nada de permisos por rol adicionales en esta versión.
- Nada de shortcodes ni bloques de Gutenberg.
- Nada de analytics ni seguimiento.
- Nada de funcionalidades extra.</pre>
<h3>Probar la versión 3</h3>
<p>Lo de siempre primero, todas las pruebas de las versiones anteriores. La barra y los ajustes tienen que seguir funcionando exactamente igual.</p>
<p><strong>Pruebas específicas del tiempo de lectura</strong>:</p>
<ul>
<li>Visita una página o entrada, lo que tuvieses antes activado en los ajustes. ¿Aparece el texto «X min de lectura» encima del contenido?</li>
<li>¿El número es razonable? Si la entrada tiene unas 1.000 palabras y está configurado a 200 palabras por minuto, debería decir «5 min de lectura». Si dice 0 o un número absurdamente alto, algo falla en el cálculo.</li>
<li>Cambia las palabras por minuto en ajustes (ponlas a 100, por ejemplo). ¿El tiempo estimado cambia acorde (ahora debería decir 10 min para la misma entrada)?</li>
<li>Desactiva el tiempo estimado en ajustes. ¿Desaparece? ¿La barra de progreso sigue funcionando?</li>
<li>¿El tiempo estimado aparece solo en los tipos de contenido seleccionados, igual que la barra?</li>
<li>Si la entrada tiene poco texto (por ejemplo, una frase), ¿muestra «1 min read» o algo raro como «0 min»?</li>
</ul>

<a href="https://ayudawp.com/vibe-coding-plugin-wordpress/vibe-coding-plugin-ajustes-v3-barra-progreso-y-tiempo-lectura-visto/" rel="nofollow"><img width="1200" height="791" src="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-ajustes-v3-barra-progreso-y-tiempo-lectura-visto-1200x791.jpg" class="attachment-medium size-medium" alt="vibe coding plugin ajustes v3 barra progreso y tiempo lectura visto" srcset="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-ajustes-v3-barra-progreso-y-tiempo-lectura-visto-1200x791.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-ajustes-v3-barra-progreso-y-tiempo-lectura-visto-768x506.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-ajustes-v3-barra-progreso-y-tiempo-lectura-visto-1536x1012.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-ajustes-v3-barra-progreso-y-tiempo-lectura-visto.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/vibe-coding-plugin-wordpress/vibe-coding-plugin-barra-progreso-y-tiempo-lectura-visto/" rel="nofollow"><img width="1200" height="668" src="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-barra-progreso-y-tiempo-lectura-visto-1200x668.jpg" class="attachment-medium size-medium" alt="vibe coding plugin barra progreso y tiempo lectura visto" srcset="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-barra-progreso-y-tiempo-lectura-visto-1200x668.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-barra-progreso-y-tiempo-lectura-visto-768x427.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-barra-progreso-y-tiempo-lectura-visto-1536x854.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-plugin-barra-progreso-y-tiempo-lectura-visto.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<p>Pasa como siempre Plugin Check, Debug Log, Query Monitor y corrige si hace falta. Las dos pasadas de mejora y auditoría, ya conoces la retahíla.</p>
<blockquote><p><strong>Advertencia</strong>: No te saltes ningún paso de comprobación en ninguna versión, y especialmente en las más avanzadas, no te confíes, que luego vienen los disgustos.</p></blockquote>
<h2>Versión 4: Permisos por perfil de usuario</h2>
<p>La última pieza es permitir que el administrador decida qué perfiles (<a href="https://ayudawp.com/perfiles-capacidades-wordpress/" target="_blank" rel="noopener ugc">roles</a>) de usuario pueden acceder a los ajustes del plugin.</p>
<h3>El prompt</h3>
<pre>Te adjunto el código completo y funcional del plugin Reading Time Progress Bar Pro versión 3.0.0.

TAREA:
Actualiza el plugin a la versión 4.0.0 añadiendo SOLO lo siguiente:

PERMISOS POR ROL:
- En la página de ajustes, añadir una nueva sección "Permisos".
- Checkboxes con los roles de WordPress que pueden acceder a la página de ajustes del plugin.
- Por defecto solo el administrador tiene acceso.
- El control de acceso debe usar las capacidades de WordPress (capabilities), no comparar nombres de rol directamente.
- Si un rol deja de tener acceso y hay un usuario de ese rol en la página de ajustes, al recargar debe ver un mensaje de permisos insuficientes.

IMPLEMENTACIÓN:
- Modificar la comprobación de permisos existente para usar la nueva configuración.
- Los ajustes de permisos solo los puede modificar un administrador (manage_options), independientemente de qué otros roles tengan acceso a los ajustes del plugin.
- Actualizar el readme.txt con la nueva funcionalidad y subir la versión a 4.0.0.
- Actualizar el changelog en el readme.txt con los cambios de cada versión (1.0.0, 2.0.0, 3.0.0 y 4.0.0).

REQUISITOS TÉCNICOS:
[los mismos de siempre]

NO QUIERO:
- Nada de capacidades personalizadas (custom capabilities).
- Nada de interfaz de gestión de roles.
- Nada de funcionalidades extra.</pre>
<h3>Probar la versión 4</h3>
<p>Las pruebas de permisos requieren un poco más de trabajo porque necesitas usuarios de prueba con diferentes roles. Si no los tienes en tu WordPress de prueba créalos, uno con perfil de editor y otro con el de autor es más que suficiente.</p>
<ul>
<li>Con el de administrador: ve a ajustes del plugin, sección permisos. ¿Aparecen los perfiles de WordPress con casillas?</li>
<li>Marca «Editor» además de «Administrador» y guarda.</li>
<li>Inicia sesión como editor (o usa de nuevo User Switching). ¿El editor ve la opción de ajustes del plugin? ¿Puede cambiar el color y la posición?</li>
<li>¿El editor puede modificar los permisos de quién accede? <strong>No debería poder</strong>. Esa sección solo debe ser visible para administradores.</li>
<li>Vuelve al administrador. Desmarca «Editor». Guarda.</li>
<li>Vuelve a iniciar sesión como editor. ¿Ya no ve la opción de ajustes?</li>
<li>Inicia sesión como autor. ¿Puede acceder a los ajustes? No debería, no lo has marcado.</li>
</ul>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-158682" src="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-wordpress-plugin-v4-ajustes-1200x1113.jpg" alt="vibe coding wordpress plugin v4 ajustes" width="1200" height="1113" srcset="https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-wordpress-plugin-v4-ajustes-1200x1113.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-wordpress-plugin-v4-ajustes-768x712.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-wordpress-plugin-v4-ajustes-1536x1424.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/vibe-coding-wordpress-plugin-v4-ajustes.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Después de las pruebas funcionales, el ciclo completo: Plugin Check, Debug Log, Query Monitor, las dos pasadas de mejora y auditoría.</p>
<h3>La auditoría final de todo el plugin</h3>
<p>Con las cuatro versiones terminadas, haz una última auditoría cruzada de todo el código completo. Esta vez el prompt debe reflejar que es la revisión final antes de publicar:</p>
<pre>Eres un auditor de seguridad y calidad especializado en plugins de WordPress para el repositorio oficial de WordPress.org. Te adjunto el código completo del plugin Reading Progress Bar versión 4.0.0.

Este plugin va a enviarse a WordPress.org para revisión. Necesito que lo analices como si fueras parte del equipo de revisión del directorio de plugins.

Analiza todo el código buscando:
1. Vulnerabilidades de seguridad (XSS, CSRF, inyección SQL, falta de sanitización, escapado o comprobación de permisos).
2. Incumplimientos de las directrices del directorio de plugins de WordPress.org.
3. Problemas de rendimiento.
4. Incumplimientos de los WordPress Coding Standards.
5. Problemas de internacionalización (cadenas sin preparar para traducción, text domain incorrecto).
6. Problemas en el readme.txt (formato, campos obligatorios, longitud de descripción).
7. Limpieza en la desinstalación (¿se eliminan las opciones de la base de datos al desinstalar?).

Sé exhaustivo. Lista cada problema con su archivo, ubicación exacta y corrección propuesta.</pre>
<p>Aplica las correcciones, prueba una última vez, y el plugin está listo para compartirlo (si quieres).</p>
<h2>Preparar el plugin para compartirlo</h2>
<p>Cuando todas las versiones están terminadas, probadas y auditadas, toca preparar el plugin para que otros puedan usarlo.</p>
<ol>
<li><strong>Revisión final con Plugin Check:</strong> Ejecuta PCP una (pen)última vez. Tiene que salir limpio, sin errores. Los avisos menores puedes valorarlos, pero los errores tienen que estar resueltos.</li>
<li><strong>Debug log limpio:</strong> Usa el plugin un rato con el debug activado y comprueba que no aparece nada nuevo en el log relacionado con tu plugin.</li>
<li><strong>Revisa el readme.txt:</strong> Asegúrate de que tiene todas las secciones necesarias (descripción, instalación, FAQ, changelog), que la descripción corta no supera los 150 caracteres y que los datos de versión, compatibilidad y tags son correctos. Puedes validarlo con el <a href="https://wordpress.org/plugins/developers/readme-validator/" target="_blank" rel="nofollow noopener">validador oficial de readme.txt de WordPress</a>.</li>
<li><strong>Crear el ZIP:</strong> La estructura dentro del ZIP importa: la carpeta raíz tiene que llamarse exactamente como el slug del plugin. Para nuestro ejemplo, el ZIP debe contener una carpeta <code>reading-time-progress-bar/</code> con todo dentro. Si comprimes los archivos sueltos sin la carpeta contenedora, WordPress no lo instalará bien.</li>
<li><strong>Probarlo en otro WordPress:</strong> Instala el plugin desde el ZIP en una instalación de WordPress diferente a la de desarrollo, preferiblemente limpia (sin otros plugins extra, con un tema por defecto). Repite las pruebas básicas de funcionamiento. Si algo falla aquí que no fallaba en tu entorno de desarrollo, probablemente hay alguna dependencia que no habías detectado.</li>
<li><strong>Compartirlo (o no):</strong> Elige si quieres distribuir tu plugin y cómo hacerlo, si es que tenías pensado hacerlo. Nada te lo impide, incluso si has detectado una necesidad podrías venderlo.</li>
</ol>
<h2>Subirlo al repositorio oficial de WordPress.org</h2>
<p>Si quieres que tu plugin esté disponible para cualquier usuario de WordPress directamente desde el panel de administración, puedes enviarlo al repositorio oficial. Es un proceso que lleva su tiempo pero <a href="https://ayudawp.com/publicar-plugins-wordpress-org/" target="_blank" rel="noopener ugc">merece la pena por múltiples motivos, también para ti</a>.</p>
<p><strong>Requisitos previos:</strong></p>
<ul>
<li>Una cuenta en <a href="https://wordpress.org/" target="_blank" rel="nofollow noopener">wordpress.org</a> (gratis).</li>
<li>Que el plugin cumpla las <a href="https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/" target="_blank" rel="nofollow noopener">directrices del directorio de plugins</a> (si has seguido el tutorial prácticamente es lo que hemos estado haciendo, aplicando los estándares más exigentes).</li>
</ul>
<p><strong>Comprobaciones antes de enviar:</strong></p>
<ul>
<li>PCP limpio, sin errores.</li>
<li>Licencia GPL-2.0-or-later (o compatible).</li>
<li>Sin código ofuscado ni minimizado que no se pueda leer.</li>
<li>Sin llamadas a servicios externos que no estén declaradas y justificadas.</li>
<li>Que el nombre del plugin no contenga marcas registradas (no puedes llamarlo «WordPress Progress Bar Pro» ni «WooCommerce Time Reader»).</li>
</ul>
<p><strong>El proceso:</strong></p>
<ol>
<li>Ve a la <a href="https://es.wordpress.org/plugins/developers/add/" target="_blank" rel="nofollow noopener">página de envío de plugins</a> y sube el ZIP.</li>
<li>Espera. El equipo de revisión tarda entre unos días y varias semanas dependiendo de la cola. No envíes mensajes preguntando cuánto falta.</li>
<li>Recibirás un email con el resultado. Lo más habitual es que, tras pasar un mínimo de una semana, te pidan correcciones en la primera revisión.</li>
</ol>
<p><strong>Lo que suelen pedir que corrijas:</strong></p>
<p>Las correcciones más frecuentes son siempre las mismas: escapar correctamente todo el output con funciones como <code>esc_html()</code> o <code>esc_attr()</code>, usar nonces en todos los formularios, sanitizar todos los datos de entrada, y comprobar permisos del usuario antes de ejecutar acciones. Si la IA ha usado las skills de WordPress al generar el código, muchas de estas cosas ya estarán bien, pero el equipo de revisión es muy minucioso.</p>
<p>Cuando te pidan correcciones, copia los comentarios del revisor y dáselos a la IA junto con el código completo del plugin para que aplique los cambios.</p>
<p><strong>Una vez aprobado:</strong></p>
<p>WordPress te dará acceso a un repositorio SVN donde subir el código. SVN es un sistema de control de versiones diferente a Git. Los pasos básicos son:</p>
<ol>
<li>Instala SVN en tu ordenador (viene preinstalado en macOS y la mayoría de distribuciones Linux; en Windows puedes instalar TortoiseSVN).</li>
<li>Descarga tu repositorio: <code>svn co https://plugins.svn.wordpress.org/tu-plugin</code></li>
<li>Copia los archivos del plugin dentro de la carpeta <code>trunk/</code>.</li>
<li>Copia los assets (banner, icono, capturas) en la carpeta <code>assets/</code>.</li>
<li>Sube los cambios: <code>svn add * --force</code> y luego <code>svn ci -m "Primera versión"</code></li>
</ol>
<p>Si SVN te parece demasiado, hay plugins y scripts que permiten sincronizar desde GitHub, pero eso ya es para otro tutorial.</p>
<h2>Aprovecha lo aprendido para tus próximos plugins</h2>
<p>Lo que acabas de hacer no sirve solo para este plugin. Has aprendido un proceso que puedes repetir con cualquier idea. Para que la próxima vez sea más fácil y rápida:</p>
<p><strong>Configura tu IA:</strong> La mayoría de herramientas de IA permiten guardar preferencias o instrucciones que se aplican a todas las conversaciones. Configura ahí tus requisitos técnicos de WordPress (estándares, prefijos, estructura de archivos, seguridad) para no tener que repetirlos en cada prompt. Tienes todos los detalles de cómo hacerlo en cada plataforma en <a href="https://ayudawp.com/configurar-ia-programar-wordpress/" target="_blank" rel="noopener ugc">esta guía de configuración de IAs para WordPress</a>.</p>
<p><strong>Usa la memoria:</strong> Si tu IA tiene memoria entre conversaciones, aprovéchala. Dile que recuerde tus preferencias de desarrollo, tus reglas de código, el tipo de plugins que sueles crear. Cada conversación irá mejor que la anterior porque la IA ya conoce tu contexto.</p>
<p><strong>Crea tus propias skills sencillas:</strong> No necesitas ser programador para escribir una skill. Es un archivo de texto con instrucciones claras. Si siempre quieres que tus plugins tengan cierta estructura, ciertos estándares o cierto estilo de código, escríbelo en un documento y adjúntalo al inicio de cada conversación. Con el tiempo lo irás refinando y los resultados serán cada vez mejores.</p>
<p><strong>Sigue aprendiendo.</strong> Este tutorial cubre el proceso completo de vibe coding para plugins, pero hay mucho más por explorar:</p>
<ul>
<li>Si quieres entender a fondo qué son el vibe coding y el agentic coding y cómo funcionan: <a href="https://ayudawp.com/vibe-agentic-coding/" target="_blank" rel="noopener ugc">Programar con IA en WordPress – Vibe Coding y Agentic Coding</a>.</li>
<li>Si quieres crear un plugin que integre inteligencia artificial (un plugin con IA, no un plugin hecho con IA): <a href="https://ayudawp.com/crear-plugin-ia/" target="_blank" rel="noopener ugc">Crear tu propio plugin de IA básico para WordPress</a>.</li>
<li>Si quieres configurar instrucciones permanentes en cada plataforma de IA: <a href="https://ayudawp.com/configurar-ia-programar-wordpress/" target="_blank" rel="noopener ugc">Cómo configurar las IAs para programar WordPress</a>.</li>
<li>Todas las herramientas de desarrollo para WordPress en un solo sitio: <a href="https://ayudawp.com/herramientas-desarrollo-wordpress-imprescindibles/" target="_blank" rel="noopener ugc">Herramientas de desarrollo WordPress imprescindibles</a>.</li>
</ul>
<p>Y recuerda que la IA es tu herramienta, no tu jefa. Tú decides qué se construye, cómo se prueba y cuándo se para.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/vibe-coding-plugin-wordpress/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Calculadora de presupuestos y costes para desarrolladores WordPress freelance</title>
		<link>https://ayudawp.com/calculadora-presupuestos-costes/</link>
					<comments>https://ayudawp.com/calculadora-presupuestos-costes/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 25 Mar 2026 07:28:10 +0000</pubDate>
				<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[autónomos]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Principiante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158752</guid>

					<description><![CDATA[He creado esta calculadora precisamente para quitarte esa duda. Metes tus gastos reales, tus horas facturables, lo que quieres ganar, y te dice con números claros cuál es tu tarifa mínima y la recomendada. Además tiene un segundo modo para evaluar proyectos concretos antes de aceptarlos.]]></description>
										<content:encoded><![CDATA[<p>Si eres desarrollador WordPress y trabajas como freelance o autónomo sabes que <strong>poner precio a tu trabajo es una de las partes más incómodas</strong> del oficio. Cobras poco y no llegas a fin de mes, cobras mucho y pierdes el proyecto. Y entre medias <strong>la duda eterna de si ese presupuesto que vas a enviar tiene sentido o estás regalando horas</strong>.</p>
<p>He creado esta calculadora precisamente para quitarte esa duda. Metes tus gastos reales, tus horas facturables, lo que quieres ganar, y <strong>te dice con números claros cuál es tu tarifa mínima y la recomendada</strong>. Además tiene <strong>un segundo modo para evaluar proyectos concretos antes de aceptarlos</strong>.</p>
<h2>Calcula tu tarifa hora de desarrollo web con datos reales</h2>
<p>La mayoría de calculadoras de tarifas que encuentras por ahí son genéricas, pensadas para freelances de cualquier sector y normalmente con datos de Estados Unidos o <em>Globales</em>. Esta está hecha con cifras reales de España, con las cuotas de autónomos actualizadas, los rangos de mercado de desarrolladores WordPress y <strong>los gastos que un profesional del sector maneja de verdad</strong>.</p>
<p>La calculadora tiene en cuenta todo lo que normalmente olvidas al hacer números con una hoja de cálculo rápida, desde la cuota de autónomos (con la tabla de tramos de 2026 incluida) hasta la amortización del hardware, el software, la formación, la gestoría y el IRPF. Porque <strong>una cosa es lo que facturas y otra bastante distinta lo que te queda en el bolsillo</strong>.</p>
<p>Los resultados se actualizan en tiempo real mientras cambias los campos, así que <strong>puedes ir probando diferentes situaciones sin esperar ni pulsar botones</strong>. Además muestra tres posibles escenarios de un vistazo (tarifa mínima, recomendada y ambiciosa) con el neto anual que te quedaría en cada caso, un gráfico de distribución para que veas a dónde va cada euro que facturas, y una <strong>comparativa visual con los rangos de mercado</strong> en España.</p>
<h2>Calculadora para programadores WordPress</h2>
<p><strong>Mete tus números y mira a ver qué te sale</strong>. Los valores por defecto son razonables para un autónomo en España pero cámbialos por los tuyos si vives en otro país para que el resultado sea preciso o que al menos te sirva de referencia. Siempre es mejor un cálculo aproximado que ningún cálculo.</p>
<p><iframe id="calc-freelance-iframe" class="sombra" style="width: 100%; border: none; min-height: 800px;" src="/tools/calculadora-freelance.html"><span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start">﻿</span></iframe><br>
<script>
window.addEventListener('message', function(e) {
    if (e.data && e.data.type === 'ayudawp-embed-height') {
        var iframe = document.getElementById('calc-freelance-iframe');
        if (iframe) iframe.style.height = e.data.height + 'px';
    }
});
</script></p>
<p>Si prefieres usarla a pantalla completa la tienes también en las <a href="https://herramientas.ayudawp.com/#calculadora-freelance" target="_blank" rel="noopener ugc">herramientas gratuitas de AyudaWP</a>.</p>
<h2>Evalua si un proyecto WordPress es rentable</h2>
<p>Calcular tu tarifa está muy bien, pero el momento de verdad llega cuando te cae un proyecto encima y tienes que decidir si aceptarlo o no. La pestaña «<strong>Evaluar proyecto</strong>» de la calculadora sirve para eso.</p>
<p>Funciona de forma muy sencilla.</p>
<ol>
<li><strong>Introduces el presupuesto</strong> que te ofrecen (o el que vas a pedir) <strong>y las horas que estimas para el proyecto</strong> completo, contando desarrollo, pruebas, comunicación con el cliente y revisiones.</li>
<li>La calculadora cruza esos datos con tu tarifa base y <strong>te dice si el proyecto es viable, cuánto te quedaría limpio</strong> después de impuestos y gastos, y el neto por hora trabajada.</li>
<li><strong>Si no es viable, te sugiere el presupuesto mínimo y el recomendado</strong> para que puedas negociar con cifras en la mano.</li>
</ol>
<p>Es el tipo de cálculo que muchos hacemos de cabeza o con una cuenta rápida en el móvil, pero que conviene hacer bien <strong>antes de comprometerte con semanas de trabajo</strong>.</p>
<h2>Cuánto cobrar por un proyecto WordPress</h2>
<p>Si lo que necesitas no es tanto la calculadora sino entender qué tarifas se manejan en el mercado, qué gastos reales tiene un autónomo en España y cómo calcular tu tarifa paso a paso con explicaciones detalladas, tengo un <a href="https://ayudawp.com/que-precio-hora-deberia-cobrar-como-desarrollador-wordpress/">artículo bastante completo sobre qué cobrar como desarrollador WordPress</a> que actualizo periódicamente con datos de mercado, salarios de referencia y rangos por nivel de experiencia.</p>
<p>La calculadora nació como complemento de ese artículo, de hecho está integrada dentro de él, pero tiene vida propia porque es el tipo de herramienta que usas cada vez que preparas un presupuesto, no solo cuando te planteas tu tarifa por primera vez.</p>
<h2>Copia el resumen de tus cálculos</h2>
<p>Un último detalle práctico es que la calculadora tiene <strong>un botón para copiar los resultados en <a href="https://ayudawp.com/aprende-markdown/" target="_blank" rel="noopener ugc">formato Markdown</a></strong>, que puedes pegar directamente en tus notas, en Notion, en Obsidian o donde guardes tus cosas. Incluye las tarifas calculadas, el desglose de gastos, la distribución de la facturación y tu posición en el mercado. Así no tienes que hacer capturas de pantalla ni apuntar números a mano cada vez que lo uses.</p>
<p>Por supuesto, cualquier duda o mejora que se te ocurra déjala abajo en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/calculadora-presupuestos-costes/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo mostrar shortcodes sin que se ejecuten</title>
		<link>https://ayudawp.com/mostrar-shortcodes/</link>
					<comments>https://ayudawp.com/mostrar-shortcodes/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 24 Mar 2026 07:28:31 +0000</pubDate>
				<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Shortcode]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158737</guid>

					<description><![CDATA[Si alguna vez has intentado mostrar un shortcode en el texto de una entrada sin que WordPress lo ejecute, sabes de lo que hablo, se pasa malamente. Yo he llegado hasta a poner capturas porque no había manera.]]></description>
										<content:encoded><![CDATA[<p>Si alguna vez has intentado <strong>mostrar un shortcode en el texto de una entrada sin que WordPress lo ejecute</strong>, sabes de lo que hablo, se pasa malamente. Yo he llegado hasta a poner capturas porque no había manera. Escribes <code>[gallery]</code> en tu contenido para explicar cómo se usa y WordPress, <strong>en vez de mostrarlo como texto, te planta una galería de imágenes en medio del párrafo</strong>.</p>
<p>La solución habitual es recurrir a trucos como meter espacios dentro de los corchetes, usar entidades HTML (<code>&amp;#91;</code> y <code>&amp;#93;</code>) o escapar con bloques de código. Funcionan, a veces, pero <strong>hay un método nativo de WordPress mucho más limpio que casi nadie conoce</strong>.</p>
<h2>El truco del doble corchete</h2>
<p>Para que WordPress muestre un shortcode como texto sin ejecutarlo <strong>solo tienes que envolverlo con dobles corchetes</strong>:</p>
<p><code>[[gallery]]</code></p>
<p>WordPress lo muestra como <code>[gallery]</code> en el HTML de la página, pero no lo procesa. El shortcode se muestra tal cual, como texto plano.</p>
<p>Si el shortcode tiene atributos, funciona igual:</p>
<p><code>[[gallery ids="1,2,3" columns="3"]]</code></p>
<p>Y si es un shortcode con contenido encerrado, necesitas dobles corchetes en ambas etiquetas:</p>
<p><code>[[shortcode]Contenido que se muestra como texto[/shortcode]]</code></p>
<h2>Dónde usarlo y dónde no hace falta</h2>
<p>Este truco es tanto para el contenido normal de tus entradas y páginas, es decir, el texto que va fuera de bloques de código como si escribes el shortcode dentro de una etiqueta <code>&lt;pre&gt;</code> o <code>&lt;code&gt;</code>. En teoría WordPress no lo ejecuta, pero la realidad es que es una lotería, depende de muuuchas cosas.</p>
<p>Donde más lo vas a agradecer es en tutoriales y guías donde explicas cómo usar un shortcode concreto. En vez de inventar trucos raros para que no se ejecute, le pones dobles corchetes y te olvidas.</p>
<h2>Cómo funciona por dentro</h2>
<p>Cuando WordPress procesa el contenido de una entrada, la Shortcode API busca patrones con la forma <code>[nombre]</code>. Si encuentra dobles corchetes (<code>[[nombre]]</code>), elimina los corchetes exteriores y devuelve el contenido con los corchetes simples, pero sin ejecutar el shortcode.</p>
<p>Es un comportamiento documentado en la <a href="https://developer.wordpress.org/plugins/shortcodes/" rel="nofollow" target="_blank">Shortcode API de WordPress</a>, pero está tan poco visible que la mayoría de desarrolladores no lo conocen. Lleva disponible desde WordPress 2.5, que fue la versión que introdujo los shortcodes allá por 2008.</p>
<h2>Ejemplo práctico</h2>
<p>Imagina que tienes el plugin <a href="https://es.wordpress.org/plugins/contact-form-7/" rel="nofollow" target="_blank">Contact Form 7</a> activo y quieres explicar a tus lectores cómo insertar un formulario. Si en tu entrada escribes:</p>
<p><code>Para insertar el formulario usa [[contact-form-7 id="123" title="Contacto"]]</code></p>
<p>WordPress mostrará en la página:</p>
<blockquote><p>Para insertar el formulario usa [contact-form-7 id="123" title="Contacto"]</p></blockquote>
<p>Sin ejecutar el formulario, sin HTML raro, todo majete.</p>
<p>La próxima vez que necesites mostrar un shortcode como ejemplo en tu contenido acuérdate de esto antes de liarte con entidades HTML o espacios fantasma. Dos corchetes y listo.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/mostrar-shortcodes/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Guía para localizar, analizar y optimizar las consultas SQL que ralentizan WordPress</title>
		<link>https://ayudawp.com/optimizar-consultas-sql/</link>
					<comments>https://ayudawp.com/optimizar-consultas-sql/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 07:28:00 +0000</pubDate>
				<category><![CDATA[Programación en WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[WPO - Optimizar WordPress]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158566</guid>

					<description><![CDATA[Cuando un WordPress empieza a ir lento el panel de administración se arrastra, WooCommerce tarda una eternidad en cargar variaciones de producto o cualquier acción cotidiana como pasar de página o añadir algo al carrito se convierte en una prueba de paciencia, la base de datos casi siempre suele ser mi primer sospechoso.]]></description>
										<content:encoded><![CDATA[<p>Cuando un <strong>WordPress empieza a ir lento</strong> el panel de administración se arrastra, WooCommerce tarda una eternidad en cargar variaciones de producto o cualquier acción cotidiana como pasar de página o añadir algo al carrito se convierte en una prueba de paciencia, la base de datos casi siempre suele ser mi primer sospechoso.</p>
<p>Pero ojo, no siempre es cuestión de que tengas la base de datos «sucia» o llena de basura acumulada. Eso es una parte del problema, pero hay otra que es igual de importante o más, las consultas SQL que se ejecutan contra esa base de datos.</p>
<p>Hay tres tipos de consultas problemáticas, y cada una machaca tu servidor de una forma distinta:</p>
<ul>
<li><strong>Consultas lentas:</strong> tardan demasiado en ejecutarse porque escanean tablas enormes sin índices, usan búsquedas con comodines o hacen JOINs pesados entre varias tablas. Una sola consulta lenta puede bloquear todo lo demás.</li>
<li><strong>Consultas agresivas:</strong> puede que no tarden tanto en ejecutarse, pero devuelven cantidades enormes de datos a la memoria RAM del servidor. Piensa en un plugin que hace <code>SELECT *</code> sobre una tabla con millones de filas sin poner un <code>LIMIT</code>, o una precarga de caché que lanza consultas masivas de golpe.</li>
<li><strong>Consultas excesivas o frecuentes:</strong> individualmente son rápidas, pero se disparan tantas veces por cada carga de página que el efecto acumulado revienta el servidor. El típico caso de un tema o plugin que hace una consulta por cada entrada dentro de un bucle, en vez de traer todo de una sola vez.</li>
</ul>
<p>Muchas veces el problema es una combinación de las tres, o sea, una consulta que es lenta, se ejecuta muchas veces y además devuelve más datos de los que necesita. Ahí es donde la web se cae pero ya, sin avisar, y luego todo son lloros .</p>
<p>En este tutorial quiero ayudarte a ver cómo identificar exactamente qué consultas están causando problemas en tu base de datos, cómo entender por qué son problemáticas y cómo solucionarlas. Te daré varias opciones según el acceso que tengas a tu servidor, desde un simple plugin hasta comandos por SSH, pasando por phpMyAdmin y códigos PHP que puedes usar sin depender de nadie.</p>
<blockquote><p><strong>Importante:</strong> antes de tocar nada en tu base de datos, haz siempre una copia de seguridad completa. Cualquier operación que hagas directamente sobre la base de datos puede ser irreversible si algo sale mal.</p></blockquote>
<h2>Herramientas para encontrar las consultas problemáticas</h2>
<p>Lo primero es lo primero, y antes de arreglar nada necesitas saber qué está pasando exactamente. No vale con suponer que «será tal plugin» o «será que tengo muchas revisiones», necesitas datos concretos.</p>
<p>Dependiendo del nivel de acceso que tengas a tu servidor, tienes varias opciones, así que vamos de menos a más acceso.</p>
<h3>Con plugin: Query Monitor</h3>
<p>Si solo puedes instalar plugins y no tienes acceso al servidor, <a href="https://es.wordpress.org/plugins/query-monitor/" target="_blank" rel="nofollow noopener">Query Monitor</a> es tu mejor aliado. Es gratuito, está en el repositorio oficial y te da una cantidad brutal de información sobre lo que pasa por debajo cada vez que se carga una página.</p>
<p>Instálalo, actívalo y recarga la página que va lenta. Verás una barra nueva en la parte superior del admin con datos de rendimiento. Haz clic en ella y ve directamente a la pestaña <strong>Queries</strong>.</p>
<p>Lo que tienes que mirar para cada tipo de problema:</p>
<ul>
<li><strong>Para encontrar consultas lentas:</strong> ordena la lista por la columna de tiempo (duración). Las que estén por encima de 0,05 segundos ya merecen atención. Las que superen 0,5 segundos son un problema serio. Query Monitor las marca en un color distinto para que las veas rápido.</li>
<li><strong>Para encontrar consultas excesivas:</strong> mira el número total de consultas arriba del todo. Un WordPress limpio puede hacer entre 20 y 40 consultas por página. Si ves más de 100, algo va mal. Ve a <strong>Queries by Component</strong> para ver cuántas hace cada plugin, el tema y el núcleo de WordPress. Así pillas al responsable enseguida. Mira también la pestaña <strong>Duplicate Queries</strong>, que te muestra consultas que se repiten exactamente iguales, lo que indica que algún componente está pidiendo los mismos datos varias veces sin necesidad.</li>
<li><strong>Para encontrar consultas agresivas:</strong> fíjate en las que devuelven un número muy alto de filas (columna Rows). Una consulta que devuelve miles de filas cuando la página solo necesita mostrar 10 resultados es una señal clara de que algo no está bien optimizado.</li>
</ul>
<blockquote><p><strong>Detalle importante:</strong> Query Monitor solo te muestra lo que pasa en la carga de página actual. Si el problema ocurre con picos de tráfico, con el cron de WordPress o con procesos en segundo plano, no lo vas a ver aquí. Para eso necesitas las otras herramientas.</p></blockquote>
<h3>Con PHP: detecta consultas lentas sin acceso SSH</h3>
<p>Si no tienes acceso SSH y quieres algo más permanente que Query Monitor, que solo te muestra datos de la página actual, puedes usar un mu-plugin que registre automáticamente las consultas problemáticas en un archivo de registro (log).</p>
<p>Lo primero es activar <code>SAVEQUERIES</code> en tu archivo <code>wp-config.php</code>. Añade esta línea antes de donde dice <code>"That's all, stop editing!"</code>:</p>
<pre>define( 'SAVEQUERIES', true );</pre>
<p>Esto hace que WordPress guarde en memoria todas las consultas SQL que ejecuta, junto con el tiempo que tarda cada una y la función que la ha llamado. Pero por sí solo no hace nada visible, necesitas algo que lea esos datos y registre los problemáticos.</p>
<p>Crea un archivo llamado <code>ayudawp-log-slow-queries.php</code> y súbelo a la carpeta <code>/wp-content/mu-plugins/</code> de tu instalación de WordPress (si la carpeta no existe, créala).</p>
<p>Este es el código:</p>
<pre>&lt;?php
/**
 * AyudaWP - Log de consultas SQL lentas, agresivas o excesivas.
 *
 * Registra en un archivo de log las consultas que superen
 * el umbral de tiempo definido y alerta cuando el número
 * total de consultas por página es excesivo.
 *
 * Personalizable: ajusta los umbrales según tu caso.
 * Uso temporal: desactívalo cuando termines de diagnosticar.
 *
 * @package AyudaWP
 */

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

// Solo registrar si SAVEQUERIES está activo.
if ( ! defined( 'SAVEQUERIES' ) || ! SAVEQUERIES ) {
    return;
}

/**
 * Umbral en segundos para considerar una consulta como lenta.
 * Ajústalo según tu caso. 0.05 es un buen punto de partida.
 */
define( 'AYUDAWP_SLOW_QUERY_THRESHOLD', 0.05 );

/**
 * Número máximo de consultas por página antes de alertar.
 * Un WordPress normal no debería superar las 80-100.
 */
define( 'AYUDAWP_MAX_QUERIES_ALERT', 100 );

/**
 * Registra las consultas problemáticas al finalizar la carga.
 */
function ayudawp_log_slow_queries() {
    global $wpdb;

    if ( empty( $wpdb-&gt;queries ) ) {
        return;
    }

    $log_file    = WP_CONTENT_DIR . '/ayudawp-slow-queries.log';
    $total       = count( $wpdb-&gt;queries );
    $slow        = array();
    $total_time  = 0;
    $request_uri = isset( $_SERVER['REQUEST_URI'] )
        ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) )
        : 'unknown';

    foreach ( $wpdb-&gt;queries as $query_data ) {
        $sql      = $query_data[0];
        $time     = $query_data[1];
        $caller   = $query_data[2];
        $total_time += $time;

        if ( $time &gt;= AYUDAWP_SLOW_QUERY_THRESHOLD ) {
            $slow[] = array(
                'sql'    =&gt; trim( $sql ),
                'time'   =&gt; round( $time, 4 ),
                'caller' =&gt; $caller,
            );
        }
    }

    // Si no hay consultas lentas y el total no supera el umbral, no registrar.
    if ( empty( $slow ) &amp;&amp; $total &lt; AYUDAWP_MAX_QUERIES_ALERT ) {
        return;
    }

    $log_entry  = "\n" . str_repeat( '=', 70 ) . "\n";
    $log_entry .= gmdate( 'Y-m-d H:i:s' ) . ' | URL: ' . $request_uri . "\n";
    $log_entry .= 'Total consultas: ' . $total
        . ' | Tiempo total DB: ' . round( $total_time, 4 ) . "s\n";

    if ( $total &gt;= AYUDAWP_MAX_QUERIES_ALERT ) {
        $log_entry .= '** ALERTA: Numero excesivo de consultas (' . $total . ") **\n";
    }

    if ( ! empty( $slow ) ) {
        $log_entry .= 'Consultas lentas encontradas: ' . count( $slow ) . "\n";
        $log_entry .= str_repeat( '-', 70 ) . "\n";

        foreach ( $slow as $index =&gt; $q ) {
            $log_entry .= '[' . ( $index + 1 ) . '] Tiempo: '
                . $q['time'] . "s\n";
            $log_entry .= 'SQL: ' . $q['sql'] . "\n";
            $log_entry .= 'Llamada: ' . $q['caller'] . "\n\n";
        }
    }

    // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents
    file_put_contents( $log_file, $log_entry, FILE_APPEND | LOCK_EX );
}
add_action( 'shutdown', 'ayudawp_log_slow_queries' );
</pre>
<p>El registro se guardará en <code>/wp-content/ayudawp-slow-queries.log</code>. Navega por tu web durante un rato, especialmente por las páginas que van lentas, y luego descarga el archivo para analizarlo.</p>
<p>Cada entrada del log te dice la URL que se estaba cargando, el número total de consultas, el tiempo total invertido en la base de datos, y el detalle de cada consulta lenta con la función exacta que la ha disparado. Con eso tienes suficiente para saber dónde buscar.</p>
<blockquote><p><strong>Dato muy importante:</strong> esto es para diagnóstico temporal. <code>SAVEQUERIES</code> hace que WordPress almacene en memoria un registro de todas las consultas, lo que consume recursos adicionales. Cuando termines de diagnosticar, elimina el mu-plugin y quita la línea de <code>SAVEQUERIES</code> del <code>wp-config.php</code>. No lo dejes activado en producción.</p></blockquote>
<h3>Con phpMyAdmin: ver qué pasa en tiempo real</h3>
<p>Si tienes acceso a phpMyAdmin a través del panel de tu hosting (cPanel, Plesk, Site Tools o similar), puedes ver directamente qué está haciendo la base de datos en cada momento.</p>
<p><strong>SHOW PROCESSLIST — Ver consultas en tiempo real:</strong></p>
<p>Ve a la pestaña <strong>SQL</strong> de tu base de datos y ejecuta:</p>
<pre>SHOW FULL PROCESSLIST;</pre>
<p>Esto te muestra todas las consultas que se están ejecutando en ese instante. Las columnas importantes son:</p>
<ul>
<li><code>Time</code><strong>:</strong> cuántos segundos lleva ejecutándose esa consulta. Si ves valores altos (más de 2 o 3 segundos) tienes un problema.</li>
<li><code>State</code><strong>:</strong> en qué fase está la consulta. Valores como <code>Sending data</code>, <code>Sorting result</code> o <code>Creating tmp table</code> durante mucho tiempo indican problemas.</li>
<li><code>Info</code><strong>:</strong> la consulta SQL completa. Aquí ves exactamente qué se está ejecutando.</li>
</ul>
<p>El truco es ejecutar <code>SHOW FULL PROCESSLIST</code> varias veces seguidas mientras la web está lenta. Si ves la misma consulta apareciendo una y otra vez, o una consulta que lleva muchos segundos ejecutándose, ya tienes al culpable.</p>
<p><strong>SHOW TABLE STATUS — Estado y tamaño de las tablas:</strong></p>
<pre>SHOW TABLE STATUS;</pre>
<p>Esto te da una visión general de todas las tablas: cuántas filas tienen, cuánto espacio ocupan los datos, cuánto ocupan los índices y si hay fragmentación. Fíjate especialmente en:</p>
<ul>
<li>Tablas con un número de filas desproporcionado (<code>wp_postmeta</code> y <code>wp_options</code> suelen ser las que más crecen).</li>
<li>La columna <code>Data_free</code>, que indica espacio desperdiciado por fragmentación.</li>
<li>El <code>Engine</code>: si ves alguna tabla con MyISAM en vez de InnoDB, eso puede ser parte del problema (lo vemos más adelante).</li>
</ul>
<h3>Con SSH y WP-CLI: diagnóstico avanzado</h3>
<p>Si tienes acceso por SSH a tu servidor, tienes las herramientas más potentes a tu disposición.</p>
<p><strong>WP-CLI Profile — Perfilar tiempos de carga:</strong></p>
<p>Primero instala el paquete de perfilado:</p>
<pre>wp package install wp-cli/profile-command</pre>
<p>Luego, desde la carpeta de tu instalación de WordPress, ejecuta:</p>
<pre>wp profile stage --fields=stage,time,cache_ratio,query_time,query_count --spotlight</pre>
<p>Esto te muestra cuánto tiempo se invierte en cada etapa de la carga de WordPress (bootstrap, carga de plugins, tema, consulta principal, plantilla), cuántas consultas hace cada una y cuánto tiempo se gasta en la base de datos. Si ves que <code>bootstrap</code> tarda mucho y tiene muchas consultas, el problema está en los plugins o en la configuración.</p>
<p>Para profundizar en los plugins concretos:</p>
<pre>wp profile hook plugins_loaded --fields=callback,time,location --spotlight</pre>
<p>Y para ver todos los hooks y su impacto:</p>
<pre>wp profile hook --fields=hook,time,cache_ratio,query_count --spotlight</pre>
<p>El parámetro <code>--spotlight</code> oculta los valores a cero para que solo veas lo relevante.</p>
<p><strong>WP-CLI Doctor — Diagnóstico rápido:</strong></p>
<p>Instala el paquete:</p>
<pre>wp package install wp-cli/doctor-command</pre>
<p>Y ejecuta todas las comprobaciones:</p>
<pre>wp doctor check --all</pre>
<p>Esto te avisa automáticamente de problemas como opciones con autoload que superan los 900 KB, si <code>SAVEQUERIES</code> está activado en producción (no debería), si el cron tiene tareas duplicadas o excesivas, y otras cosas que afectan al rendimiento de la base de datos.</p>
<p><strong>Slow query log de MySQL — El registro definitivo:</strong></p>
<p>El <code>slow_query_log</code> es un registro que genera el propio servidor MySQL/MariaDB con todas las consultas que superan un tiempo determinado. Es lo más fiable que existe porque registra absolutamente todo lo que pasa en la base de datos, no solo lo que WordPress te deja ver.</p>
<p>Si administras tu propio servidor, actívalo añadiendo esto a la configuración de MySQL (<code>my.cnf</code> o <code>my.ini</code>):</p>
<pre>[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1</pre>
<p>El parámetro <code>long_query_time</code> define el umbral en segundos. Un valor de 1 es razonable para empezar, luego puedes bajarlo a 0.5 si quieres más detalle. La opción <code>log_queries_not_using_indexes</code> es muy útil porque registra también las consultas que no utilizan ningún índice, aunque sean rápidas, ya que cuando la tabla crezca se convertirán en un problema.</p>
<p>Si estás en un hosting compartido, no podrás editar la configuración de MySQL directamente. Pero muchos hostings pueden activar el <code>slow_query_log</code> si se lo pides. Manda un ticket de soporte con algo así:</p>
<p><code>"Estoy diagnosticando problemas de rendimiento en mi base de datos. ¿Podéis activar el slow query log con un umbral de 1 segundo y facilitarme los resultados? También me sería útil que activaseis log_queries_not_using_indexes."</code></p>
<p>Algunos hosting como SiteGround, Raiola o Webempresa suelen colaborar con este tipo de peticiones sin problema.</p>
<h2>Interpretar lo que encuentras: EXPLAIN</h2>
<p>Ya tienes identificada la consulta sospechosa, ahora necesitas entender por qué es lenta o por qué consume tantos recursos. Para eso existe <code>EXPLAIN</code>, un comando de MySQL que te dice exactamente cómo se ejecuta una consulta internamente.</p>
<p>Simplemente pon <code>EXPLAIN</code> delante de cualquier consulta <code>SELECT</code> y ejecútala en phpMyAdmin o en la consola de MySQL.</p>
<p>Por ejemplo:</p>
<pre>EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key = '_price';</pre>
<p>El resultado es una tabla con varias columnas.</p>
<p>Las que te interesan para diagnosticar problemas son:</p>
<p><strong>type</strong> — Cómo accede MySQL a la tabla. De mejor a peor:</p>
<ul>
<li><code>system</code> / <code>const</code>: perfecto, accede a un solo registro por clave primaria.</li>
<li><code>eq_ref</code> / <code>ref</code>: bien, usa un índice para encontrar las filas.</li>
<li><code>range</code>: aceptable, escanea un rango de filas usando un índice.</li>
<li><code>index</code>: regular, escanea todo el índice (mejor que escanear toda la tabla, pero no ideal).</li>
<li><code>ALL</code>: <strong>malo</strong>. Escaneo completo de tabla. Si ves esto en una tabla con miles de filas, ahí está tu problema.</li>
</ul>
<p><strong>key</strong> — Qué índice usa MySQL para la consulta. Si ves <code>NULL</code> significa que no usa ningún índice, lo que suele ser sinónimo de consulta lenta en tablas grandes.</p>
<p><strong>rows</strong> — Cuántas filas estima MySQL que necesita examinar. Si este número es enorme comparado con las filas que realmente necesitas, la consulta está haciendo mucho más trabajo del necesario.</p>
<p><strong>Extra</strong> — Información adicional sobre cómo se ejecuta. Valores que indican problemas:</p>
<ul>
<li><code>Using filesort</code>: MySQL tiene que ordenar los resultados sin poder usar un índice. Lento en tablas grandes.</li>
<li><code>Using temporary</code>: MySQL crea una tabla temporal para procesar la consulta. Consume memoria y disco.</li>
<li><code>Using where</code>: filtra filas después de leerlas, lo que no es malo por sí solo pero combinado con <code>type: ALL</code> significa que lee toda la tabla y luego descarta lo que no necesita.</li>
</ul>
<p>Para un diagnóstico aún más detallado, puedes usar el formato JSON:</p>
<pre>EXPLAIN FORMAT=JSON SELECT * FROM wp_postmeta WHERE meta_key = '_price';</pre>
<p>El formato JSON te da información adicional como el coste estimado de la consulta, que es útil para comparar antes y después de aplicar una optimización.</p>
<p>Si usas MySQL Workbench (puedes conectarte remotamente si tu hosting lo permite o activando la opción de MySQL remoto en cPanel), la vista gráfica de <code>EXPLAIN</code> te marca en rojo los pasos lentos, en naranja los que se pueden mejorar y en verde los que están bien. Muy visual y práctico para entender de un vistazo dónde está el cuello de botella.</p>
<h2>Los culpables habituales</h2>
<p>Con las herramientas anteriores vas a encontrar las consultas problemáticas. Pero para que sepas qué estás buscando, estos son los patrones que se repiten una y otra vez en instalaciones de WordPress con problemas de rendimiento en la base de datos.</p>
<h3>Consultas lentas</h3>
<p><strong><code>wp_options</code> con <code>autoload</code> descontrolado:</strong></p>
<p>Cada vez que se carga una página, WordPress ejecuta una consulta que trae de golpe todas las opciones de la tabla <code>wp_options</code> que tienen el campo <code>autoload</code> con valor <code>yes</code>. En una instalación recién hecha esto no es problema, pero con el tiempo y con plugins que van añadiendo opciones con autoload activado, esa consulta inicial puede tener que cargar varios megabytes de datos en cada petición.</p>
<p>Lo peor es que muchas de esas opciones con autoload ni siquiera se necesitan en cada página. Son configuraciones de plugins que solo se usan en contextos específicos, pero que se cargan siempre por defecto.</p>
<p>Si quieres profundizar en este tema concreto, tengo un artículo detallado sobre cómo <a href="https://ayudawp.com/identificar-optimizar-tablas-lentas-base-datos/" target="_blank" rel="noopener ugc">identificar y optimizar las tablas lentas de la base de datos con índices</a>.</p>
<p><strong><code>meta_query</code> sobre <code>wp_postmeta</code> sin índices:</strong></p>
<p>Este es el clásico de WooCommerce con catálogos grandes, pero también afecta a cualquier web que use campos personalizados (custom fields) de forma intensiva. La tabla <code>wp_postmeta</code> no tiene un índice compuesto sobre <code>meta_key</code> y <code>meta_value</code>, así que cuando haces una <code>meta_query</code> buscando productos por precio, por atributo o por cualquier campo personalizado, MySQL tiene que recorrer una tabla que puede tener cientos de miles o millones de filas.</p>
<p>Haz <code>EXPLAIN</code> de una consulta típica de filtrado por meta y verás <code>type: ALL</code> o <code>type: ref</code> con un número de filas absurdo.</p>
<p><strong>Búsqueda interna con <code>LIKE</code> sobre tablas grandes:</strong></p>
<p>La búsqueda nativa de WordPress usa <code>LIKE '%término%'</code> para buscar en títulos y contenido. El problema del comodín al principio (<code>%</code>) es que impide usar cualquier índice, así que MySQL se ve obligado a leer cada fila de <code>wp_posts</code> para buscar coincidencias. En una web con miles de entradas, esto es muy lento.</p>
<p><strong>Consultas con múltiples <code>JOIN</code> pesados:</strong></p>
<p>Cuando un plugin o un tema necesita combinar datos de varias tablas (posts + postmeta + terms + termmeta), el número de filas que MySQL tiene que procesar se multiplica. Si además alguna de esas tablas no tiene los índices adecuados, el resultado es una consulta que tarda segundos en ejecutarse.</p>
<h3>Consultas agresivas (alto consumo de recursos)</h3>
<p><strong>Precarga o precalentamiento de caché que lanza consultas masivas:</strong></p>
<p>Algunos plugins de caché tienen opciones para precalentar la caché generando todas las páginas de golpe. Lo que hacen internamente es lanzar una consulta para obtener todas las URLs del sitio y luego empezar a visitarlas una detrás de otra (o incluso varias a la vez). Cada visita genera su propio conjunto de consultas a la base de datos, y si se ejecutan muchas a la vez, la base de datos se satura.</p>
<p>También pasa con plugins de sitemap que generan el mapa del sitio consultando toda la base de datos de golpe en vez de ir por partes.</p>
<p><strong>Plugins que hacen <code>SELECT *</code> sin <code>LIMIT</code>:</strong></p>
<p>Hay plugins que necesitan procesar datos en lote (exportaciones, generación de informes, envío masivo de correos) y que no implementan paginación. Hacen un <code>SELECT *</code> sobre la tabla completa, cargan todo en la memoria PHP y luego lo procesan. Si la tabla tiene 100.000 filas, meten 100.000 filas en la RAM de golpe.</p>
<p><strong>Importaciones y exportaciones sin procesamiento por lotes:</strong></p>
<p>Importar miles de productos en WooCommerce o miles de entradas con un plugin que no procesa por lotes puede colapsar la base de datos. Cada inserción o actualización dispara sus propias consultas, y si no se hacen por lotes, el servidor no da abasto.</p>
<h3>Consultas excesivas o frecuentes</h3>
<p><strong>Consultas <code>N+1</code> en bucle:</strong></p>
<p>Este es uno de los problemas más comunes y más difíciles de detectar si no sabes qué buscar. Ocurre cuando un tema o plugin ejecuta una consulta por cada elemento de un listado, en vez de traer todos los datos de una sola vez.</p>
<p>El ejemplo típico: un tema que muestra 20 entradas en una página de archivo y, dentro del bucle, hace <code>get_post_meta()</code> para cada entrada individualmente. Resultado: 1 consulta para traer las 20 entradas + 20 consultas adicionales para los meta de cada una. Si además pide datos de taxonomías, autor y miniatura, fácilmente llegas a 100+ consultas solo para un listado.</p>
<p>WordPress tiene mecanismos para precargar los meta y las taxonomías de golpe (<code>update_post_meta_cache</code> y <code>update_post_term_cache</code>), pero muchos temas y plugins los desactivan o no los aprovechan.</p>
<p><strong>Heartbeat API haciendo <code>polling</code> continuo:</strong></p>
<p>La Heartbeat API de WordPress envía una petición AJAX al servidor cada 15-60 segundos (dependiendo del contexto) para comprobar cosas como el autoguardado, las notificaciones y si alguien más está editando el mismo contenido. Cada una de esas peticiones ejecuta varias consultas a la base de datos.</p>
<p>Si tienes varios usuarios trabajando en el admin a la vez, cada uno está generando estas peticiones periódicas, y el efecto acumulado puede ser considerable. En un WordPress con 10 usuarios conectados al admin simultáneamente, el Heartbeat puede estar generando cientos de consultas por minuto sin que nadie sea consciente.</p>
<p><strong>Consultas duplicadas:</strong></p>
<p>Es más común de lo que parece. Un tema carga ciertas opciones con <code>get_option()</code>, y un plugin pide exactamente las mismas opciones por su cuenta. O dos plugins distintos ejecutan la misma consulta para obtener la misma información. WordPress tiene su propia caché de objetos en memoria para una sola petición, pero no siempre funciona si los plugins hacen consultas directas con <code>$wpdb</code> en vez de usar las funciones estándar de WordPress.</p>
<p><strong>WP-Cron con tareas acumuladas:</strong></p>
<p>WordPress simula un cron mediante una comprobación en cada carga de página. Si hay plugins mal diseñados que programan tareas y nunca las limpian, o que programan la misma tarea varias veces, puedes acabar con cientos de tareas programadas que se ejecutan todas de golpe cuando les toca, saturando la base de datos en ese momento.</p>
<p>Esto es especialmente problemático en webs con poco tráfico, porque las tareas se acumulan y cuando finalmente llega una visita, se disparan todas a la vez.</p>
<h3>Tabla resumen</h3>
<table>
<thead>
<tr>
<th>Problema</th>
<th>Tipo</th>
<th>Cómo se detecta</th>
<th>Impacto principal</th>
</tr>
</thead>
<tbody>
<tr>
<td>Autoload descontrolado en <code>wp_options</code></td>
<td>Lenta</td>
<td>Consulta de tamaño <code>autoload</code> &gt; 1 MB</td>
<td>Cada carga de página más lenta</td>
</tr>
<tr>
<td><code>meta_query</code> sin índices en <code>wp_postmeta</code></td>
<td>Lenta</td>
<td><code>EXPLAIN</code> muestra <code>type: ALL</code></td>
<td>Filtrados y búsquedas lentos</td>
</tr>
<tr>
<td>Búsqueda interna con <code>LIKE %…%</code></td>
<td>Lenta</td>
<td>Query Monitor, consultas con <code>LIKE</code></td>
<td>Búsquedas muy lentas en webs grandes</td>
</tr>
<tr>
<td>Múltiples <code>JOIN</code> pesados</td>
<td>Lenta</td>
<td><code>EXPLAIN</code> muestra filas enormes</td>
<td>Páginas concretas muy lentas</td>
</tr>
<tr>
<td>Precarga masiva de caché</td>
<td>Agresiva</td>
<td>SHOW PROCESSLIST, picos de carga</td>
<td>Saturación puntual del servidor</td>
</tr>
<tr>
<td><code>SELECT *</code> sin <code>LIMIT</code></td>
<td>Agresiva</td>
<td>Query Monitor, filas devueltas</td>
<td>Alto consumo de RAM</td>
</tr>
<tr>
<td>Importaciones sin lotes</td>
<td>Agresiva</td>
<td>SHOW PROCESSLIST durante imports</td>
<td>Base de datos bloqueada durante el proceso</td>
</tr>
<tr>
<td>Consultas <code>N+1</code> en bucle</td>
<td>Excesiva</td>
<td>Query Monitor &gt; 100 consultas/página</td>
<td>Tiempo acumulado, TTFB alto</td>
</tr>
<tr>
<td>Heartbeat API descontrolada</td>
<td>Excesiva</td>
<td>Query Monitor en admin, peticiones AJAX</td>
<td>Carga constante en el admin</td>
</tr>
<tr>
<td>Consultas duplicadas</td>
<td>Excesiva</td>
<td>Query Monitor &gt; Duplicate Queries</td>
<td>Trabajo innecesario, TTFB alto</td>
</tr>
<tr>
<td>WP-Cron con tareas acumuladas</td>
<td>Excesiva</td>
<td>WP Crontrol o <code>wp cron event list</code></td>
<td>Picos de carga impredecibles</td>
</tr>
</tbody>
</table>
<h2>Consultas de diagnóstico</h2>
<p>Antes de pasar a las soluciones, necesitas datos concretos de tu instalación. Para cada consulta de diagnóstico te doy tres formas de ejecutarla:</p>
<ul>
<li>Directamente como SQL (en phpMyAdmin o cualquier cliente de base de datos).</li>
<li>Como código PHP (un mu-plugin temporal que puedes subir si no tienes otro acceso).</li>
<li>Por WP-CLI si tienes SSH. Usa la que te venga mejor según tu situación.</li>
</ul>
<h3>Tamaño total de datos con autoload</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT SUM(LENGTH(option_value)) AS autoload_size_bytes,
ROUND(SUM(LENGTH(option_value)) / 1024 / 1024, 2) AS autoload_size_mb
FROM wp_options
WHERE autoload = 'yes';</pre>
<p><strong>PHP</strong> (mu-plugin temporal en <code>/wp-content/mu-plugins/ayudawp-diagnostico.php</code>):</p>
<pre>&lt;?php
/**
 * AyudaWP - Diagnóstico: tamaño de autoload.
 * Muestra el resultado como aviso en el admin.
 * Eliminar después de usar.
 */
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

function ayudawp_diag_autoload_size() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $result = $wpdb-&gt;get_row(
        "SELECT SUM(LENGTH(option_value)) AS total_bytes
        FROM {$wpdb-&gt;options}
        WHERE autoload = 'yes'"
    );
    $mb = round( $result-&gt;total_bytes / 1024 / 1024, 2 );
    $class = $result-&gt;total_bytes &gt; 1000000 ? 'notice-error' : 'notice-info';
    echo '&lt;div class="notice ' . esc_attr( $class ) . '"&gt;&lt;p&gt;';
    echo 'AyudaWP Diagnostico: Autoload total = '
        . esc_html( number_format( $result-&gt;total_bytes, 0, ',', '.' ) )
        . ' bytes (' . esc_html( $mb ) . ' MB).';
    if ( $result-&gt;total_bytes &gt; 1000000 ) {
        echo ' &lt;strong&gt;Supera 1 MB, conviene revisarlo.&lt;/strong&gt;';
    }
    echo '&lt;/p&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_autoload_size' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT SUM(LENGTH(option_value)) AS autoload_bytes, ROUND(SUM(LENGTH(option_value)) / 1024 / 1024, 2) AS autoload_mb FROM $(wp db prefix)options WHERE autoload = 'yes';"</pre>
<h3>Las 30 opciones con <code>autoload</code> más pesadas</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT option_name,
LENGTH(option_value) AS size_bytes,
ROUND(LENGTH(option_value) / 1024, 2) AS size_kb
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size_bytes DESC
LIMIT 30;</pre>
<p><strong>PHP</strong> (añadir al mismo mu-plugin de diagnóstico):</p>
<pre>function ayudawp_diag_top_autoload() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $results = $wpdb-&gt;get_results(
        "SELECT option_name, LENGTH(option_value) AS size_bytes
        FROM {$wpdb-&gt;options}
        WHERE autoload = 'yes'
        ORDER BY size_bytes DESC
        LIMIT 30"
    );
    echo '&lt;div class="notice notice-info"&gt;&lt;p&gt;&lt;strong&gt;AyudaWP - Top 30 autoload:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;';
    foreach ( $results as $row ) {
        $kb = round( $row-&gt;size_bytes / 1024, 2 );
        echo '&lt;li&gt;' . esc_html( $row-&gt;option_name )
            . ' - ' . esc_html( $kb ) . ' KB&lt;/li&gt;';
    }
    echo '&lt;/ol&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_top_autoload' );</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT option_name, LENGTH(option_value) AS size_bytes, ROUND(LENGTH(option_value) / 1024, 2) AS size_kb FROM $(wp db prefix)options WHERE autoload = 'yes' ORDER BY size_bytes DESC LIMIT 30;"</pre>
<h3>Tablas con más filas y mayor tamaño</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT TABLE_NAME,
TABLE_ROWS,
ROUND(DATA_LENGTH / 1024 / 1024, 2) AS data_mb,
ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS index_mb,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb,
ROUND(DATA_FREE / 1024 / 1024, 2) AS fragmented_mb,
ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'nombre_de_tu_base_de_datos'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_table_sizes() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $db_name = DB_NAME;
    $results = $wpdb-&gt;get_results(
        $wpdb-&gt;prepare(
            "SELECT TABLE_NAME, TABLE_ROWS,
            ROUND(DATA_LENGTH / 1024 / 1024, 2) AS data_mb,
            ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS index_mb,
            ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb,
            ENGINE
            FROM information_schema.TABLES
            WHERE TABLE_SCHEMA = %s
            ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC",
            $db_name
        )
    );
    echo '&lt;div class="notice notice-info"&gt;';
    echo '&lt;p&gt;&lt;strong&gt;AyudaWP - Tablas por tamaño:&lt;/strong&gt;&lt;/p&gt;';
    echo '&lt;table style="border-collapse:collapse;width:100%"&gt;';
    echo '&lt;tr&gt;&lt;th style="text-align:left;padding:4px;border-bottom:1px solid #ccc"&gt;Tabla&lt;/th&gt;';
    echo '&lt;th style="text-align:right;padding:4px;border-bottom:1px solid #ccc"&gt;Filas&lt;/th&gt;';
    echo '&lt;th style="text-align:right;padding:4px;border-bottom:1px solid #ccc"&gt;Total MB&lt;/th&gt;';
    echo '&lt;th style="text-align:left;padding:4px;border-bottom:1px solid #ccc"&gt;Motor&lt;/th&gt;&lt;/tr&gt;';
    foreach ( $results as $row ) {
        echo '&lt;tr&gt;&lt;td style="padding:4px"&gt;' . esc_html( $row-&gt;TABLE_NAME ) . '&lt;/td&gt;';
        echo '&lt;td style="text-align:right;padding:4px"&gt;' . esc_html( number_format( $row-&gt;TABLE_ROWS, 0, ',', '.' ) ) . '&lt;/td&gt;';
        echo '&lt;td style="text-align:right;padding:4px"&gt;' . esc_html( $row-&gt;total_mb ) . '&lt;/td&gt;';
        echo '&lt;td style="padding:4px"&gt;' . esc_html( $row-&gt;ENGINE ) . '&lt;/td&gt;&lt;/tr&gt;';
    }
    echo '&lt;/table&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_table_sizes' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT TABLE_NAME, TABLE_ROWS, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;" --table</pre>
<h3><code>postmeta</code> huérfano (sin ninguna entrada asociada)</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT COUNT(*) AS orphaned_postmeta
FROM wp_postmeta
WHERE post_id NOT IN (SELECT ID FROM wp_posts);</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_orphaned_postmeta() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $count = $wpdb-&gt;get_var(
        "SELECT COUNT(*) FROM {$wpdb-&gt;postmeta}
        WHERE post_id NOT IN (SELECT ID FROM {$wpdb-&gt;posts})"
    );
    $class = $count &gt; 1000 ? 'notice-warning' : 'notice-info';
    echo '&lt;div class="notice ' . esc_attr( $class ) . '"&gt;&lt;p&gt;';
    echo 'AyudaWP: Postmeta huerfano = '
        . esc_html( number_format( $count, 0, ',', '.' ) ) . ' registros.';
    if ( $count &gt; 1000 ) {
        echo ' &lt;strong&gt;Conviene limpiarlo.&lt;/strong&gt;';
    }
    echo '&lt;/p&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_orphaned_postmeta' );</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT COUNT(*) AS orphaned FROM $(wp db prefix)postmeta WHERE post_id NOT IN (SELECT ID FROM $(wp db prefix)posts);"</pre>
<h3><code>commentmeta</code> huérfano (sin ningún comentario asociado)</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT COUNT(*) AS orphaned_commentmeta
FROM wp_commentmeta
WHERE comment_id NOT IN (SELECT comment_ID FROM wp_comments);</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_orphaned_commentmeta() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $count = $wpdb-&gt;get_var(
        "SELECT COUNT(*) FROM {$wpdb-&gt;commentmeta}
        WHERE comment_id NOT IN (SELECT comment_ID FROM {$wpdb-&gt;comments})"
    );
    echo '&lt;div class="notice notice-info"&gt;&lt;p&gt;';
    echo 'AyudaWP: Commentmeta huerfano = '
        . esc_html( number_format( $count, 0, ',', '.' ) ) . ' registros.';
    echo '&lt;/p&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_orphaned_commentmeta' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT COUNT(*) AS orphaned FROM $(wp db prefix)commentmeta WHERE comment_id NOT IN (SELECT comment_ID FROM $(wp db prefix)comments);"</pre>
<h3>Transients caducados pendientes de limpiar</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT COUNT(*) AS expired_transients
FROM wp_options
WHERE option_name LIKE '%_transient_timeout_%'
AND option_value &lt; UNIX_TIMESTAMP();</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_expired_transients() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $count = $wpdb-&gt;get_var(
        "SELECT COUNT(*) FROM {$wpdb-&gt;options}
        WHERE option_name LIKE '%_transient_timeout_%'
        AND option_value &lt; UNIX_TIMESTAMP()"
    );
    echo '&lt;div class="notice notice-info"&gt;&lt;p&gt;';
    echo 'AyudaWP: Transients caducados = '
        . esc_html( number_format( $count, 0, ',', '.' ) ) . '.';
    echo '&lt;/p&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_expired_transients' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp transient delete --expired</pre>
<p>En WP-CLI el comando directamente los borra. Si solo quieres ver cuántos hay sin eliminarlos, usa la consulta SQL con <code>wp db query</code>.</p>
<h3>Las 20 entradas con más revisiones</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT p.post_title,
p.ID AS post_id,
COUNT(r.ID) AS revision_count
FROM wp_posts p
INNER JOIN wp_posts r ON r.post_parent = p.ID AND r.post_type = 'revision'
WHERE p.post_type NOT IN ('revision', 'auto-draft')
GROUP BY p.ID
ORDER BY revision_count DESC
LIMIT 20;</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_top_revisions() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $results = $wpdb-&gt;get_results(
        "SELECT p.post_title, p.ID, COUNT(r.ID) AS rev_count
        FROM {$wpdb-&gt;posts} p
        INNER JOIN {$wpdb-&gt;posts} r ON r.post_parent = p.ID AND r.post_type = 'revision'
        WHERE p.post_type NOT IN ('revision', 'auto-draft')
        GROUP BY p.ID
        ORDER BY rev_count DESC
        LIMIT 20"
    );
    echo '&lt;div class="notice notice-info"&gt;';
    echo '&lt;p&gt;&lt;strong&gt;AyudaWP - Top 20 entradas con mas revisiones:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;';
    foreach ( $results as $row ) {
        echo '&lt;li&gt;' . esc_html( $row-&gt;post_title )
            . ' (ID ' . intval( $row-&gt;ID ) . ') - '
            . intval( $row-&gt;rev_count ) . ' revisiones&lt;/li&gt;';
    }
    echo '&lt;/ol&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_top_revisions' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT p.post_title, p.ID, COUNT(r.ID) AS rev_count FROM $(wp db prefix)posts p INNER JOIN $(wp db prefix)posts r ON r.post_parent = p.ID AND r.post_type = 'revision' WHERE p.post_type NOT IN ('revision', 'auto-draft') GROUP BY p.ID ORDER BY rev_count DESC LIMIT 20;"</pre>
<h3>Tablas que no son del core de WordPress</h3>
<p>Útil para detectar tablas huérfanas de plugins que ya no tienes instalados.</p>
<p><strong>SQL:</strong></p>
<pre>SELECT TABLE_NAME,
TABLE_ROWS,
ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS size_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'nombre_de_tu_base_de_datos'
AND TABLE_NAME NOT IN (
    'wp_commentmeta', 'wp_comments', 'wp_links',
    'wp_options', 'wp_postmeta', 'wp_posts',
    'wp_termmeta', 'wp_terms', 'wp_term_relationships',
    'wp_term_taxonomy', 'wp_usermeta', 'wp_users'
)
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_non_core_tables() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    $prefix = $wpdb-&gt;prefix;
    $core   = array(
        $prefix . 'commentmeta', $prefix . 'comments', $prefix . 'links',
        $prefix . 'options', $prefix . 'postmeta', $prefix . 'posts',
        $prefix . 'termmeta', $prefix . 'terms', $prefix . 'term_relationships',
        $prefix . 'term_taxonomy', $prefix . 'usermeta', $prefix . 'users',
    );
    $placeholders = implode( ',', array_fill( 0, count( $core ), '%s' ) );
    $results = $wpdb-&gt;get_results(
        $wpdb-&gt;prepare(
            "SELECT TABLE_NAME, TABLE_ROWS,
            ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS size_mb
            FROM information_schema.TABLES
            WHERE TABLE_SCHEMA = %s
            AND TABLE_NAME NOT IN ($placeholders)
            ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC",
            array_merge( array( DB_NAME ), $core )
        )
    );
    if ( empty( $results ) ) {
        echo '&lt;div class="notice notice-success"&gt;&lt;p&gt;AyudaWP: No hay tablas fuera del core.&lt;/p&gt;&lt;/div&gt;';
        return;
    }
    echo '&lt;div class="notice notice-warning"&gt;';
    echo '&lt;p&gt;&lt;strong&gt;AyudaWP - Tablas fuera del core de WordPress:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;';
    foreach ( $results as $row ) {
        echo '&lt;li&gt;' . esc_html( $row-&gt;TABLE_NAME )
            . ' - ' . esc_html( number_format( $row-&gt;TABLE_ROWS, 0, ',', '.' ) )
            . ' filas - ' . esc_html( $row-&gt;size_mb ) . ' MB&lt;/li&gt;';
    }
    echo '&lt;/ol&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_non_core_tables' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT TABLE_NAME, TABLE_ROWS, ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS size_mb FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME NOT LIKE '$(wp db prefix)comment%' ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;" --table</pre>
<blockquote><p><strong>Nota</strong>: En WP-CLI este es un caso donde la consulta SQL completa con todas las exclusiones es más precisa. El comando de arriba es una aproximación rápida; para el listado exacto de tablas core, usa la consulta SQL completa con <code>wp db query</code>.</p></blockquote>
<h3>Índices existentes en una tabla</h3>
<p>Antes de crear un índice, comprueba si ya existe.</p>
<p><strong>SQL:</strong></p>
<pre>SHOW INDEX FROM wp_postmeta;</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_diag_show_indexes() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    global $wpdb;
    // Cambia la tabla a revisar.
    $table   = $wpdb-&gt;postmeta;
    $results = $wpdb-&gt;get_results( "SHOW INDEX FROM {$table}" );
    echo '&lt;div class="notice notice-info"&gt;';
    echo '&lt;p&gt;&lt;strong&gt;AyudaWP - Indices de ' . esc_html( $table ) . ':&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;';
    foreach ( $results as $row ) {
        echo '&lt;li&gt;' . esc_html( $row-&gt;Key_name )
            . ' (' . esc_html( $row-&gt;Column_name ) . ')&lt;/li&gt;';
    }
    echo '&lt;/ul&gt;&lt;/div&gt;';
}
add_action( 'admin_notices', 'ayudawp_diag_show_indexes' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SHOW INDEX FROM $(wp db prefix)postmeta;"</pre>
<h3>Motor de almacenamiento de cada tabla (detectar MyISAM)</h3>
<p><strong>SQL:</strong></p>
<pre>SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'nombre_de_tu_base_de_datos'
ORDER BY TABLE_NAME;</pre>
<p><strong>PHP:</strong> esta información ya la muestra la consulta de tamaño de tablas que vimos antes, que incluye la columna <code>ENGINE</code>.</p>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME;"</pre>
<h2>Soluciones según el tipo de problema</h2>
<p>Ahora que tienes diagnosticado qué pasa y los datos concretos de tu instalación, vamos con las soluciones. De nuevo, para cada una te doy las opciones según tu nivel de acceso.</p>
<h3>Soluciones para consultas lentas</h3>
<p><strong>Crear índices donde faltan:</strong></p>
<p>Los índices son la solución más directa para consultas lentas. Un índice permite a MySQL encontrar las filas que necesita sin tener que recorrer toda la tabla.</p>
<p>El caso más típico es el índice de autoload en <code>wp_options</code>:</p>
<p><strong>SQL:</strong></p>
<pre>CREATE INDEX idx_autoload ON wp_options(autoload);</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_create_autoload_index() {
    global $wpdb;
    // Comprobar si el índice ya existe.
    $indexes = $wpdb-&gt;get_results( "SHOW INDEX FROM {$wpdb-&gt;options} WHERE Key_name = 'idx_autoload'" );
    if ( ! empty( $indexes ) ) {
        return; // Ya existe.
    }
    $wpdb-&gt;query( "CREATE INDEX idx_autoload ON {$wpdb-&gt;options}(autoload)" );
}
// Ejecutar una sola vez.
add_action( 'admin_init', 'ayudawp_create_autoload_index' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "CREATE INDEX idx_autoload ON $(wp db prefix)options(autoload);"</pre>
<p>Para <code>wp_postmeta</code>, si haces muchas búsquedas por <code>meta_key</code> y <code>meta_value</code> (típico de WooCommerce):</p>
<p><strong>SQL:</strong></p>
<pre>CREATE INDEX idx_meta_key_value ON wp_postmeta(meta_key(191), meta_value(100));</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_create_postmeta_index() {
    global $wpdb;
    $indexes = $wpdb-&gt;get_results(
        "SHOW INDEX FROM {$wpdb-&gt;postmeta} WHERE Key_name = 'idx_meta_key_value'"
    );
    if ( ! empty( $indexes ) ) {
        return;
    }
    $wpdb-&gt;query(
        "CREATE INDEX idx_meta_key_value ON {$wpdb-&gt;postmeta}(meta_key(191), meta_value(100))"
    );
}
add_action( 'admin_init', 'ayudawp_create_postmeta_index' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "CREATE INDEX idx_meta_key_value ON $(wp db prefix)postmeta(meta_key(191), meta_value(100));"</pre>
<p>Cambia <code>wp_options</code> y <code>wp_postmeta</code> por el nombre real de tus tablas si usas un prefijo distinto a <code>wp_</code>. En las versiones PHP, al usar <code>$wpdb-&gt;options</code> y <code>$wpdb-&gt;postmeta</code>, WordPress ya aplica el prefijo correcto automáticamente.</p>
<ul>
<li><strong>Precauciones con los índices:</strong> los índices aceleran las lecturas pero ralentizan ligeramente las escrituras (<code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code>) porque MySQL tiene que actualizar el índice cada vez. En la mayoría de los WordPress, las lecturas superan ampliamente a las escrituras, así que el beneficio compensa. Pero no te dediques a crear índices a lo loco sin antes confirmar con <code>EXPLAIN</code> que la consulta realmente los necesita y los va a usar.</li>
<li><strong>Limpia autoloads innecesarios: </strong>cuando hayas identificado las consultas de diagnóstico qué opciones ocupan más y no necesitan cargarse en cada petición cámbialas a <code>no</code>:</li>
</ul>
<p><strong>SQL:</strong></p>
<pre>UPDATE wp_options SET autoload = 'no' WHERE option_name = 'nombre_de_la_opcion';</pre>
<p><strong>PHP:</strong></p>
<pre>// Cambiar autoload de una opción concreta.
// Sustituye 'nombre_de_la_opcion' por la que quieras cambiar.
function ayudawp_fix_autoload() {
    global $wpdb;
    $wpdb-&gt;update(
        $wpdb-&gt;options,
        array( 'autoload' =&gt; 'no' ),
        array( 'option_name' =&gt; 'nombre_de_la_opcion' ),
        array( '%s' ),
        array( '%s' )
    );
}
add_action( 'admin_init', 'ayudawp_fix_autoload' );
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "UPDATE $(wp db prefix)options SET autoload = 'no' WHERE option_name = 'nombre_de_la_opcion';"</pre>
<blockquote><p><strong>Cuidado</strong>: no cambies el autoload de opciones del núcleo de WordPress ni de opciones que no sepas para qué sirven. Investiga antes qué hace cada opción. Las más seguras de cambiar suelen ser las de plugins de estadísticas, logs, caché de datos temporales y configuraciones de plugins que solo se usan en el admin.</p></blockquote>
<p><strong>Sustituir la búsqueda interna:</strong></p>
<p>Si la búsqueda nativa de WordPress está generando consultas lentas con <code>LIKE</code>, la solución más efectiva es usar un plugin de búsqueda que utilice su propio sistema de indexación, como <a href="https://es.wordpress.org/plugins/searchwp/" target="_blank" rel="nofollow noopener">SearchWP</a> o <a href="https://es.wordpress.org/plugins/relevanssi/" target="_blank" rel="nofollow noopener">Relevanssi</a>. Estos plugins crean sus propios índices optimizados para búsqueda, evitando las consultas <code>LIKE</code> sobre <code>wp_posts</code>. En este caso no hay alternativa SQL o PHP directa, ya que el problema es estructural: la búsqueda nativa de WordPress funciona así por diseño y no se puede resolver con un simple cambio en la base de datos.</p>
<h3>Soluciones para consultas agresivas</h3>
<p><strong>Controlar la precarga de caché:</strong></p>
<p>Si usas un plugin de caché con opción de precalentamiento, revisa su configuración. Busca opciones para limitar cuántas páginas precarga a la vez (concurrencia) y para añadir una pausa entre peticiones. Si no ofrece estas opciones, valora si realmente necesitas el precalentamiento o si es mejor dejar que la caché se genere bajo demanda conforme los visitantes van entrando. Esto es cuestión de configuración del plugin, no hay consulta SQL ni snippet PHP que lo resuelva.</p>
<p><strong>Limitar resultados en consultas personalizadas:</strong></p>
<p>Si desarrollas o mantienes código personalizado en tu web, asegúrate de que todas las consultas a tablas grandes incluyan <code>LIMIT</code>. Nunca hagas <code>SELECT * FROM tabla_enorme</code> sin limitar los resultados. Si necesitas procesar muchos registros, hazlo por lotes:</p>
<pre>// Mal: traer todo de golpe.
$results = $wpdb-&gt;get_results( "SELECT * FROM {$wpdb-&gt;postmeta}" );

// Bien: procesar por lotes de 500.
$offset = 0;
$batch  = 500;
do {
    $results = $wpdb-&gt;get_results(
        $wpdb-&gt;prepare(
            "SELECT * FROM {$wpdb-&gt;postmeta} LIMIT %d OFFSET %d",
            $batch,
            $offset
        )
    );
    // Procesar $results aquí.
    $offset += $batch;
} while ( ! empty( $results ) );
</pre>
<h3>Soluciones para consultas excesivas o frecuentes</h3>
<p><strong>Usar transients para consultas costosas que se repiten:</strong></p>
<p>Si tienes una consulta que se ejecuta en cada carga de página y los datos no cambian constantemente (por ejemplo, un listado de los productos más vendidos, los artículos más populares o un menú generado dinámicamente), almacena el resultado con la API de transients de WordPress:</p>
<pre>function ayudawp_get_popular_posts() {
    // Intentar obtener el resultado cacheado.
    $cached = get_transient( 'ayudawp_popular_posts' );

    if ( false !== $cached ) {
        return $cached;
    }

    // Si no hay cache, ejecutar la consulta.
    $posts = new WP_Query( array(
        'posts_per_page'         =&gt; 10,
        'orderby'                =&gt; 'comment_count',
        'order'                  =&gt; 'DESC',
        'no_found_rows'          =&gt; true,
        'update_post_meta_cache' =&gt; false,
        'update_post_term_cache' =&gt; false,
    ) );

    // Guardar en cache durante 12 horas.
    set_transient( 'ayudawp_popular_posts', $posts-&gt;posts, 12 * HOUR_IN_SECONDS );

    return $posts-&gt;posts;
}
</pre>
<p>La próxima vez que se cargue la página, en vez de ejecutar la consulta pesada, WordPress simplemente lee el resultado desde <code>wp_options</code>, que es una lectura mucho más rápida. El transient se renueva automáticamente cuando caduca.</p>
<p><strong>Optimizar <code>WP_Query</code> para evitar consultas innecesarias:</strong></p>
<p>Cada vez que haces una <code>WP_Query</code>, WordPress ejecuta internamente varias consultas adicionales (paginación, caché de meta, caché de taxonomías). Si no las necesitas, desactívalas:</p>
<pre>$query = new WP_Query( array(
    'posts_per_page'         =&gt; 10,
    'post_type'              =&gt; 'post',
    // No calcular el total para paginación si no la necesitas.
    'no_found_rows'          =&gt; true,
    // No precargar meta si no los vas a usar.
    'update_post_meta_cache' =&gt; false,
    // No precargar taxonomías si no las vas a usar.
    'update_post_term_cache' =&gt; false,
    // Traer solo los campos que necesites.
    'fields'                 =&gt; 'ids',
) );
</pre>
<p>Cada uno de estos parámetros te ahorra una o más consultas. En un listado donde solo necesitas los IDs para luego procesarlos tú, puedes pasar de 5 consultas por <code>WP_Query</code> a solo 1.</p>
<p><strong>Controlar la Heartbeat API:</strong></p>
<p>Puedes reducir la frecuencia del Heartbeat o desactivarlo donde no lo necesites añadiendo un mu-plugin:</p>
<pre>&lt;?php
/**
 * AyudaWP - Controlar la frecuencia del Heartbeat API.
 *
 * Reduce la frecuencia en el admin y lo desactiva
 * en el front-end donde no es necesario.
 */

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

/**
 * Ajustar la frecuencia del Heartbeat.
 *
 * @param array $settings Configuración del Heartbeat.
 * @return array
 */
function ayudawp_heartbeat_settings( $settings ) {
    // Aumentar el intervalo a 60 segundos (por defecto son 15-30).
    $settings['interval'] = 60;
    return $settings;
}
add_filter( 'heartbeat_settings', 'ayudawp_heartbeat_settings' );

/**
 * Desactivar Heartbeat en el front-end.
 */
function ayudawp_disable_heartbeat_frontend() {
    if ( ! is_admin() ) {
        wp_deregister_script( 'heartbeat' );
    }
}
add_action( 'init', 'ayudawp_disable_heartbeat_frontend', 1 );
</pre>
<p>Esto es solo PHP/mu-plugin. No hay equivalente SQL porque el Heartbeat es un proceso de WordPress, no de la base de datos. En WP-CLI no tiene sentido porque el Heartbeat solo funciona cuando hay usuarios conectados al navegador.</p>
<p><strong>Limpiar tareas de WP-Cron duplicadas o huérfanas:</strong></p>
<p><strong>WP-CLI</strong> (el método más directo):</p>
<pre># Ver todas las tareas programadas.
wp cron event list

# Borrar tareas de un hook concreto.
wp cron event delete nombre_del_hook</pre>
<p><strong>Plugin:</strong> si no tienes SSH, instala temporalmente <a href="https://es.wordpress.org/plugins/wp-crontrol/" target="_blank" rel="nofollow noopener">WP Crontrol</a> para ver y gestionar las tareas desde el admin. Busca tareas duplicadas (la misma tarea programada varias veces a la misma hora) y elimina las sobrantes.</p>
<p><strong>SQL:</strong> Las tareas de cron se guardan en la opción <code>cron</code> de <code>wp_options</code> como un array serializado. No se recomienda editarlas directamente con SQL porque corromper un array serializado dejaría el cron roto. Usa WP-CLI o WP Crontrol para este caso.</p>
<h3>Otras optimizaciones que ayudan SIEMPRE</h3>
<p><strong>Limpiar <code>postmeta</code> huérfano:</strong></p>
<p><strong>SQL:</strong></p>
<pre>DELETE FROM wp_postmeta
WHERE post_id NOT IN (SELECT ID FROM wp_posts);</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_clean_orphaned_postmeta() {
    global $wpdb;
    $deleted = $wpdb-&gt;query(
        "DELETE FROM {$wpdb-&gt;postmeta}
        WHERE post_id NOT IN (SELECT ID FROM {$wpdb-&gt;posts})"
    );
    return $deleted;
}
// Llamar manualmente o desde un hook puntual.
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "DELETE FROM $(wp db prefix)postmeta WHERE post_id NOT IN (SELECT ID FROM $(wp db prefix)posts);"</pre>
<p><strong>Lo mismo para <code>commentmeta</code> y <code>term_relationships</code> huérfanas:</strong></p>
<p><strong>SQL:</strong></p>
<pre>DELETE FROM wp_commentmeta
WHERE comment_id NOT IN (SELECT comment_ID FROM wp_comments);

DELETE FROM wp_term_relationships
WHERE object_id NOT IN (SELECT ID FROM wp_posts);</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_clean_orphaned_commentmeta() {
    global $wpdb;
    $wpdb-&gt;query(
        "DELETE FROM {$wpdb-&gt;commentmeta}
        WHERE comment_id NOT IN (SELECT comment_ID FROM {$wpdb-&gt;comments})"
    );
}

function ayudawp_clean_orphaned_term_relationships() {
    global $wpdb;
    $wpdb-&gt;query(
        "DELETE FROM {$wpdb-&gt;term_relationships}
        WHERE object_id NOT IN (SELECT ID FROM {$wpdb-&gt;posts})"
    );
}
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db query "DELETE FROM $(wp db prefix)commentmeta WHERE comment_id NOT IN (SELECT comment_ID FROM $(wp db prefix)comments);"
wp db query "DELETE FROM $(wp db prefix)term_relationships WHERE object_id NOT IN (SELECT ID FROM $(wp db prefix)posts);"</pre>
<p><strong>Limitar revisiones:</strong></p>
<p>Añade esto a tu <code>wp-config.php</code>:</p>
<pre>define( 'WP_POST_REVISIONS', 5 );</pre>
<p>Esto mantiene un máximo de 5 revisiones por entrada. Es una constante de WordPress que solo funciona desde <code>wp-config.php</code>, no se puede configurar con SQL ni con un código PHP normal.</p>
<p>Si ya tienes miles de revisiones acumuladas, elimínalas:</p>
<p><strong>SQL:</strong></p>
<pre>DELETE p, pm, tr
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON pm.post_id = p.ID
LEFT JOIN wp_term_relationships tr ON tr.object_id = p.ID
WHERE p.post_type = 'revision';</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_delete_all_revisions() {
    global $wpdb;
    $wpdb-&gt;query(
        "DELETE p, pm, tr
        FROM {$wpdb-&gt;posts} p
        LEFT JOIN {$wpdb-&gt;postmeta} pm ON pm.post_id = p.ID
        LEFT JOIN {$wpdb-&gt;term_relationships} tr ON tr.object_id = p.ID
        WHERE p.post_type = 'revision'"
    );
}
</pre>
<p><strong>WP-CLI:</strong></p>
<pre># Listar cuántas revisiones hay.
wp post list --post_type=revision --format=count

# Borrar todas las revisiones.
wp post delete $(wp post list --post_type=revision --format=ids) --force</pre>
<p><strong>Eliminar <code>transients</code> caducados:</strong></p>
<p><strong>SQL:</strong></p>
<pre>DELETE FROM wp_options
WHERE option_name LIKE '%_transient_timeout_%'
AND option_value &lt; UNIX_TIMESTAMP();

DELETE FROM wp_options
WHERE option_name LIKE '%_transient_%'
AND option_name NOT LIKE '%_transient_timeout_%'
AND option_name NOT IN (
    SELECT REPLACE(option_name, '_timeout', '')
    FROM (
        SELECT option_name FROM wp_options
        WHERE option_name LIKE '%_transient_timeout_%'
    ) AS t
);</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_delete_expired_transients() {
    global $wpdb;
    // Borrar timeouts caducados.
    $wpdb-&gt;query(
        "DELETE FROM {$wpdb-&gt;options}
        WHERE option_name LIKE '%_transient_timeout_%'
        AND option_value &lt; UNIX_TIMESTAMP()"
    );
    // Borrar transients huerfanos (sin timeout asociado).
    $wpdb-&gt;query(
        "DELETE FROM {$wpdb-&gt;options}
        WHERE option_name LIKE '%_transient_%'
        AND option_name NOT LIKE '%_transient_timeout_%'
        AND option_name NOT IN (
            SELECT REPLACE(option_name, '_timeout', '')
            FROM (
                SELECT option_name FROM {$wpdb-&gt;options}
                WHERE option_name LIKE '%_transient_timeout_%'
            ) AS t
        )"
    );
}
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp transient delete --expired</pre>
<p>WP-CLI tiene este comando nativo que lo hace directamente, sin necesidad de consultas SQL.</p>
<p><strong>Convertir tablas MyISAM a InnoDB:</strong></p>
<p>Si tu WordPress lleva muchos años funcionando o se migró desde una instalación antigua, es posible que algunas tablas todavía usen el motor MyISAM en vez de InnoDB. MyISAM bloquea la tabla completa cuando se escribe en ella, lo que en una web con tráfico significa que las lecturas se quedan esperando mientras se procesa cualquier escritura.</p>
<p><strong>SQL</strong> (tabla por tabla):</p>
<pre>ALTER TABLE wp_nombre_tabla ENGINE = InnoDB;</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_convert_myisam_to_innodb() {
    global $wpdb;
    $tables = $wpdb-&gt;get_results(
        $wpdb-&gt;prepare(
            "SELECT TABLE_NAME
            FROM information_schema.TABLES
            WHERE TABLE_SCHEMA = %s
            AND ENGINE = 'MyISAM'",
            DB_NAME
        )
    );
    foreach ( $tables as $table ) {
        // Usar esc_sql para el nombre de tabla en consulta directa.
        $table_name = esc_sql( $table-&gt;TABLE_NAME );
        $wpdb-&gt;query( "ALTER TABLE `{$table_name}` ENGINE = InnoDB" );
    }
}
</pre>
<p><strong>WP-CLI:</strong></p>
<pre># Primero ver qué tablas usan MyISAM.
wp db query "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ENGINE = 'MyISAM';"

# Convertir una tabla concreta.
wp db query "ALTER TABLE $(wp db prefix)nombre_tabla ENGINE = InnoDB;"</pre>
<p>Haz esto tabla por tabla y comprueba después que todo funciona correctamente.</p>
<p><strong><code>OPTIMIZE TABLE</code>:</strong></p>
<p>Este comando reorganiza el almacenamiento físico de una tabla y recupera el espacio desperdiciado por fragmentación. Es útil después de haber hecho borrados masivos (revisiones, transients, postmeta huérfano):</p>
<p><strong>SQL:</strong></p>
<pre>OPTIMIZE TABLE wp_options, wp_postmeta, wp_posts, wp_comments, wp_commentmeta;</pre>
<p><strong>PHP:</strong></p>
<pre>function ayudawp_optimize_core_tables() {
    global $wpdb;
    $tables = array(
        $wpdb-&gt;options,
        $wpdb-&gt;postmeta,
        $wpdb-&gt;posts,
        $wpdb-&gt;comments,
        $wpdb-&gt;commentmeta,
    );
    $table_list = implode( ', ', $tables );
    $wpdb-&gt;query( "OPTIMIZE TABLE {$table_list}" );
}
</pre>
<p><strong>WP-CLI:</strong></p>
<pre>wp db optimize</pre>
<p>El comando <code>wp db optimize</code> optimiza todas las tablas de la base de datos de una vez.</p>
<p>Conviene saber que <code>OPTIMIZE TABLE</code> no mejora la velocidad de las consultas por sí solo. Si una consulta es lenta porque le falta un índice, optimizar la tabla no va a cambiar nada. Es una operación de mantenimiento para después de limpiar datos, no una solución milagrosa.</p>
<h2>Prevención y vigilancia</h2>
<p>Arreglar las consultas problemáticas es solo la mitad del trabajo, la otra mitad es evitar que el problema vuelva a aparecer, así que toma nota, por favor:</p>
<ul>
<li><strong>Limitar revisiones desde el principio:</strong> Configura <code>WP_POST_REVISIONS</code> en el <code>wp-config.php</code> de todas tus instalaciones. Es una de esas cosas que deberían venir por defecto.</li>
<li><strong>Evaluar plugins antes de instalarlos:</strong> Antes de instalar un plugin nuevo, activa Query Monitor y compara cuántas consultas hace tu web antes y después de activarlo. Si un plugin añade 30 consultas extra por carga de página, piénsatelo dos veces.</li>
<li><strong>Revisar la base de datos periódicamente:</strong> No hace falta hacerlo cada semana, pero una vez al mes o cada dos meses, echa un vistazo al tamaño de las tablas, al autoload de <code>wp_options</code>, a los transients acumulados y a las tareas de cron. Cinco minutos de comprobación te pueden ahorrar horas de diagnóstico cuando algo va mal.</li>
</ul>
<h3>Qué pedirle a tu hosting cuando ya has hecho todo lo que podías</h3>
<p>Si has optimizado consultas, creado índices, limpiado tablas y tu web sigue lenta, el siguiente paso es hablar con tu hosting. Pídeles que revisen los parámetros de configuración de MySQL/MariaDB, especialmente los buffers de caché de consultas, el <code>innodb_buffer_pool_size</code> y los límites de conexiones simultáneas. También pídeles acceso al slow query log si no lo tienes ya. Un buen hosting colaborará contigo en esto sin problemas.</p>
<h2>Para terminar</h2>
<p>La base de datos es una de esas partes de WordPress que mucha gente ignora hasta que da problemas. Cuando los da, suele ser porque lleva meses o años acumulando consultas innecesarias, datos huérfanos y configuraciones que nadie revisó.</p>
<p>Lo bueno es que, como has visto, no necesitas ser un experto en MySQL ni tener acceso de administrador al servidor para diagnosticar y solucionar la mayoría de estos problemas. Con un plugin como Query Monitor, un par de snippets PHP y las consultas de diagnóstico que hemos visto, puedes hacer un análisis bastante completo de tu base de datos sin depender de nadie.</p>
<p>Un par de consejos finales basados en la experiencia:</p>
<ul>
<li><strong>No optimices a ciegas:</strong> Diagnostica primero, arregla después. Crear índices, borrar datos o cambiar configuraciones sin saber qué consultas están fallando es como tomar medicinas sin saber qué enfermedad tienes. Puede funcionar por suerte, pero probablemente no.</li>
<li><strong>Haz copia de seguridad antes de cada cambio:</strong> Sé que ya lo he dicho, pero no me canso de repetirlo. Un DELETE mal ejecutado en la base de datos no tiene botón de deshacer.</li>
<li><strong>Empieza por lo que más impacto tenga.</strong> Si tu <code>autoload</code> pesa 5 MB y tienes 200.000 registros de postmeta huérfano, arreglar esas dos cosas probablemente mejore más el rendimiento que todas las demás optimizaciones juntas.</li>
<li><strong>No dejes herramientas de diagnóstico en producción:</strong> Ni <code>SAVEQUERIES</code>, ni el mu-plugin de registro, ni Query Monitor activo permanentemente. Son herramientas temporales para diagnosticar, no para dejar instaladas. Cada una consume recursos adicionales que no necesitas en el día a día.</li>
<li><strong>Si un plugin es el culpable, empieza a pensar en cambiarlo:</strong> A veces la solución no es optimizar la consulta del plugin, sino buscar una alternativa que haga lo mismo sin machacar la base de datos. No tiene sentido parchear las consecuencias si puedes eliminar la causa.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/optimizar-consultas-sql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Puedo crear mi web con IA y olvidarme de WordPress? Qué alternativas hay, para qué sirven y para qué no</title>
		<link>https://ayudawp.com/alternativas-ia-wordpress/</link>
					<comments>https://ayudawp.com/alternativas-ia-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 19 Mar 2026 07:28:00 +0000</pubDate>
				<category><![CDATA[Inteligencia Artificial y WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Astro]]></category>
		<category><![CDATA[Base44]]></category>
		<category><![CDATA[Bolt]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Coderick]]></category>
		<category><![CDATA[Codex]]></category>
		<category><![CDATA[Figma]]></category>
		<category><![CDATA[Lovable]]></category>
		<category><![CDATA[Manus]]></category>
		<category><![CDATA[NxCode]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Shopify]]></category>
		<category><![CDATA[Vercel]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[Wix]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158641</guid>

					<description><![CDATA[Si estás leyendo esto es probable que hayas visto mensajes en redes sociales del tipo "¡Se acabó WordPress!", "Acabo de migrar toda mi web a [inserte nombre de app con IA]" o el clásico "¿Tiene sentido seguir usando WordPress en 2026?". La pregunta es razonable, en serio, y merece una respuesta, ¿no te parece?, pero sobre todo, si hay que hacer una web sin usar WordPress ¿qué alternativas hay a WordPress?]]></description>
										<content:encoded><![CDATA[<p>Si estás leyendo esto es probable que hayas visto mensajes en redes sociales del tipo «<strong>¡Se acabó WordPress!</strong>«, «<strong>Acabo de migrar toda mi web a [inserte nombre de app con IA]</strong>» o el clásico «<strong>¿Tiene sentido seguir usando WordPress en 2026?</strong>«. La pregunta es razonable, en serio, y merece una respuesta, ¿no te parece?, pero sobre todo, si hay que hacer una web sin usar WordPress ¿qué alternativas hay a WordPress?</p>
<p>Lo cierto es que el panorama ha cambiado porque hay decenas de <strong>nuevas herramientas que prometen crear tu web en minutos con inteligencia artificial</strong>. Algunas cumplen lo que prometen, otras no tanto, y la mayoría sirven para cosas muy concretas que conviene entender antes de tomar decisiones.</p>
<p>Este artículo no va a ser un ladrillo de los míos, pretende ser una <strong>guía de consulta rápida</strong>. Así que si te estás planteando si alguna de estas alternativas puede sustituir a WordPress para tu proyecto <strong>aquí vas a encontrar qué hace cada una, para qué sirve de verdad, para qué no</strong>, y qué riesgos tiene, si los hubiera.</p>
<p>Y sí, sabes que vivo por, para y de WordPress, pero también que soy sincero y que siempre digo lo que pienso, soy fan pero no adicto ni sectario.</p>
<h2>Los de siempre, ahora con IA</h2>
<p>Antes de entrar en las herramientas nuevas un apunte rápido sobre las plataformas que llevan años compitiendo con WordPress y que ahora <strong>han incorporado asistentes de IA</strong> en sus editores. Ninguna sorpresa ¿verdad?, si hasta los ventiladores se anuncian «<strong>… con IA</strong>«.</p>
<p>Wix, Squarespace, Webflow y Shopify no necesitan presentación, creo, son plataformas cerradas que tienen planes de suscripción mensual, que ahora te permiten generar diseños iniciales y textos con IA.</p>
<p>Pero <strong>la IA no cambia sus limitaciones de siempre</strong>, como la dependencia total de la plataforma, personalización limitada a lo que el sistema permita, costes que suben según crece tu proyecto, y datos que no son del todo tuyos. Lo que sí hace la IA es acelerar la creación inicial, algo que para proyectos sencillos puede ser más que de sobra.</p>
<p><strong>Shopify merece mención aparte porque sí funciona bien para tiendas online sencillas y medianas, eso es verdad</strong>, pero ¿te he dicho ya que es un ecosistema cerrado con comisiones por transacción?, y para tiendas con necesidades avanzadas <strong>acaba siendo caro y limitado frente a WooCommerce</strong>.</p>
<h2>Los nuevos creadores de webs con IA</h2>
<p>Aquí empieza lo bueno, y supongo que por lo que te ha causado interés este artículo, y es que <strong>hay una nueva generación de herramientas que usan IA generativa</strong> para crear webs y aplicaciones a partir de <strong>prompts en lenguaje natural</strong>.</p>
<p>La mayoría de estas aplicaciones web nacieron entre 2023 y 2025, y funcionan bajo el concepto de «<strong><a href="https://ayudawp.com/tag/vibe-coding/" target="_blank" rel="noopener ugc">vibe coding</a></strong>«, o sea, describes lo que quieres en tus propias palabras y la IA genera el código.</p>
<p>Suenan genial en la teoría, aunque en la práctica cada una tiene su sitio y sus límites, cómo no.</p>
<h3>Bolt.new</h3>
<ul>
<li><strong>Qué es:</strong> Un entorno de desarrollo completo en el navegador creado por el equipo de StackBlitz. Escribes un prompt y genera aplicaciones web completas (frontend y backend) con vista previa en tiempo real y despliegue con un clic.</li>
<li><strong>Para qué sirve:</strong> Prototipos rápidos, MVPs, pruebas de concepto, herramientas internas sencillas. Va bien para proyectos con menos de 15 o 20 componentes.</li>
<li><strong>Para qué no:</strong> Webs de contenido con gestión editorial, tiendas online, proyectos que necesiten SEO de verdad, cualquier cosa que requiera mantenimiento a largo plazo. El código generado pierde calidad a medida que el proyecto crece en complejidad, y el sistema de tokens hace que los costes sean difíciles de predecir.</li>
<li><strong>Precio:</strong> Gratis con límites muy ajustados (1M tokens/mes). Plan Pro desde 25 $/mes con 10M tokens. El consumo de tokens es variable y puede agotarse rápido en proyectos medianos.</li>
<li><strong>Código abierto:</strong> No. Plataforma propietaria. Puedes exportar tu código pero el entorno de desarrollo depende de ellos.</li>
</ul>
<h3>Lovable</h3>
<ul>
<li><strong>Qué es:</strong> Otro generador de aplicaciones web con IA, centrado en crear interfaces con React y TypeScript. Genera código limpio que se sincroniza con GitHub, lo que te da cierta propiedad del código resultante.</li>
<li><strong>Para qué sirve:</strong> Prototipos con buen acabado visual, MVPs para presentar a inversores o clientes, aplicaciones tipo CRUD sencillas. El código exportable a GitHub es un punto a favor frente a otras opciones.</li>
<li><strong>Para qué no:</strong> Solo genera SPAs (aplicaciones de página única) lo que limita el SEO inicialmente. El backend depende de <em>Supabase</em>, así que si necesitas otra infraestructura vas a tener problemas. No sirve para webs de contenido ni tiendas online.</li>
<li><strong>Precio:</strong> Gratis con 5 créditos diarios (muy poco). Pro desde 25 $/mes con 100 créditos/mes. Los créditos se gastan rápido si estás refinando y corrigiendo.</li>
<li><strong>Código abierto:</strong> No. Plataforma propietaria, pero al menos con exportación a GitHub.</li>
</ul>
<h3>v0 de Vercel</h3>
<ul>
<li><strong>Qué es:</strong> Un generador de componentes de interfaz creado por Vercel (los mismos de Next.js). Escribes lo que quieres y genera componentes React con Tailwind CSS listos para usar.</li>
<li><strong>Para qué sirve:</strong> Generar piezas de interfaz sueltas como botones, formularios, tablas de datos, paneles de navegación. Ideal si eres desarrollador y quieres acelerar la parte visual de un proyecto o simplemente no es lo tuyo.</li>
<li><strong>Para qué no:</strong> No genera aplicaciones completas ni backend. Es un acelerador de frontend no un creador de webs. Necesitas saber programar para integrar lo que genera en un proyecto real.</li>
<li><strong>Precio:</strong> Gratis con 5 $ en créditos/mes (da para 7-15 generaciones). Premium 20 $/mes. Muy atado al ecosistema Vercel/Next.js.</li>
<li><strong>Código abierto:</strong> No. Propiedad de Vercel.</li>
</ul>
<h3>Coderick de SiteGround</h3>
<ul>
<li><strong>Qué es:</strong> La apuesta de SiteGround por el vibe coding. Describes lo que quieres y genera una web o aplicación que se publica directamente en su infraestructura de alojamiento. La gracia es que construir, publicar y alojar ocurre todo en el mismo sitio.</li>
<li><strong>Para qué sirve:</strong> Proyectos que necesitan estar online rápido sin preocuparse de la infraestructura. La integración con el hosting de SiteGround simplifica mucho la parte técnica.</li>
<li><strong>Para qué no:</strong> Es una plataforma joven y en evolución. Para proyectos que necesiten un CMS completo con gestión de contenido, roles de usuario o funcionalidades avanzadas WordPress sigue siendo más adecuado. Eso sí, es de las pocas opciones de este tipo que vienen con hosting incluido.</li>
<li><strong>Precio:</strong> Incluido en planes de SiteGround.</li>
<li><strong>Código abierto:</strong> No. Plataforma propietaria de SiteGround.</li>
</ul>
<h3>Base44</h3>
<ul>
<li><strong>Qué es:</strong> Generador de aplicaciones web completas con IA. Genera frontend, backend, base de datos, autenticación y roles de usuario a partir de un prompt. Incluye hosting y dominio propio.</li>
<li><strong>Para qué sirve:</strong> Herramientas internas, paneles de gestión, aplicaciones de productividad, MVPs funcionales. Va más allá de una web estática porque incluye lógica de backend real.</li>
<li><strong>Para qué no:</strong> No es para webs de contenido, blogs ni tiendas online. Es más una herramienta para crear aplicaciones tipo SaaS sencillas que para hacer páginas web convencionales.</li>
<li><strong>Precio:</strong> Plan gratuito disponible. Planes de pago desde unos 20 $/mes.</li>
<li><strong>Código abierto:</strong> No. Plataforma propietaria.</li>
</ul>
<h3>Astro</h3>
<ul>
<li><strong>Qué es:</strong> Este en caso aparte en esta lista porque <strong>no es un creador con IA sino un framework de desarrollo web</strong>. Lo incluyo porque la comparación «<em>Astro o WordPress</em>» aparece cada vez más en foros y redes, y merece una aclaración especial. Astro genera sitios estáticos (HTML puro) a partir de código, lo que se traduce en velocidad tremenda, seguridad de base (sin base de datos que atacar) y costes de alojamiento casi nulos.</li>
<li><strong>Para qué sirve:</strong> Blogs técnicos, webs corporativas, porfolios, documentación, landings de producto. El rendimiento es difícil de igualar con cualquier CMS dinámico.</li>
<li><strong>Para qué no:</strong> Necesitas saber programar o contratar a alguien que sepa. No tiene panel de administración como WordPress (salvo que le conectes un CMS headless tipo Contentful o Sanity, lo que añade complejidad y coste). Los usuarios no técnicos no pueden actualizar contenido fácilmente. No es para tiendas online ni aplicaciones dinámicas complejas.</li>
<li><strong>Precio:</strong> El framework es gratuito y open source. El coste es el desarrollo (necesitas un programador o saber tú programar) y el hosting, que puede ser gratuito en Cloudflare Pages o Netlify.</li>
<li><strong>Código abierto:</strong> Sí. Totalmente. Y se puede usar WordPress como CMS headless para alimentar de contenido un sitio hecho con Astro, lo cual es una combinación interesante que da lo mejor de ambos mundos.</li>
</ul>
<h3>Tabla resumen de herramientas de creación de webs con IA</h3>
<table style="width: 100%; border-collapse: collapse; margin: 1.5em 0;">
<thead>
<tr>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Herramienta</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Tipo</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Precio desde</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Exportar código</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Open source</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Mejor para</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://bolt.new/" target="_blank" rel="nofollow noopener">Bolt.new</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Vibe coding full-stack</td>
<td style="padding: 8px; border: 1px solid #ddd;">Gratis / 25 $/mes</td>
<td style="padding: 8px; border: 1px solid #ddd;">Sí (ZIP)</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">Prototipos, MVPs</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://lovable.dev/" target="_blank" rel="nofollow noopener">Lovable</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Vibe coding solo frontend</td>
<td style="padding: 8px; border: 1px solid #ddd;">Gratis / 25 $/mes</td>
<td style="padding: 8px; border: 1px solid #ddd;">Sí (GitHub)</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">MVPs con buen diseño</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://v0.app/" target="_blank" rel="nofollow noopener">v0</a> (Vercel)</td>
<td style="padding: 8px; border: 1px solid #ddd;">Generador de componentes</td>
<td style="padding: 8px; border: 1px solid #ddd;">Gratis / 20 $/mes</td>
<td style="padding: 8px; border: 1px solid #ddd;">Sí</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">Componentes UI sueltos</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://www.siteground.es/blog/presentamos-coderick-ai/" target="_blank" rel="nofollow noopener">Coderick AI</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Vibe coding + hosting</td>
<td style="padding: 8px; border: 1px solid #ddd;">Incl. en SiteGround</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">Webs rápidas con hosting integrado</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://base44.com/" target="_blank" rel="nofollow noopener">Base44</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Generador de apps</td>
<td style="padding: 8px; border: 1px solid #ddd;">Gratis / ~20 $/mes</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">No</td>
<td style="padding: 8px; border: 1px solid #ddd;">Apps internas, paneles</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://astro.build/" target="_blank" rel="nofollow noopener">Astro</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Framework estático (SSG)</td>
<td style="padding: 8px; border: 1px solid #ddd;">Gratis (open source)</td>
<td style="padding: 8px; border: 1px solid #ddd;">Sí (es tuyo)</td>
<td style="padding: 8px; border: 1px solid #ddd;">Sí</td>
<td style="padding: 8px; border: 1px solid #ddd;">Webs rápidas, blogs técnicos</td>
</tr>
</tbody>
</table>
<h2>Otras herramientas que merece la pena conocer</h2>
<p>Además de las anteriores hay otras que aparecen en las búsquedas y que conviene mencionar, aunque sea brevemente.</p>
<ul>
<li><strong>NxCode</strong> y <strong>Manus</strong> son plataformas de vibe coding similares a Bolt y Lovable, con la misma propuesta de generar apps desde prompts. NxCode destaca por su arquitectura multiagente (diferentes IAs para frontend, backend y base de datos). Manus, recientemente adquirida por Meta, se orienta más a aplicaciones web. Ambas son muy recientes y con ecosistemas todavía inmaduros.</li>
<li><strong>ChilledSites</strong> se presenta como un creador de webs con IA orientado a resultados rápidos y sencillos. Más limitado que los anteriores, pensado para landings y micrositios sin complicaciones.</li>
<li><strong>Figma AI</strong> (el generador de sitios web de Figma) y <strong>CodeDesign</strong> van en la misma línea de ser apps para pasar de diseño a código. Parten de un diseño visual y generan código exportable. Son aceleradores del proceso de diseño, no sustitutos de un CMS ni de un sistema de gestión de contenido.</li>
</ul>
<h3>Híbridos: IAs que crean webs WordPress</h3>
<p>Otro animal nuevo son las herramientas como el AI Website Builder de WordPress.com o el creador con IA de Hostinger. Estas usan IA para generar sitios, pero el resultado final es un WordPress. No son alternativas a WordPress, son WordPress con un asistente de IA para la creación inicial. Una vez generado el sitio, todo el mantenimiento, las actualizaciones y la gestión se hacen exactamente igual que con cualquier otro WordPress.</p>
<h4>Tabla resumen: otras herramientas y herramientas híbridas</h4>
<table style="width: 100%; border-collapse: collapse; margin: 1.5em 0;">
<thead>
<tr>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Herramienta</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Tipo</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Para qué sirve</th>
<th style="padding: 8px; border: 1px solid #ddd; text-align: left;">Limitación principal</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://www.nxcode.io/" target="_blank" rel="nofollow noopener">NxCode</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Vibe coding multi-agente</td>
<td style="padding: 8px; border: 1px solid #ddd;">Apps y webs desde prompts</td>
<td style="padding: 8px; border: 1px solid #ddd;">Plataforma muy joven</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://manus.im/app" target="_blank" rel="nofollow noopener">Manus</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Vibe coding</td>
<td style="padding: 8px; border: 1px solid #ddd;">Aplicaciones web</td>
<td style="padding: 8px; border: 1px solid #ddd;">Ecosistema inmaduro</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://chilledsites.com/" target="_blank" rel="nofollow noopener">ChilledSites</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Creador de webs IA</td>
<td style="padding: 8px; border: 1px solid #ddd;">Landings y micrositios</td>
<td style="padding: 8px; border: 1px solid #ddd;">Muy limitado en funcionalidad</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://www.figma.com/solutions/ai-website-generator/" target="_blank" rel="nofollow noopener">Figma AI / CodeDesign</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Diseño a código</td>
<td style="padding: 8px; border: 1px solid #ddd;">Exportar diseños a HTML</td>
<td style="padding: 8px; border: 1px solid #ddd;">Acelerador, no CMS</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://wordpress.com/es/creador-webs-ia/" target="_blank" rel="nofollow noopener">WP.com AI Builder</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Híbrido (genera WP)</td>
<td style="padding: 8px; border: 1px solid #ddd;">Crear un WordPress con IA</td>
<td style="padding: 8px; border: 1px solid #ddd;">Es WordPress, no una alternativa</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;"><a href="https://www.hostinger.com/ai" target="_blank" rel="nofollow noopener">Hostinger AI</a></td>
<td style="padding: 8px; border: 1px solid #ddd;">Híbrido (genera WP)</td>
<td style="padding: 8px; border: 1px solid #ddd;">Crear un WordPress con IA</td>
<td style="padding: 8px; border: 1px solid #ddd;">Es WordPress, no una alternativa</td>
</tr>
</tbody>
</table>
<h2>¿Y las tiendas online?</h2>
<p>Olvídate, <strong>ninguna de las herramientas de vibe coding puro sirve para montar una tienda online</strong> de verdad.</p>
<p>Puedes generar una interfaz que parezca una tienda con Bolt o Lovable, e incluso conectar Stripe para aceptar pagos, pero una tienda online real necesita gestión de inventario, variaciones de producto, cálculo de impuestos por zona, métodos de envío, pasarelas de pago con sus regulaciones, facturas, devoluciones, cupones, informes de ventas, y cumplimiento legal (RGPD, ley de consumidores, accesibilidad).</p>
<p>Nada de eso viene de serie con estas herramientas, y <strong>crearlo a base de prompts sería un acto de fe</strong>.</p>
<p>Para tiendas online las opciones reales siguen siendo WooCommerce (si quieres control total y propiedad de los datos) o Shopify (si prefieres una solución alojada y no te importa pagar comisiones y perder flexibilidad). Los creadores con IA pueden servir como mucho para generar un prototipo visual de cómo quieres que se vea tu tienda, pero <strong>de ahí a tener una tienda funcional y legal hay un abismo</strong>.</p>
<h2>Pedirle tu web directamente a ChatGPT, Claude o Codex</h2>
<p>Hay una opción más que no suele aparecer en las comparativas y que sin embargo <strong>funciona sorprendentemente bien para ciertos casos</strong>, y es <strong>pedirle directamente a un modelo de IA que te genere el código de tu web</strong>.</p>
<p>Con herramientas como <a href="https://claude.ai/code" target="_blank" rel="nofollow noopener">Claude Code</a>, <a href="https://chatgpt.com/" target="_blank" rel="nofollow noopener">ChatGPT</a> o <a href="https://openai.com/index/codex/" target="_blank" rel="nofollow noopener">Codex</a> puedes generar sitios web estáticos completos con HTML, CSS, JavaScript, todo listo para subir a cualquier hosting. No estás atado a ninguna plataforma, <strong>el código es tuyo al 100% y lo alojas donde quieras</strong>.</p>
<p>Funciona especialmente bien para webs estáticas tipo landing de producto, web corporativa sencilla o página de presentación de un servicio. De hecho, webs como <a href="https://vigia.dev" target="_blank" rel="nofollow noopener">vigia.dev</a>, <a href="https://vigilante.works" target="_blank" rel="nofollow noopener">vigilante.works</a> o <a href="https://bisnis.es" target="_blank" rel="nofollow noopener">bisnis.es</a> están hechas exactamente así, con Claude Code, y son webs profesionales, rápidas, seguras y con coste de alojamiento prácticamente cero.</p>
<p>La ventaja es el <strong>control absoluto</strong>, sin dependencias de plataformas de terceros, sin suscripciones mensuales, sin sistema de tokens ni créditos que se agotan. El código resultante es tuyo, lo puedes modificar, alojar donde quieras y migrar cuando te dé la gana.</p>
<p>La pega es que necesitas saber qué pedir y cómo pedirlo a la IA (o al menos tener criterio para evaluar lo que recibes), y cualquier cambio futuro requiere volver a hablar con la IA o editar el código a mano. No hay panel de administración ni editor visual. Para una web que se actualiza poco, esto no es un problema, para un blog con publicaciones semanales o una web con contenido dinámico, necesitas algo más.</p>
<h2>«Cositas» que no te cuentan</h2>
<p>No voy a extenderme mucho aquí porque ya he tratado el tema en profundidad en otro artículo, pero hay algunos puntos que conviene tener presentes antes de decidir.</p>
<ul>
<li><strong>Dependencia y efecto lock-in:</strong> La mayoría de estas herramientas son plataformas cerradas, tu proyecto vive dentro de su ecosistema, y sacarlo puede ser complicado o directamente imposible. Con WordPress, si un día tu hosting no te gusta lo migras a otro en una tarde. Con muchas de estas herramientas, si la empresa cierra o sube los precios, tienes un problema serio.</li>
<li><strong>Startups sin recorrido:</strong> Muchas de estas plataformas no llevan ni dos años en el mercado. Bolt pasó de 0 a 4 millones de dólares anuales en 30 días, lo cual suena impresionante, pero también significa que su modelo de negocio no ha pasado aún la prueba del tiempo. WordPress lleva más de 20 años y alimenta más del 45% de toda la web.</li>
<li><strong>Seguridad:</strong> Según datos recientes alrededor del 45% del código generado por IA contiene vulnerabilidades de seguridad. Esto no es un problema exclusivo de una herramienta concreta, es una limitación actual de la generación de código con IA en general. Un WordPress bien mantenido, con actualizaciones regulares y buenas prácticas de seguridad, sigue siendo una opción más probada.</li>
<li><strong>SEO/GEO de verdad:</strong> Generar una página bonita es fácil, posicionarla es otra historia. La mayoría de estas herramientas generan SPAs o sitios con montón de JavaScript, algo que no se lleva bien con el SEO. WordPress, con sus 20 años de ecosistema SEO (plugins, esquemas, sitemaps, control total del HTML), sigue siendo difícil de superar para quien necesite tráfico orgánico (si es que eso aún existe).</li>
<li><strong>El mantenimiento no desaparece:</strong> En realidad solo cambia de forma. En vez de actualizar plugins y temas, estarás quemando créditos para corregir errores generados por la IA, peleándote con código que no entiendes del todo, o dependiendo de una plataforma que puede cambiar sus precios o condiciones cuando quiera.</li>
</ul>
<h2>¿Cuándo tiene sentido usar una alternativa a WordPress?</h2>
<p>Después de revisar todo esto, la respuesta corta es … depende del proyecto.</p>
<p><strong>Estas herramientas pueden funcionar bien si:</strong></p>
<ul>
<li>Necesitas una landing page o un micrositio que se actualiza poco o nada.</li>
<li>Estás creando un prototipo o MVP para validar una idea antes de invertir en desarrollo.</li>
<li>Quieres una web estática tipo portfolio o página corporativa sencilla (y sabes algo de código o tienes a alguien que sepa).</li>
<li>Necesitas una herramienta interna o un panel de gestión rápido para tu equipo.</li>
<li>Tu proyecto es temporal: un evento, una campaña, una promoción puntual.</li>
</ul>
<p><strong>WordPress sigue siendo la mejor opción si:</strong></p>
<ul>
<li>Necesitas gestionar contenido regularmente (blog, revista, portal de noticias).</li>
<li>Quieres una tienda online con todas las de la ley.</li>
<li>Necesitas que personas no técnicas puedan editar y publicar contenido.</li>
<li>Tu proyecto va a crecer con el tiempo y necesitas flexibilidad para añadir funcionalidades.</li>
<li>Te importa la propiedad de tus datos y la independencia del proveedor.</li>
<li>Necesitas multiidioma, roles de usuario, integraciones con terceros, formularios avanzados o cualquier funcionalidad que vaya más allá de mostrar información estática.</li>
<li>El SEO es una parte central de tu estrategia.</li>
<li>Quieres TODOS esos plugins que nos hacen la vida más sencilla.</li>
</ul>
<h2>El camino de vuelta: WPConvert.ai</h2>
<p>Para cerrar, <strong>una curiosidad que dice mucho sobre cómo están las cosas</strong>. Existe una herramienta llamada <a href="https://wpconvert.ai/" target="_blank" rel="nofollow noopener">WPConvert.ai</a> que hace justo lo contrario de todo lo que hemos visto, pues <strong>convierte cualquier web generada con IA en tema WordPress</strong> con un clic.</p>
<p>Es decir, hay un mercado suficiente de <strong>gente que generó su web con IA, se dio cuenta de que necesitaba las funcionalidades de gestión de WordPress, y ahora quiere volver</strong>. Que exista una herramienta dedicada a resolver ese problema específico te da una pista bastante clara de hacia <strong>dónde acaban muchos de estos experimentos</strong>.</p>
<p>Las herramientas de creación con IA son útiles para lo que son, crear rápido cosas concretas. Cuando un proyecto necesita crecer, gestionarse, posicionarse, venderse y mantenerse a largo plazo, la conversación suele terminar en el mismo sitio de siempre.</p>
<p>¡Ah! ¿qué dónde?</p>
<p>Pues <strong>en WordPress, ¿dónde va a ser?</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/alternativas-ia-wordpress/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Tienes un problemón, y deberías programar el vaciado automático del programador de acciones de WordPress</title>
		<link>https://ayudawp.com/programar-limpieza-action-scheduler/</link>
					<comments>https://ayudawp.com/programar-limpieza-action-scheduler/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 07:28:00 +0000</pubDate>
				<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[WPO - Optimizar WordPress]]></category>
		<category><![CDATA[Acciones programadas]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158489</guid>

					<description><![CDATA[Hoy vamos a aprender a programar la limpieza del puñetero Action Scheduler para que se haga sola, sin que tengas que acordarte ni tocar nada.]]></description>
										<content:encoded><![CDATA[<p>Si ya has pasado por el trago de <strong>limpiar miles o millones de registros del programador de acciones</strong>, sabes lo que fastidia.</p>
<p>En <a href="https://ayudawp.com/borrar-acciones-programadas/">este otro tutorial</a> vimos cómo borrar acciones programadas de golpe, ya sea con consultas SQL, desde phpMyAdmin o con un plugin. Pero hay un problema que no resolvía esa guía, y es ni más ni menos ¿<strong>qué pasa cuando al cabo de unas semanas o meses vuelves a tener la base de datos llena de basura?</strong></p>
<p>Pues eso, que vuelves a estar igual, y si tienes una tienda online con movimiento o una web con varios plugins que usan el programador de acciones, <strong>la acumulación de registros inútiles es inevitable</strong>.</p>
<p>Hoy <strong>vamos a aprender a programar esa limpieza del puñetero Action Scheduler para que se haga sola</strong>, sin que tengas que acordarte ni tocar nada.</p>
<h2>Por qué la limpieza manual no es suficiente</h2>
<p>Limpiar una vez está bien, lo haces, liberas espacio, tu base de datos se alivia y todo va más rápido.</p>
<p>El problema es que las tablas <code>wp_actionscheduler_actions</code> y <code>wp_actionscheduler_logs</code> se vuelven a llenar porque es lo que hacen, almacenar <strong>registros de cada acción que ejecutan WooCommerce, plugins de membresía, de formularios, de automatizaciones y un enorme etcétera</strong>.</p>
<p>Si tu web tiene actividad constante <strong>en cuestión de semanas puedes volver a acumular cientos de miles de registros de acciones</strong> completadas, fallidas, canceladas y registros de log <strong>que no sirven absolutamente para nada más que para ocupar espacio</strong>.</p>
<p>La única solución real es <strong>que la limpieza se haga de forma automática y periódica.</strong></p>
<h2>Qué registros se pueden limpiar automáticamente</h2>
<p>Antes de configurar nada conviene tener claro <strong>qué se limpia y qué no</strong>. Esto ya lo expliqué en detalle en el <a href="https://ayudawp.com/borrar-acciones-programadas/">tutorial de borrado de acciones programadas</a> pero te hago un resumen rápido:</p>
<p><strong>Lo que se puede (y se debe) limpiar:</strong></p>
<ul>
<li><strong>Acciones completadas</strong>: ya se ejecutaron, no sirven para nada.</li>
<li><strong>Acciones fallidas</strong>: dieron error y ahí se quedaron.</li>
<li><strong>Acciones canceladas</strong>: alguien las canceló manualmente.</li>
<li><strong>Acciones vencidas</strong>: no se ejecutaron a tiempo, se les pasó el arroz.</li>
<li><strong>Acciones pendientes antiguas</strong>: llevan semanas esperando y nadie las va a ejecutar.</li>
<li><strong>Registros del log</strong>: el historial detallado de cada ejecución, que puede crecer de forma desproporcionada.</li>
</ul>
<p><strong>Lo que NO se tocan:</strong></p>
<ul>
<li><strong>Acciones pendientes recientes y las que están en ejecución:</strong> se quedan siempre intactas, porque esas las necesita tu web para funcionar correctamente.</li>
</ul>
<h2>Cómo configurar la limpieza automática paso a paso</h2>
<p>Para esto vamos a usar <a href="https://es.wordpress.org/plugins/easy-actions-scheduler-cleaner-ayudawp/" target="_blank" rel="noopener ugc">Easy Actions Scheduler Cleaner</a>, que desde su versión 1.1.0 incorpora la posibilidad de programar limpiezas automáticas con un sistema bastante completo.</p>
<p>Si ya tienes el plugin instalado, ve a «<strong>Herramientas → Easy Actions Scheduler Cleaner</strong>». Si no lo tienes, instálalo desde el el instalador de plugins de tu WordPress, es totalmente gratuito, actívalo y te llevará directamente a su página de ajustes.</p>
<p>Verás que ahora hay dos pestañas: <strong>Limpieza manual</strong> (la limpieza de siempre) y L<strong>impieza programada</strong>, que es la que nos interesa hoy.</p>
<h3>Activar la limpieza programada</h3>
<p>Al entrar en la <strong>pestaña de limpieza programada</strong> lo primero que verás es una casilla para activar el sistema de programación de limpieza de registros. Mientras no lo actives no se programa nada.</p>
<p><a href="https://ayudawp.com/?attachment_id=158495" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158495 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/programar-limpieza-action-scheduler-1200x976.jpg" alt="programar limpieza action scheduler" width="1200" height="976" srcset="https://ayudawp.com/wp-content/uploads/2026/03/programar-limpieza-action-scheduler-1200x976.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/programar-limpieza-action-scheduler-768x624.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/programar-limpieza-action-scheduler-1536x1249.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/programar-limpieza-action-scheduler.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h3>Elegir la frecuencia</h3>
<p>Justo debajo de la casilla hay un selector de frecuencia con cuatro opciones:</p>
<ul>
<li><strong>Diaria</strong>: para sitios con mucha actividad (tiendas grandes, webs con miles de transacciones diarias).</li>
<li><strong>Semanal</strong>: la opción recomendada para la mayoría de sitios.</li>
<li><strong>Quincenal</strong>: para sitios con actividad moderada.</li>
<li><strong>Mensual</strong>: para blogs o webs con pocos plugins que usen el programador de acciones.</li>
</ul>
<p>La primera ejecución se programa después de que pase el intervalo completo que elijas. Es decir, si seleccionas semanal la primera limpieza se hará una semana después de guardar los ajustes, no inmediatamente.</p>
<h3>Configurar qué tipos de registros limpiar</h3>
<p>Esto es casi lo mejor, porque en la tabla de tipos de acción puedes activar o desactivar la limpieza de cada tipo de registro de forma independiente. Para cada uno hay tres columnas que son importantes:</p>
<ul>
<li><strong>Limpiar</strong> (casilla): si quieres que se limpie ese tipo o no.</li>
<li><strong>Registros mínimos</strong> (umbral): el número mínimo de registros que tiene que haber para que se ejecute la limpieza de ese tipo.</li>
<li><strong>Recuento actual</strong>: cuántos registros de ese tipo tienes ahora mismo.</li>
</ul>
<p>Para las <strong>acciones pendientes antiguas</strong> hay un campo adicional donde puedes indicar a partir de cuántos días se consideran antiguas (por defecto 30, configurable de 7 a 365 días).</p>
<p><a href="https://ayudawp.com/?attachment_id=158496" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158496 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/tipos-de-acciones-programadas-a-limpiar-1200x531.jpg" alt="tipos de acciones programadas a limpiar" width="1200" height="531" srcset="https://ayudawp.com/wp-content/uploads/2026/03/tipos-de-acciones-programadas-a-limpiar-1200x531.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/tipos-de-acciones-programadas-a-limpiar-768x340.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/tipos-de-acciones-programadas-a-limpiar-1536x679.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/tipos-de-acciones-programadas-a-limpiar.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Cuando el recuento actual supere el umbral que has configurado verás una marca verde (✓) junto al número, indicando que ese tipo de acción se limpiará en la próxima ejecución.</p>
<p>Dale al botón de guardar ajustes y ya está, el plugin se encarga de registrar el evento en el cron de WordPress y se ejecutará automáticamente según la frecuencia que hayas elegido.</p>
<p>Si todo ha ido bien debajo del interruptor verás un mensaje indicando cuándo será la próxima ejecución programada.</p>
<h2>Sistema de umbrales para limpiar solo cuando hace falta</h2>
<p>Esta es la parte que más me gusta del sistema de limpieza programada, porque <strong>evita ejecuciones innecesarias</strong>.</p>
<p>Pongamos un ejemplo, que tienes configurado el umbral de acciones completadas en 100 y solo hay 35 registros, la limpieza programada se ejecutará, comprobará ese número y dirá «aquí no hay nada que hacer» y pasará al siguiente tipo.</p>
<p>Solo cuando los registros superen el umbral que tú has definido se procede al borrado.</p>
<p>Esto tiene tres ventajas obvias:</p>
<ul>
<li><strong>No desperdicia recursos del servidor</strong>: Si no hay nada que limpiar, no se hacen operaciones de borrado innecesarias en la base de datos.</li>
<li><strong>Puedes dejarlo activo sin preocuparte</strong>: No va a borrar cuatro registros cada vez que se ejecute. Espera a que realmente se acumule una cantidad que merezca la pena limpiar.</li>
<li><strong>Sabes lo que va a pasar</strong>: Desde la misma pantalla de configuración puedes ver en todo momento cuántos registros hay de cada tipo y si superan o no el umbral. Sin sorpresas.</li>
</ul>
<h2>Cómo saber qué pasó en la última limpieza</h2>
<p>Cada vez que se ejecuta la limpieza programada el plugin guarda un registro del resultado que se muestra en la parte superior de la pestaña de programación.</p>
<p>Puedes ver tres estados:</p>
<ul>
<li><strong>Verde</strong>: se ejecutó correctamente y te muestra cuántos registros se borraron de cada tipo.</li>
<li><strong>Azul</strong>: se ejecutó pero no había nada que limpiar (ningún tipo superó su umbral).</li>
<li><strong>Rojo</strong>: hubo un error (por ejemplo, que las tablas del programador de acciones no existan).</li>
</ul>
<p>Así puedes verificar que todo funciona sin tener que andar adivinando.</p>
<h2>Qué configuración te recomiendo según tu caso</h2>
<p>No todas las webs necesitan la misma configuración. Aquí van algunas orientaciones:</p>
<ul>
<li><strong>Tienda WooCommerce con bastante movimiento</strong>: frecuencia semanal, umbrales bajos (50-100 para acciones, 200-500 para logs), días de pendientes antiguas en 15-30. Son las que más basura generan.</li>
<li><strong>Web con membresías o suscripciones</strong>: frecuencia semanal o quincenal, umbrales medios (100-200), días de pendientes antiguas en 30.</li>
<li><strong>Blog con WooCommerce de baja actividad</strong>: frecuencia mensual, umbrales altos (200-500), días de pendientes antiguas en 60. No genera tanta basura pero conviene tenerlo controlado.</li>
<li><strong>Web sin WooCommerce pero con plugins que usan Action Scheduler</strong>: frecuencia mensual, umbrales altos (200-500). Plugins como formularios, automatizaciones o incluso algunos de SEO pueden usar el programador de acciones.</li>
</ul>
<p>Lo importante es que no te compliques. Los valores por defecto del plugin ya están pensados para un uso general razonable. Si no tienes claro qué poner déjalos como están y ajusta solo la frecuencia.</p>
<h2>Una nota sobre el cron de WordPress</h2>
<p>La limpieza programada usa <a href="https://ayudawp.com/wp-cron/" target="_blank" rel="noopener ugc">WP-Cron, que es el sistema de tareas programadas de WordPress</a>.</p>
<p>Esto funciona bien en la mayoría de sitios, pero tiene una particularidad, y es que WP-Cron se ejecuta cuando alguien visita la web, de modo que si tu sitio tiene muy poco tráfico, es posible que la limpieza se retrase un poco respecto a la hora programada.</p>
<p>Si <a href="https://ayudawp.com/tag/wp-cron/" target="_blank" rel="noopener ugc">tienes configurado un cron manual del sistema</a> esto no será un problema porque el cron se dispara de forma puntual independientemente de las visitas.</p>
<h2>Combina limpieza manual y programada</h2>
<p>Mi recomendación es la misma que sigo con los sitios de nuestros clientes del <a href="https://mantenimiento.ayudawp.com/" target="_blank" rel="noopener ugc">servicio de mantenimiento web</a>:</p>
<ol>
<li><b>H</b><strong>az una limpieza manual</strong> para dejar la base de datos limpia. Esto es especialmente importante si llevas tiempo sin limpiar y tienes miles o millones de registros acumulados (<a href="https://ayudawp.com/borrar-acciones-programadas/">aquí tienes el tutorial completo para hacerlo</a>).</li>
<li><b>A</b><strong>ctiva la limpieza programada</strong> para que se mantenga limpia automáticamente. Así no vuelves a tener el problema de siempre.</li>
</ol>
<p>La combinación de ambas es lo que realmente funciona.</p>
<p>Y ya sabes, el plugin es gratuito y está en WordPress.org: <a href="https://es.wordpress.org/plugins/easy-actions-scheduler-cleaner-ayudawp/" target="_blank" rel="nofollow noopener">Easy Actions Scheduler Cleaner</a> o en tu instalador de plugins. Si te resulta útil, que seguro que sí, te agradezco que le dejes una valoración de 5 estrellas, que ayuda mucho a que lo encuentre más gente.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/programar-limpieza-action-scheduler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Tu tráfico cae, las IAs te ignoran y encima te quieren cobrar por ello? El sospechoso mundo de la Visibilidad IA</title>
		<link>https://ayudawp.com/visibilidad-ia/</link>
					<comments>https://ayudawp.com/visibilidad-ia/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 07:28:48 +0000</pubDate>
				<category><![CDATA[Inteligencia Artificial y WordPress]]></category>
		<category><![CDATA[SEO / AIO / GEO / LLMO para WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[AI Share & Summarize]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Content Signals]]></category>
		<category><![CDATA[JSON-LD]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Sitemap]]></category>
		<category><![CDATA[VigIA]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158579</guid>

					<description><![CDATA[Las IAs ya están rastreando tu web. ChatGPT, Claude, Perplexity, Gemini, Grok. Todas envían sus bots a recopilar información de millones de sitios cada día, y la cuestión no es si pasan por tu web (spoiler: lo hacen), sino si cuando llegan entienden lo que ofreces, encuentran tu mejor contenido y te citan como fuente.]]></description>
										<content:encoded><![CDATA[<p><strong>Las IAs ya están rastreando tu web</strong>. ChatGPT, Claude, Perplexity, Gemini, Grok. Todas envían sus bots a recopilar información de millones de sitios cada día, y la cuestión no es si pasan por tu web (spoiler: lo hacen), sino si cuando llegan <strong>entienden lo que ofreces, encuentran tu mejor contenido y te citan como fuente</strong>.</p>
<p>Igual que hace 15 años aprendimos a optimizar nuestras webs para Google, ahora toca hacer lo mismo para las IAs. Pero hay una pregunta que mucha gente se hace y pocos saben responder con datos concretos: <strong>¿cómo de preparada está mi web para ser visible ante las IAs?</strong></p>
<p>A esto se le llama «<strong>visibilidad IA</strong>«, «<strong>AI readiness</strong>«, «<strong>AI visibility</strong>» o, si quieres ponerte fino, <strong><a href="https://ayudawp.com/tag/geo/" target="_blank" rel="noopener ugc">GEO</a></strong> (Generative Engine Optimization). Hay muchos nombres para lo que en el fondo es <strong>una evolución natural del SEO de toda la vida, con algunos matices nuevos que merece la pena entender</strong>. Y alrededor de este tema ha surgido toda una industria de herramientas, auditorías y consultorías que conviene conocer antes de abrir la cartera.</p>
<p>En este artículo te explico qué señales componen la visibilidad IA, qué herramientas existen para medirla (la mayoría de pago), cómo interpretar los resultados y cómo puedes implementar y comprobar todo esto en WordPress sin gastar un euro.</p>
<h2>Visibilidad IA: qué es (y qué no es)</h2>
<p>Vamos a ser claritos desde el principio, <strong>el GEO no es una disciplina nueva aparte del SEO</strong>, Es el mismo SEO de siempre con algunos añadidos específicos para que los modelos de lenguaje entiendan mejor tu contenido y lo puedan usar como fuente. Si quieres profundizar en esto te recomiendo <a href="https://ayudawp.com/seo-ia/">la guía de SEO para IA</a> donde lo desarrollo en detalle.</p>
<p><strong>Los fundamentos siguen siendo los mismos</strong>: contenido de calidad, estructura clara, datos estructurados, rendimiento, autoridad. Lo que cambia es que ahora, además de los algoritmos clásicos de Google, hay otros «lectores» de tu web (los rastreadores de IA) que <strong>procesan la información de manera diferente y que valoran algunas señales adicionales</strong>.</p>
<p>¿Han cambiado cosas? Sí, claro. Las metas (título y descripción) tienen menos importancia porque los chatbots y los AI Overviews no muestran snippets con título y descripción, muestran respuestas completas elaboradas a partir de varios contenidos.</p>
<p><strong>Los nuevos resultados de búsqueda ya no ofrecen fragmentos, ofrecen respuestas</strong>. Pero esas respuestas las extraen de contenidos reales, de gente que sabe de lo que ha preguntado el usuario y que ha tenido a bien compartirlo.</p>
<p>O sea que la base sigue siendo la misma, crear buen contenido, bien estructurado, sobre temas que dominas.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158210 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/02/comparativa-fragmento-vs-ai-overview-1200x675.jpg" alt="comparativa fragmento vs ai overview" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/02/comparativa-fragmento-vs-ai-overview-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/02/comparativa-fragmento-vs-ai-overview-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/02/comparativa-fragmento-vs-ai-overview-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/02/comparativa-fragmento-vs-ai-overview.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Pero hay una diferencia fundamental que conviene entender, y es que Google lleva más de 20 años rastreando la web, tiene tu mapa del sitio, tu <code>robots.txt</code>, y su sistema de indexación masivo, así que cuando publicas algo, tarde o temprano <code>Googlebot</code> pasa, lo indexa y lo clasifica. <a href="https://ayudawp.com/ai-overviews-google/">Las IAs funcionan de otra manera</a>.</p>
<p>Cuando alguien le hace una pregunta a ChatGPT o a Perplexity el sistema busca información en tiempo real, tirando de lo que puede encontrar y procesar rápidamente. Si tu contenido más valioso está enterrado entre menús de navegación, barras laterales, scripts de JavaScript y banners de cookies, es muy probable que se lo salte o lo malinterprete.</p>
<p>El resultado es que <strong>tu web puede ser perfectamente visible en Google y completamente invisible para las IAs</strong>. O peor aún, que sea visible pero la interpreten mal.</p>
<h2>Las señales que determinan tu visibilidad IA</h2>
<p>La buena noticia es que hay un conjunto de mecanismos, algunos ya consolidados y otros emergentes, que funcionan como señales para que las IAs encuentren, entiendan y utilicen correctamente tu contenido. Son las señales que las herramientas de medición analizan, y las que tú puedes activar para mejorar tu puntuación. Vamos a verlas una a una.</p>
<h3>robots.txt: la primera línea de comunicación</h3>
<p>El archivo <code>robots.txt</code> es el veterano del grupo, lleva décadas diciéndole a los bots qué pueden y qué no pueden rastrear. Pero con la llegada de las IAs ha cobrado una nueva dimensión.</p>
<p>Ahora no solo tienes que gestionar <code>Googlebot</code> o <code>Bingbot</code>, sino también <code>GPTBot</code>, <code>ClaudeBot</code>, <code>PerplexityBot</code>, <code>Google-Extended</code>, <code>Bytespider</code> y <a href="https://es.wordpress.org/plugins/vigia/">más de 50 bots de IA</a> que pueden estar pasando por tu web ahora mismo.</p>
<p>La diferencia entre permitir o bloquear cada uno es algo que conviene pensar con calma, porque no todos hacen lo mismo. Hay IAs que rastrean para entrenar sus modelos (como <code>GPTBot</code>), otras que rastrean para responder búsquedas en directo (como <code>PerplexityBot</code> o <code>OAI-SearchBot</code>) y otras que hacen ambas cosas. Unas te interesan porque te citan como fuente y te generan tráfico, otras simplemente se llevan tu contenido para entrenar un modelo del que nunca verás beneficio alguno.</p>
<p>Un <code>robots.txt</code> bien configurado para IAs te permite establecer reglas diferenciadas: permitir a los bots de búsqueda IA, bloquear a los de entrenamiento puro, y monitorizar quién respeta tus reglas y quién las ignora.</p>
<h3>Sitemap XML: lo que los bots de IA buscan primero</h3>
<p>Después de haber monitorizado decenas de miles de visitas de rastreadores de IA con VigIA, te puedo decir que <strong>el mapa del sitio es prácticamente lo primero que buscan en tu web</strong>. Tiran de sitemap a la brava y a partir de ahí van recorriendo contenidos, los devoran.</p>
<p>Así que tener un sitemap limpio, actualizado y sin páginas que no deberían estar ahí (carrito, pago, mi cuenta, etiquetas vacías…) no es un detalle, es una prioridad. Para eso hice <a href="https://es.wordpress.org/plugins/native-sitemap-customizer/">Native Sitemap Customizer</a>, precisamente para tener control total sobre qué páginas incluyes en el mapa del sitio nativo de WordPress sin depender de un plugin de SEO para ello.</p>
<p>¿Prefieres usar un plugin de SEO para eso? pues nada, hay montones, pero todos tienen el mismo problema, que no aprovechan recursos nativos que ya tienes, el mapa del sitio que genera WordPress, que además es el más ligero y limpio.</p>
<h3>llms.txt: la teoría frente a la realidad</h3>
<p>El archivo <a href="https://ayudawp.com/llms-txt-llms-full-txt/">llms.txt</a> es un estándar propuesto en 2024 que está ganando adopción rápidamente. A día de hoy miles de webs relevantes ya lo han adoptado, incluyendo Anthropic, Cloudflare, Stripe, Perplexity, Hugging Face, Zapier, incluso <a href="https://ayudawp.com/llms.txt">Ayuda WordPress</a>.</p>
<p>Es un archivo en formato Markdown que se coloca en la raíz de tu dominio (<code>tusitio.com/llms.txt</code>) y que ofrece a las IAs un mapa seleccionado de tus contenidos más importantes.</p>
<p>Mientras que el <code>sitemap.xml</code> tiene como función incluir todas las URLs, en el <code>llms.txt</code> seleccionas solo las que realmente quieres destacar, para decirle a la IA algo como «si vas a consultar mi web, empieza por aquí».</p>
<p>Existe también el <code>llms-full.txt</code>, que incluye el contenido completo de las páginas seleccionadas para que la IA ni siquiera necesite rastrearlas individualmente.</p>
<p>Sobre el papel es una buena idea, en la práctica, y esto te lo digo por experiencia propia monitorizando bots con VigIA, <strong>los bots de IA no buscan ni leen los archivos llms.txt</strong>.</p>
<p>Los rastreadores de las IAs van directos al sitemap, localizan los contenidos y se los comen uno tras otro. Google lo incluyó en su protocolo <strong>Agents to Agents (A2A)</strong> y hay datos de que los crawlers de Microsoft, OpenAI y otros rastrean e indexan estos archivos de forma bastante consistente, pero el impacto directo ya te digo que no está demostrado.</p>
<p>¿Significa que no debas tenerlo? Créalo, no cuesta nada (con VigIA lo generas en dos clics), pero no esperes que te cambie la visibilidad o un empujón de tráfico, hoy en día nada te lo da, esto menos, pero al menos el coste de implementarlo es mínimo y ya lo tienes para cuando la adopción sea generalizada.</p>
<h3>Markdown para agentes (esto sí)</h3>
<p>Este es uno de los mecanismos más interesantes y probablemente el que más impacto real tiene de todas las señales nuevas, y esto te lo digo por experiencia propia, porque <strong>cuando un bot de IA tiene disponible una versión Markdown de tu contenido, la prefiere al HTML</strong>. La diferencia ha sido inmediata en mis pruebas, fue activarlos y ese mismo día ya los estaban leyendo.</p>
<p><a href="https://ayudawp.com/markdown-agentes-ia/">Markdown para agentes</a> es un estándar impulsado por Cloudflare que permite servir cualquier página de tu web en formato Markdown optimizado para agentes de IA. Cada entrada o página puede tener una versión alternativa accesible de dos formas: añadiendo <code>.md</code> a la URL (por ejemplo, <code>tusitio.com/mi-articulo.md</code>) o mediante negociación de contenido (cuando un agente envía la cabecera <code>Accept: text/markdown</code>).</p>
<p>¿Qué consigues con esto?</p>
<p>Cuando un agente de IA accede a tu web normal se encuentra con el HTML completo, los menús, áreas de widgets, scripts, CSS, anuncios, formularios, un montón de ruido alrededor del contenido real.</p>
<p><strong>Con Markdown para agentes la IA recibe directamente el contenido limpio, estructurado, con metadatos</strong> ricos en formato YAML (título, autor, fecha, categorías, etiquetas) y sin una sola línea de código innecesario.</p>
<p>Además, cada respuesta incluye la cabecera <code>X-Markdown-Tokens</code> que indica el número de tokens del contenido, algo muy útil para que los agentes gestionen su ventana de contexto.</p>
<p>Es como la diferencia entre darle a alguien un libro con la portada, el índice y los capítulos limpios, o darle un montón de folios sueltos mezclados con publicidad.</p>
<p>Por si te quedaba alguna duda, <strong>en las webs de WordPress.org ya se ha adoptado globalmente</strong> y se están sirviendo sus contenidos también en Markdown.</p>
<h3>JSON-LD con señales AI Discovery</h3>
<p>Esto no es nada nuevo, <strong>los datos estructurados en formato JSON-LD llevan años siendo fundamentales para el SEO</strong> tradicional.</p>
<p>Gracias a ellos consigues los <strong>rich snippets</strong> en Google, esas estrellas de valoración, precios de productos, preguntas frecuentes, datos de la empresa, etc.</p>
<p>Lo que sí es nuevo es que <strong>JSON-LD tiene ahora otra función igual de importante: ayudar a las IAs a entender quién eres y dónde está tu contenido preparado para ellas</strong>.</p>
<p>Mediante el marcado de schema.org puedes <strong>generar datos estructurados que incluyan la identidad de tu sitio</strong> (<code>WebSite</code> + <code>Organization</code> o <code>Person</code>, con perfiles sociales mediante <code>sameAs</code>) y señales de AI Discovery como acciones de tipo <a href="https://schema.org/ReadAction" target="_blank" rel="nofollow noopener">ReadAction</a> que apuntan directamente a tus archivos <code>llms.txt</code>, <code>llms-full.txt</code> y a tus endpoints de Markdown para agentes.</p>
<p>Esto es como decirle a la IA en su propio idioma «<strong>oye, tengo contenido optimizado para ti, y está aquí, aquí y aquí</strong>».</p>
<p>Microsoft ha confirmado que <strong>Bing usa schema.org para sus modelos de IA</strong> (Copilot incluido), Google muestra comportamientos en AI Overviews que claramente demuestran que lo usa, y OpenAI procesa HTML estático, por lo que el JSON-LD incrustado en la página es fácilmente procesable por <code>GPTBot</code>.</p>
<p>Al combinar la identidad del sitio con los punteros a tus recursos <code>AI-ready</code>, creas <strong>un ecosistema de datos estructurados que conecta todo el sistema de señales IA</strong>.</p>
<p><strong>Los plugins de SEO no generan estas señales de AI Discovery</strong> (de momento), pero es algo que ya se puede implementar. Si no tienes claro qué es JSON-LD o cómo funciona, tienes <a href="https://ayudawp.com/json-ld/">aquí una guía de JSON-LD donde te lo explico ampliamente pero de manera sencilla</a>.</p>
<p>También entran en juego en esta categoría los <strong>Open Graph y Twitter Cards</strong> (metadatos para compartir en redes que las IAs también procesan), la <code>meta description</code> (con menos peso que antes, como comentaba, pero sigue siendo un resumen útil del contenido), la URL canónica y la declaración de idioma de la página.</p>
<h3>Compartir contenido en IAs</h3>
<p><strong>Las señales anteriores son pasivas</strong>, porque tú las configuras y esperas a que las IAs vengan a por ellas. Pero hay una que es activa y que depende de tus propios visitantes.</p>
<p>¿Qué pasaría si tus lectores pudieran compartir tu contenido directamente con ChatGPT, Claude, Gemini, Grok o Perplexity con un solo clic?</p>
<p>No me refiero copiar y pegar el texto (perdiendo toda atribución), sino <strong>abrir la IA con un prompt optimizado que incluye tu URL como fuente</strong>.</p>
<p>Esto es exactamente lo que hace el plugin <a href="https://es.wordpress.org/plugins/ai-share-summarize/" target="_blank" rel="noopener">de compartir y resumir en IA</a>, que ya deberías conocer, añadir <strong>botones de compartir y resumir</strong> no solo para las <strong>redes sociales</strong> clásicas (Twitter/X, Facebook, LinkedIn, WhatsApp, Telegram, email) sino <strong>también para las principales IAs</strong>.</p>
<p><strong>Cada vez que un visitante comparte tu artículo con una IA está alimentando a ese modelo</strong> para que conozca tu web y tu contenido como fuente autorizada. El prompt que se envía automáticamente incluye la URL, lo que genera <strong>enlaces entrantes naturales desde las plataformas de IA más importantes</strong> del mundo.</p>
<p>Tus lectores iban a compartir el contenido con las IAs de todas maneras, pero así al menos <strong>estás entrenando a la IA</strong> a que conozca, cite y <strong>enlace a tus contenidos como fuente</strong> de información. De paso, te permite <strong>monitorizar cuántos clics genera cada botón</strong> para saber qué plataformas usan tus lectores.</p>
<h3>Señales de contenido para IA</h3>
<p>Hay una señal más que <strong>completa el kit</strong>, la posibilidad de especificar en tu <code>robots.txt</code> no solo si una IA puede rastrear o no, sino <strong>para qué puede usar tu contenido</strong>. ¿Solo para búsqueda? ¿Solo para entrenamiento? ¿Para ambos?</p>
<p>El plugin <a href="https://es.wordpress.org/plugins/ai-content-signals/">AI Content Signals</a> implementa una <strong>propuesta respaldada por Cloudflare</strong> que permite añadir estas directivas. Es otra capa de comunicación con las IAs que complementa al resto de señales.</p>
<h3>Estructura del contenido y legibilidad</h3>
<p>Esto es SEO clásico puro, pero con un matiz, que <strong>las IAs son especialmente sensibles a la estructura</strong> porque procesan el contenido de forma secuencial y jerárquica.</p>
<p>Un artículo con <strong>buena jerarquía de encabezados, HTML semántico y contenido bien organizado</strong> es mucho más fácil de procesar para una IA que un bloque de texto sin estructura.</p>
<p>Revisan la presencia del H1 y que solo haya uno, la jerarquía de encabezados (que se respete el orden H1 → H2 → H3 sin saltos), el uso de HTML5 semántico (etiquetas como <code>&lt;article&gt;</code>, <code>&lt;section&gt;</code>, <code>&lt;main&gt;</code>), el texto alternativo en imágenes (ahora más importante que nunca porque las IAs lo usan para entender el contenido visual), el ratio contenido/HTML y la independencia de JavaScript.</p>
<p>Este último punto merece una explicación adicional, y es que <strong>los rastreadores de IA normalmente no ejecutan JavaScript</strong>, leen el HTML que tu servidor envía directamente.</p>
<p>Si tu contenido se carga dinámicamente con JavaScript después de que la página cargue es posible que las IAs no lo vean. <strong>Si desactivas JavaScript en tu navegador y tu contenido desaparece tienes un problema</strong>.</p>
<h3>TTFB</h3>
<p>La velocidad es importante para todos los visitantes, humanos e IAs. Los rastreadores de IA tienen tiempos de espera limitados y <strong>si tu servidor tarda mucho en responder pueden abandonar la solicitud</strong> antes de procesar tu contenido.</p>
<p><strong>Debes vigilar especialmente el <a href="https://ayudawp.com/ttfb/" target="_blank" rel="noopener ugc">TTFB</a></strong> (Time to First Byte), ese parámetro que mide cuánto tarda tu servidor en empezar a enviar la respuesta.</p>
<p>Por debajo de 200 ms es excelente, entre 200 y 500 ms es bueno, de 500 ms a 1 segundo necesita mejora, y <strong>por encima de 1 segundo es un problema serio</strong>.</p>
<h2>Las herramientas para «medir» la visibilidad IA</h2>
<p>Ya conoces las señales, ahora la pregunta sería <strong>cómo saber si tu web las tiene bien implementadas</strong>, y aquí es donde entran las herramientas de medición, y donde el panorama se pone interesante (y un poco chungo a veces).</p>
<p>Antes de entrar en cada una, una aclaración importante, y es que existen <strong>dos tipos de herramientas</strong> que se llaman «<strong>AI visibility</strong>» pero que miden cosas muy diferentes.</p>
<h3>Analizadores técnicos de <em>AI Readiness</em></h3>
<p>Escanean tu web y <strong>comprueban si tienes las señales técnicas correctas</strong> (<code>Schema</code>, <code>JSON-LD</code>, estructura, rendimiento, etc.). Te dicen si tu web <em>está preparada</em> para ser procesada por IAs, y <strong>son las que nos interesan</strong>.</p>
<h3>Monitores de visibilidad de marca en IAs</h3>
<p>Estas herramientas preguntan directamente a ChatGPT, Gemini, Perplexity, etc. sobre tu marca y <strong>comprueban si la IA te menciona en sus respuestas</strong>.</p>
<p><strong>Te dicen, en teoría, si ya <em>apareces</em></strong>, no si estás preparado para aparecer, podríamos decir que son complementarias. Si te interesan, las más conocidas son SEO Review Tools AI Brand Visibility (gratis), GoVISIBLE, Visalytica y el AI Visibility Overview de Wix.</p>
<p>Pero ahora mi consejo: <strong>¡no las uses, mucho menos pagues por ellas!</strong></p>
<p>¿Por qué lo digo?, pues porque <strong>las IAs son tremendamente inconsistentes</strong> en las respuestas y, no solo en distintas sesiones o a distintos usuarios, en la misma conversación dan respuestas totalmente diferentes, incluso con el mismo prompt, y <a href="https://natzir.com/posicionamiento-buscadores/herramientas-medir-visibilidad-ia-prompt-trackers/" target="_blank" rel="noopener ugc">sino me crees pregúntale a Natzir</a>.</p>
<p>Dicho esto, <strong>vamos con los analizadores técnicos, que son los que sí te pueden ayudar a mejorar, no solo para las IAs, en general</strong>, y de paso siempre aprendes algo, a mi al menos me han servido y mucho para recuperar casi todo el tráfico que perdí tras la aparición de los chatbots de IA, esos otros buscadores.</p>
<h3>AIO Checker</h3>
<p><strong>Web</strong>: aiochecker.vercel.app<br>
<strong>Precio</strong>: Escaneo básico gratis, informe completo <code>4,99 $ por URL</code></p>
<p>Puntuación de 0 a 100 con 7 métricas: presencia de llms.txt, Schema/JSON-LD, meta tags y frescura del contenido, estructura y densidad, renderizado del servidor, calidad del sitemap y más.</p>
<p>Es rápido y el precio del informe completo es razonable para un análisis puntual, pero solo analiza una URL por consulta, no tiene contexto de tu CMS (no sabe qué plugins tienes ni qué funcionalidades están activas) y las recomendaciones son genéricas.</p>
<h3>LLMClicks.ai</h3>
<p><strong>Web</strong>: llmclicks.ai/ai-readiness-analyzer/<br>
<strong>Precio</strong>: Auditoría gratuita con PDF de 9 páginas, servicios de <code>consultoría de pago</code></p>
<p>Auditoría de 9 puntos centrada en entidades, densidad de esquema y eficiencia de tokens. Analiza varias páginas (homepage, servicios, about, blog) y genera un PDF bien presentado. El enfoque en entidades es interesante.</p>
<p>Lo mejorable: es claramente un embudo comercial hacia sus servicios de consultoría. Las recomendaciones te llevan sí o sí a contratar su servicio de optimización.</p>
<h3>SEOptimer (checks GEO)</h3>
<p><strong>Web</strong>: seoptimer.com<br>
<strong>Precio</strong>: Auditoría básica gratis, planes desde <code>19 $/mes</code></p>
<p>Herramienta de auditoría SEO de toda la vida que recientemente ha añadido tres checks de GEO: presencia de <code>llms.txt</code>, contenido renderizado (si las IAs pueden leer tu contenido sin JavaScript) y schema de identidad (<code>Organization</code>, <code>Person</code>, <code>LocalBusiness</code>).</p>
<p>Si ya usas SEOptimer, tener los checks GEO integrados es práctico, pero solo tres checks de GEO es quedarse muy corto. No comprueba Markdown para agentes, Content Signals, directivas específicas para bots de IA, feed RSS ni la mayoría de señales que realmente merecen la pena y sirven de algo.</p>
<h3>Trustworthy Digital AI Readiness Tool</h3>
<p><strong>Web</strong>: trustworthydigital.com/ai-readiness-tool/<br>
<strong>Precio</strong>: Análisis <code>gratuito de 10 páginas</code></p>
<p>Evalúa cuatro dimensiones: extractabilidad del contenido, estructura legible para máquinas, señales de autoridad y frescura. El enfoque en «extractabilidad» es acertado y el hecho de que analice varias páginas en vez de una sola es un punto a favor.</p>
<p>No comprueba llms.txt, Markdown for Agents ni señales técnicas específicas de IA. Es más un análisis de calidad de contenido general que una auditoría técnica de AI readiness.</p>
<h3>AI Visibility Tool (extensión de Chrome)</h3>
<p><strong>Web</strong>: Chrome Web Store<br>
<strong>Precio</strong>: <code>Gratis</code></p>
<p>Extensión que escanea cualquier página desde el navegador con desglose por categorías: rastreabilidad para bots de IA, datos estructurados, visibilidad LLM, contenido orientado a respuestas y encabezados. Es rápido, cómodo y puedes exportar los informes.</p>
<p>Solo analiza la página que estás viendo, sin contexto del backend. No puede saber si tienes funcionalidades configuradas pero sin activar, ni detectar conflictos entre plugins.</p>
<h3>ResultFirst AI Visibility Analysis</h3>
<p><strong>Web</strong>: resultfirst.com/tools/ai-visibility-analysis/<br>
<strong>Precio</strong>: Análisis básico gratis, <code>servicios de optimización de pago</code></p>
<p>Combina el análisis técnico con la comprobación de presencia en IAs: escanea tu web y además comprueba si apareces en respuestas de ChatGPT, Gemini y Perplexity. El enfoque combinado es interesante, pero como todas las herramientas web, no tiene acceso al backend y el objetivo final es venderte su servicio de optimización.</p>
<h3>VigIA (plugin para WordPress)</h3>
<p><strong>Web</strong>: <a href="https://es.wordpress.org/plugins/vigia/">VigIA en WordPress.org</a><br>
<strong>Precio</strong>: <code>Gratis, sin límites</code></p>
<p>VigIA incluye un <strong>analizador de visibilidad IA</strong> con un sistema de 100 puntos, 20 comprobaciones y notas de A+ a F. A diferencia de todas las anteriores funciona desde dentro de WordPress, lo que le da una ventaja que ninguna herramienta externa puede igualar.</p>
<p>Al estar instalado en tu sitio sabe qué plugins tienes activos, <strong>detecta conflictos de Schema</strong> (si tu tema, tu plugin SEO y WooCommerce están generando el mismo Schema por triplicado, te avisa), sabe si tienes funcionalidades configuradas pero sin activar, y <strong>puede enlazarte directamente a la pantalla donde corregir cada problema</strong>.</p>
<p>Las recomendaciones se organizan en 4 niveles:</p>
<ol>
<li>Funcionalidades del propio VigIA que puedes activar con un clic (<code>llms.txt</code>, Markdown para agentes, <code>JSON-LD</code>).</li>
<li>Plugins complementarios gratuitos que puedes instalar directamente (como <a href="https://es.wordpress.org/plugins/ai-share-summarize/">AI Share &amp; Summarize</a> o <a href="https://es.wordpress.org/plugins/ai-content-signals/">AI Content Signals</a>).</li>
<li>Plugins que ya tienes instalados pero desactivados.</li>
<li>Plugins de terceros con enlace de instalación, de SEO por ejemplo.</li>
</ol>
<p>Todo sin salir de WordPress.</p>
<p>Además del analizador, VigIA es un <strong>kit de herramientas IA completo</strong>:</p>
<ul>
<li><strong>Monitoriza más de 50 rastreadores de IA</strong> (quién visita tu web, con qué frecuencia, qué páginas).</li>
<li><strong>Permite bloquear rastreadores</strong> vía PHP (más efectivo que <code>robots.txt</code> porque es obligatorio, no consultivo).</li>
<li><strong>Genera <code>llms.txt</code> y <code>llms-full.txt</code> automáticamente.</strong></li>
<li><strong>Sirve Markdown for Agents, genera JSON-LD con AI Discovery.</strong></li>
<li>Envía <strong>informes por email</strong>.</li>
</ul>
<p><strong>Puedes analizar cualquier página de tu sitio</strong> con un campo de URL con autocompletado (escribe el título y te sugiere entradas, páginas y CPTs). Los resultados se cachean 24 horas, con opción de forzar un re-análisis cuando hagas cambios.</p>
<p>La desventaja obvia es que solo funciona en WordPress. Si tu web está en otro CMS las herramientas externas son tu opción, pero también te contaré sorpresas a este respecto.</p>
<p>¡Ah! <strong>¿Te he dicho que es 100% gratis, del todo?</strong></p>
<p>¿Repasamos o lo tienes claro?</p>
<h2>Comparativa general</h2>
<table>
<thead>
<tr>
<th>Característica</th>
<th>AIO Checker</th>
<th>LLMClicks.ai</th>
<th>SEOptimer</th>
<th>Trustworthy Digital</th>
<th>Extensión Chrome</th>
<th>ResultFirst</th>
<th>VigIA</th>
</tr>
</thead>
<tbody>
<tr>
<td>Precio</td>
<td>4,99 $/informe</td>
<td>Gratis (embudo)</td>
<td>Desde 19 $/mes</td>
<td>Gratis</td>
<td>Gratis</td>
<td>Gratis (embudo)</td>
<td>Gratis</td>
</tr>
<tr>
<td>N.º de comprobaciones IA</td>
<td>7</td>
<td>9</td>
<td>3</td>
<td>4 dimensiones</td>
<td>~6</td>
<td>~6</td>
<td>20</td>
</tr>
<tr>
<td>Puntuación sobre 100</td>
<td>Si</td>
<td>Si</td>
<td>Si (global SEO)</td>
<td>Si</td>
<td>Si</td>
<td>Si</td>
<td>Si</td>
</tr>
<tr>
<td>Comprueba llms.txt</td>
<td>Si</td>
<td>No</td>
<td>Si</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si (+ llms-full.txt)</td>
</tr>
<tr>
<td>Comprueba Markdown for Agents</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si</td>
</tr>
<tr>
<td>Comprueba Content Signals</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si</td>
</tr>
<tr>
<td>Directivas para bots IA</td>
<td>Parcial</td>
<td>Parcial</td>
<td>No</td>
<td>No</td>
<td>Parcial</td>
<td>Parcial</td>
<td>Si (14 bots)</td>
</tr>
<tr>
<td>Detecta conflictos de schema</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si</td>
</tr>
<tr>
<td>Acceso al backend del CMS</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si</td>
</tr>
<tr>
<td>Recomendaciones con enlace a la solución</td>
<td>Genéricas</td>
<td>Genéricas</td>
<td>Genéricas</td>
<td>Genéricas</td>
<td>Genéricas</td>
<td>Genéricas</td>
<td>Si (4 niveles)</td>
</tr>
<tr>
<td>Analizar varias páginas</td>
<td>1 por consulta</td>
<td>Varias</td>
<td>1 por consulta</td>
<td>10 páginas</td>
<td>Página actual</td>
<td>1 por consulta</td>
<td>Cualquier URL del sitio</td>
</tr>
<tr>
<td>Monitoriza rastreadores IA</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si (50+ bots)</td>
</tr>
<tr>
<td>Genera llms.txt</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Si</td>
</tr>
<tr>
<td>Funciona en cualquier web</td>
<td>Si</td>
<td>Si</td>
<td>Si</td>
<td>Si</td>
<td>Si</td>
<td>Si</td>
<td>Solo WordPress</td>
</tr>
</tbody>
</table>
<h3>Extra</h3>
<p>Además de estas herramientas que hemos visto, aunque <strong>no es tan efectivo como el medidor incluido en VigIA</strong>, también he añadido la herramienta de <a href="https://herramientas.ayudawp.com/#ai-visibility" target="_blank" rel="noopener ugc"><strong>medición de visibilidad en IA gratis</strong></a> en la web de códigos, medidores y herramientas, la tienes con el nombre tan poco intuitivo de <strong>Visibilidad IA</strong>.</p>
<p><a href="https://herramientas.ayudawp.com/#ai-visibility" target="_blank" rel="noopener ugc nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158624 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/analisis-visibilidad-ia-online-gratis-1200x774.jpg" alt="analisis visibilidad ia online gratis" width="1200" height="774" srcset="https://ayudawp.com/wp-content/uploads/2026/03/analisis-visibilidad-ia-online-gratis-1200x774.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/analisis-visibilidad-ia-online-gratis-768x496.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/analisis-visibilidad-ia-online-gratis-1536x991.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/analisis-visibilidad-ia-online-gratis.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Es muy útil, <strong>te da mediciones útiles, y buenos consejos</strong>, pero ¿por qué digo que no es tan efectiva como VigIA?, pues porque ve las webs desde fuera, no sabe lo que tienes instalado o no, no ve partes de la estructura, analiza lo que se ve, no lo que hay.</p>
<p>Es para <strong>los que no queráis instalar VigIA aún</strong> o queráis <strong>curiosear las webs de otros</strong> (con las precauciones debidas de saber que no es tan precisa la medición como desde dentro), o para aprender, que nunca está de más.</p>
<h2>Cómo implementar todo el kit de visibilidad IA en WordPress</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-158510" src="https://ayudawp.com/wp-content/uploads/2026/03/kit-visibilidad-ias.jpg" alt="kit visibilidad ias" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/03/kit-visibilidad-ias.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/kit-visibilidad-ias-768x432.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Ahora vamos a lo práctico…</p>
<p>Todo lo que he descrito puede sonar complejo pero la realidad es que al usar WordPress <strong>puedes tener todas las señales funcionando en cuestión de minutos con tres plugins gratuitos</strong>.</p>
<h3>VigIA: el centro de control</h3>
<p><a href="https://es.wordpress.org/plugins/vigia/">VigIA</a> gestiona la mayoría de las señales desde un único plugin:</p>
<ul>
<li><strong>Analítica de rastreadores</strong>: Te dice exactamente qué IAs pasan por tu web, cuándo, con qué frecuencia y qué páginas visitan. Panel de estadísticas con visitas totales, rastreadores únicos, gráfico temporal con desglose diario, distribución por categorías (entrenamiento, búsqueda, asistente, recopiladores de datos), los rastreadores más activos y las páginas más visitadas. Esta información te permite tomar decisiones fundamentadas sobre tu estrategia.</li>
<li><strong>Analizador de visibilidad IA</strong>: El sistema de 100 puntos y 20 comprobaciones. Analiza tu homepage o cualquier página individual, te da la nota, el desglose por categorías y las recomendaciones con enlaces directos a la solución.</li>
<li><strong>robots.txt para IAs</strong>: Desde la pestaña Extras puedes añadir reglas para cualquiera de los más de 50 crawlers que monitoriza. Un panel visual te permite ver tu <code>robots.txt</code> y detecta qué crawlers ignoran tus reglas.</li>
<li><strong>Bloqueo de rastreadores</strong>: Además del robots.txt (que es consultivo), VigIA permite bloquear mediante PHP, que devuelve un error 403 e impide el acceso realmente, respete o no las reglas el bot.</li>
<li><strong>Generador de llms.txt</strong>: Selecciona qué tipos de contenido incluir, filtra por categorías o etiquetas, incluye o excluye contenido manualmente, y genera automáticamente los archivos <code>llms.txt</code> y <code>llms-full.txt</code>. Si usas Yoast SEO, Rank Math, AIOSEO, SEOPress o The SEO Framework, detecta automáticamente el contenido marcado como <code>noindex</code> y lo excluye. Puedes configurar regeneración automática diaria, semanal o mensual.</li>
<li><strong>Markdown for Agents</strong>: Actívalo y cada entrada y página de tu web tendrá automáticamente su endpoint <code>.md</code>. Admite negociación de contenido, respeta las reglas de bloqueo (los crawlers bloqueados reciben un 403) y las exclusiones del llms.txt. Sigue el estándar de Cloudflare y la descubribilidad se gestiona mediante cabeceras link y etiquetas <code>&lt;link rel="alternate"&gt;</code> en el HTML.</li>
<li><strong>JSON-LD con AI Discovery</strong>: Genera el marcado de identidad del sitio (<code>WebSite</code> + <code>Organization</code> o <code>Person</code> con perfiles sociales) y las señales AI Discovery con <code>ReadAction</code> apuntando a tus llms.txt y endpoints Markdown. Incluye detección de conflictos con plugins SEO, selector de página de salida y vista previa en tiempo real del JSON-LD generado.</li>
<li><strong>Alertas por email</strong>: Informes diarios, semanales o mensuales con resumen de actividad de rastreadores.</li>
</ul>
<p>Y un detalle extra muy interesante es que si también tienes AI Share &amp; Summarize instalado <strong>puedes ver en la analítica de VigIA cuántos clics recibe cada página desde los botones de compartir</strong>, cruzando los datos con los de rastreo de IAs.</p>
<p>Son datos cruzados de plugins que se complementan para ayudarte a tener control sobre este mundo (hasta ahora más lleno de lagunas que de certezas) de la visibilidad en las IAs.</p>
<h3>AI Share &amp; Summarize: entrena TÚ a la IA</h3>
<p><a href="https://es.wordpress.org/plugins/ai-share-summarize/">AI Share &amp; Summarize</a> cubre la señal activa, los botones de compartir con IAs. Instálalo, elige qué botones mostrar y dónde, y ya está.</p>
<p>Tus visitantes podrán <strong>compartir y resumir tu contenido con ChatGPT, Claude, Gemini, Grok, Perplexity y más IAs</strong>, además de las redes sociales habituales.</p>
<p>Tienes control total sobre la posición (antes del contenido, después, ambas), qué botones mostrar, en qué tipos de contenido aparecen, y un shortcode para colocación manual si lo prefieres.</p>
<h3>AI Content Signals</h3>
<p><a href="https://es.wordpress.org/plugins/ai-content-signals/">AI Content Signals</a> añade las directivas de uso por parte de IAs en <code>robots.txt</code>. Instálalo, elige si permites el uso de tu contenido para entrenamiento, para búsqueda, o para ambos, y el plugin se encarga de añadir las directivas correspondientes.</p>
<p>Los tres son gratuitos, están en WordPress.org, y juntos cubren todos los mecanismos disponibles a día de hoy para que tu web WordPress sea lo más visible posible para las inteligencias artificiales.</p>
<h2>Cómo interpretar la puntuación</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158623 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/puntuacion-visibilidad-ia-wordpress-vigia-1200x834.jpg" alt="puntuacion visibilidad ia wordpress vigia" width="1200" height="834" srcset="https://ayudawp.com/wp-content/uploads/2026/03/puntuacion-visibilidad-ia-wordpress-vigia-1200x834.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/puntuacion-visibilidad-ia-wordpress-vigia-768x534.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/puntuacion-visibilidad-ia-wordpress-vigia-1536x1068.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/puntuacion-visibilidad-ia-wordpress-vigia-260x180.jpg 260w, https://ayudawp.com/wp-content/uploads/2026/03/puntuacion-visibilidad-ia-wordpress-vigia.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Independientemente de la herramienta que uses, <strong>la mayoría te dará una puntuación numérica, lo importante es saber qué hacer con ella</strong>.</p>
<p><strong>No te obsesiones</strong> con llegar a 100 o a la nota perfecta, <strong>lo que importa es tener bien cubiertas las áreas de más peso</strong>, me refiero al acceso y descubrimiento IA, y los datos estructurados. Si esas dos están bien ya llevas más de la mitad del camino.</p>
<p>Si tu puntuación está por debajo del 50% lo más probable es que te falten cosas básicas como un <code>robots.txt</code> sin configurar para bots de IA, sin schema JSON-LD, sin sitemap o con un sitemap que incluye páginas que no deberían estar (carrito, checkout, cuenta de usuario…). Son <strong>cosas que se arreglan rápido y que suben la nota de golpe</strong>.</p>
<p>Si estás entre 50 y 75, los fundamentos los tienes pero te faltan las señales más específicas, probablemente no tienes Markdown para agentes, ni botones de compartir y resumir, ni el JSON-LD optimizado para descubrimiento IA. Son un a más.</p>
<p>Si estás por encima de 75, ya estás bastante bien. Las mejoras a partir de aquí son de afinación, como optimizar el TTFB, revisar que todos los textos alternativos de las imágenes sean descriptivos, comprobar que no haya Schema duplicado, etc.</p>
<p>Un consejo que vale para cualquier herramienta es que <strong>analices tanto tu página de inicio como las páginas de contenidos individuales</strong>, sean artículos, productos o lo que sea que realmente sea de relevancia en tu web. La puntuación puede variar mucho entre una y otra porque las señales que aplican son diferentes.</p>
<h2>Consejos para ir ganando visibilidad</h2>
<ul>
<li><strong>Empieza por saber dónde estás</strong>: Pasa cualquiera de las herramientas que hemos visto, apunta tu puntuación y lee las recomendaciones. No intentes arreglarlo todo a la vez, prioriza lo que más impacto te va a dar con menos esfuerzo: normalmente es la configuración de robots.txt, el schema básico y el sitemap.</li>
<li><strong>Vigila quién te visita</strong>: Tener monitorización de rastreadores de IA activa desde el primer día te va a dar datos muy útiles. Saber que PerplexityBot pasa tres veces al día por tus tutoriales pero ignora tu tienda, por ejemplo, te dice mucho sobre qué contenido reforzar.</li>
<li><strong>No bloquees a ciegas</strong>: Antes de bloquear rastreadores, observa unas semanas. Hay diferencia entre bots que rastrean para citarte (los de búsqueda, como ChatGPT-User o PerplexityBot) y los que rastrean para entrenar sus modelos (GPTBot, ClaudeBot, Google-Extended). Los primeros te convienen, los segundos ya decides tú.</li>
<li><strong>Prioriza Markdown para Agents sobre el llms.txt</strong>: Si tienes que elegir por dónde empezar con las señales nuevas, Markdown for Agents es la que más impacto real tiene. Los bots de IA, cuando tienen disponible un endpoint Markdown, lo prefieren al HTML completo. Es algo que he comprobado de primera mano: el cambio es inmediato. El llms.txt créalo también, no cuesta nada, pero el que de verdad mueve la aguja es el Markdown.</li>
<li><strong>Las «cápsulas de respuesta» funcionan</strong>: Las primeras 50 a 70 palabras de cada artículo o página importante deberían responder directamente a la consulta que se supone que responden. Las IAs extraen principalmente las primeras líneas. Nada de párrafos de introducción vacíos antes de llegar al grano, responde primero, desarrolla después.</li>
<li><strong>Revisa tu Schema con regularidad</strong>: Instalar un plugin de SEO y olvidarte no es suficiente. Valida periódicamente con la <a href="https://search.google.com/test/rich-results">herramienta de resultados enriquecidos de Google</a> que no tengas errores, duplicados ni ningún Schema que no coincida con el contenido visible.</li>
<li><strong>Vuelve a analizar después de cada cambio importante</strong>: Cambio de tema, actualización de plugin SEO, reestructuración de contenido, migración de hosting, etc. Cualquier cambio gordo merece una comprobación para asegurarte de que no has roto nada.</li>
<li><strong>Combina herramientas si puedes</strong>: Un analizador técnico te dice si estás preparado, un monitor de marca te dice si ya apareces, son complementarios. Usa el analizador para mejorar tu web y, de vez en cuando, comprueba con un monitor de marca si tus esfuerzos están dando frutos en las respuestas de ChatGPT, Gemini o Perplexity.</li>
</ul>
<h2>Antes de pagar prueba lo que tienes gratis</h2>
<p>Quiero terminar con algo que me parece importante y que va más allá de herramientas y puntuaciones. <strong>Hazme caso o no, pero si tienes que leer algo de todo este tocho que sea este último</strong>.</p>
<p><strong>Llevo años viendo cómo el tráfico orgánico se desploma</strong> para mucha gente. Amigos, clientes, o simples conocidos que llevan años creando contenido, que dependen de ese tráfico para sacar adelante su negocio, su proyecto, sus facturas.</p>
<p>Eso no es cosa de broma, y me da mucha rabia que desde el minuto cero haya <strong>gente queriendo sacar dinero a su costa con técnicas que no están del todo probadas</strong>, vendiendo auditorías y consultorías sobre algo que todavía estamos todos aprendiendo.</p>
<p>Esa rabia es precisamente lo que me llevó a crear VigIA (y también AI Share &amp; Summarize y toda esta batería de plugins para IA) y a compartirlos gratis.</p>
<p>Los hice primero para mí, para entender qué estaba pasando en mis propias webs, para ver de verdad qué bots me visitaban, qué contenidos les interesaban, si respetaban mi <code>robots.txt</code> o no. Y cuando vi que funcionaba y que me daba respuestas útiles, pensé que lo mínimo que podía hacer era compartirlo para que otros pudieran <strong>hacer lo mismo sin tener que pagar nada</strong>.</p>
<p>Cada funcionalidad nueva que añado a VigIA es algo que otros cobran. El generador de <code>llms.txt</code>, el Markdown para agentes, el JSON-LD con AI Discovery, el analizador de visibilidad, todas son de pago en otras herramientas.</p>
<p>Yo lo ofrezco gratis porque <strong>creo que la gente merece poder entender lo que está pasando con su web antes de abrir la cartera</strong>. Igual es que yo soy muy pesetero, o que tengo conciencia de freelance autónomo, pero es como pienso.</p>
<p>Mi consejo, y no me importa ser pesado en esto, es que <strong>antes de pagar por cualquier servicio de «optimización para IA» instales las herramientas gratuitas y mires los datos</strong>.</p>
<p>Instala VigIA, revisa qué bots te visitan, qué páginas les interesan, cuál es tu puntuación de visibilidad. Instala <a href="https://es.wordpress.org/plugins/ai-share-summarize/">AI Share &amp; Summarize</a> y mira los clics que generan los botones para saber qué plataformas usan tus lectores. <strong>Revisa las estadísticas, entiende lo que está pasando en tu web, y entonces, ya con datos de verdad, decide</strong> si necesitas pagar por algo más o si con lo que ya tienes puedes ir avanzando.</p>
<p>Lo que he aprendido después de meses monitorizando bots de IA es que, al final, lo que quieren es bastante sencillo, ho hay en realidad grandes cambios. Entrega un sitemap limpio para encontrar tu contenido, acceso sin trabas a las páginas que les interesan, una versión Markdown si la tienes (les encanta).</p>
<p>Sobre todo <strong>no olvides lo fundamental, que es el contenido que ni Google ni las IAs tienen</strong>, han tenido ni tendrán nunca, escrito por alguien que sabe de lo que habla en carne propia. No hay fórmula mágica de GEO ni servicio premium que sustituya eso.</p>
<p>El mundo de la búsqueda ha cambiado a toda hostia.</p>
<p>Millones de personas ya usan ChatGPT, Perplexity, Claude o Gemini como <strong>alternativa a Google para buscar información</strong>, y los que usan Google hace mucho que ya no hacen clics, Que tu web esté preparada para esa realidad no es algo que puedas dejar para mañana.</p>
<p>Tu verás, pero yo creo que no pierdes nada si <a href="https://es.wordpress.org/plugins/vigia/">pruebas VigIa, lo tienes en WordPress.org</a> o en tu instalador de plugins, y empieza por conocer tu puntuación y a <strong>saber qué está pasando en tu web en lo que se refiere a las IAs</strong>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/visibilidad-ia/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>