<?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, 28 Apr 2026 08:17:53 +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>Plan de batalla para defenderte de ataques de fuerza bruta</title>
		<link>https://ayudawp.com/fuerza-bruta/</link>
					<comments>https://ayudawp.com/fuerza-bruta/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[Cloudflare]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[SiteGround]]></category>
		<category><![CDATA[Vigilante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159053</guid>

					<description><![CDATA[Cada 28 segundos un sitio WordPress recibe un intento de acceso automatizado. Wordfence bloquea más de 65 millones de ataques de fuerza bruta al día solo en su red, y los bots creados con IA han aumentado el volumen de estos ataques un 45 % en el último año.]]></description>
										<content:encoded><![CDATA[<p><strong>Cada 28 segundos un sitio WordPress recibe un intento de acceso automatizado</strong>. Wordfence bloquea más de 65 millones de ataques de fuerza bruta al día solo en su red, y <strong>los bots creados con IA han aumentado el volumen de estos ataques un 45 %</strong> en el último año.</p>
<p>Un ataque de fuerza bruta no necesita que tu web tenga una vulnerabilidad en un plugin o un tema desactualizado, <strong>le basta con tu página de acceso</strong>.</p>
<p>Un script prueba <strong>combinaciones de usuario y contraseña, una tras otra, miles de veces por hora, hasta que da con la correcta o el servidor se cae</strong> por la carga. Y <strong>muchas veces el objetivo ni siquiera es entrar, sino tumbar tu web</strong> a base de peticiones.</p>
<p>La buena noticia es que <strong>este tipo de ataque es de los más fáciles de parar</strong>. Pero hay una diferencia enorme entre «instalar un plugin de seguridad y olvidarte» y montar una defensa seria, y esa diferencia está en <strong><em>dónde</em> frenas el ataque</strong>.</p>
<p>En esta guía te explicaré <strong>cómo montar una protección por capas usando solo herramientas gratuitas</strong>.</p>
<p><strong>Vamos a ir de fuera hacia dentro</strong>, primero la CDN como filtro perimetral, luego el hosting a nivel de servidor, y finalmente WordPress con plugins y buenas prácticas.</p>
<p>Cada capa tiene su función, todas son importantes, y <strong>cuando trabajan juntas los ataques de fuerza bruta dejan de ser un problema</strong> y pasan a ser ruido de fondo que ni notas.</p>
<p>Yo te voy a poner los ejemplos con las herramientas que uso y recomiendo, que ya sabrás que Cloudflare como CDN, SiteGround como hosting, y Vigilante como plugin de seguridad dentro de WordPress.</p>
<p><strong>Los conceptos y las estrategias de cada capa son aplicables con cualquier combinación de herramientas</strong>, si usas otro CDN, otro hosting u otro plugin de seguridad, adapta los pasos a tu caso.</p>
<h2>Dónde frenes el ataque lo cambia todo</h2>
<p>Antes de entrar en materia necesitas entender algo que cambia la forma de pensar sobre seguridad en WordPress, y es que <strong>no es lo mismo frenar un ataque en la puerta de tu casa que frenarlo a tres calles de distancia</strong>.</p>
<p><strong>Cada vez que alguien (o un bot) intenta acceder</strong> a tu WordPress, el servidor tiene que hacer bastante trabajo:</p>
<ol>
<li>Cargar el núcleo de WordPress</li>
<li>Conectarse a la base de datos</li>
<li>Buscar el usuario</li>
<li>Calcular el hash de la contraseña</li>
<li>Ejecutar todos los hooks de seguridad</li>
</ol>
<p><strong>Multiplica eso por cientos o miles de intentos por hora y tu servidor se queda sin recursos</strong> para servir a los visitantes reales.</p>
<p>Si frenas el ataque <strong>solo con un plugin dentro de WordPress el daño ya está hecho a nivel de recursos</strong>, porque en este momento PHP ya se ha ejecutado y la base de datos ya ha recibido consultas.</p>
<p>Un plugin de seguridad puede bloquear al atacante después de X intentos, pero el servidor ya ha tragado toda esa carga. Si frenas el ataque en el CDN, esas peticiones ni siquiera llegan a tu servidor, el consumo de recursos es cero y tu web sigue funcionando como si no pasara nada.</p>
<p><strong>La arquitectura por capas funciona como una defensa militar</strong> donde primero está el perímetro exterior, donde se frena al grueso del ejército atacante, luego están las murallas del castillo, donde se bloquea lo que ha conseguido pasar, y finalmente la guarnición interior, que se encarga de lo que ha logrado colarse por las grietas. <strong>Si una capa falla las otras siguen en pie</strong>.</p>
<ul>
<li><strong>Capa 1 – CDN (perímetro)</strong>: Filtra el tráfico masivo antes de que llegue a tu servidor. Aquí paras el 95% de los ataques.</li>
<li><strong>Capa 2 – Hosting (servidor)</strong>: Bloquea IPs concretas y tráfico por países a nivel de infraestructura. Lo que pasa el CDN se encuentra con este filtro.</li>
<li><strong>Capa 3 – WordPress (aplicación)</strong>: Analiza el comportamiento dentro de WordPress, limita intentos, exige segundo factor de autenticación, registra actividad y responde a ataques dirigidos.</li>
</ul>
<p>Cada capa atrapa lo que se le escapa a la anterior, esa es la gracia del asunto. ¿Lo tienes claro?, pues <strong>¡a defender la ciudad!</strong></p>
<h2>Capa 1: la CDN como primera línea de defensa</h2>
<p>Una <a href="https://ayudawp.com/tag/cdn/" target="_blank" rel="noopener">CDN</a> (red de entrega de contenidos) como Cloudflare o KeyCDN actúa como <strong>proxy inverso</strong>, de manera que <strong>todo el tráfico de tu web pasa primero por él antes de llegar a tu servidor</strong>. Eso te da un control enorme sobre qué peticiones pasan y cuáles se quedan en la puerta.</p>
<p><em>En los ejemplos uso Cloudflare porque es el que yo utilizo y recomiendo, tiene un plan gratuito muy completo y es el más extendido, pero la estrategia es la misma con cualquier CDN que ofrezca reglas de firewall, gestión de bots y bloqueo geográfico.</em></p>
<p><strong>Las estrategias van de menor a mayor impacto en la experiencia de usuario</strong>. Empieza por las primeras, que son invisibles para los visitantes legítimos, y usa las últimas solo cuando sea necesario.</p>
<h3>Filtrar bots automatizados</h3>
<ul>
<li><strong>Qué consigues:</strong> eliminar el tráfico de bots maliciosos antes de que hagan una sola petición a tu servidor. Esta medida es completamente invisible para los visitantes humanos y no tiene ningún efecto negativo en la experiencia de usuario ni en el SEO.</li>
<li><strong>Cómo funciona:</strong> las CDN modernas utilizan aprendizaje automático para distinguir bots de humanos basándose en patrones de comportamiento, reputación de IP, huellas digitales del navegador y otros factores. A los bots maliciosos se les bloquea automáticamente.</li>
<li><strong>Cómo se hace en Cloudflare:</strong> ve a <strong>Seguridad → Configuración → Tráfico de bots</strong> y activa el <strong>Modo bot fight</strong>. Un clic y listo.</li>
<li><strong>Contras:</strong> si usas servicios que acceden a tu web de forma automatizada (herramientas de monitorización de uptime, servicios de backup externos, APIs de terceros, pasarelas de pago), comprueba que siguen funcionando. En la gran mayoría de casos no hay problema, pero vale la pena verificarlo.</li>
</ul>
<h3>Proteger la página de acceso con reglas de firewall</h3>
<ul>
<li><strong>Qué consigues:</strong> que cualquier bot que intente acceder a tu <code>wp-login.php</code> tenga que pasar un desafío que no puede superar. Los visitantes humanos lo resuelven automáticamente en un par de segundos sin molestias.</li>
<li><strong>Cómo funciona:</strong> configuras una regla en el firewall del CDN para que toda petición a tu página de login pase por un desafío JavaScript (lo que se conoce como Managed Challenge). Los navegadores reales lo resuelven solos. Los scripts automatizados no pueden.</li>
<li><strong>Cómo se hace en Cloudflare:</strong> ve a <strong>Seguridad → Reglas de seguridad</strong> y crea una regla:
<ul>
<li>Nombre: Proteger login WordPress</li>
<li>Campo: <code>Ruta de URI</code></li>
<li>Operador: <code>contiene</code></li>
<li>Valor: <code>/wp-login.php</code></li>
<li>Acción: <code>Desafío administrado</code></li>
</ul>
</li>
<li><strong>Pros:</strong> filtra prácticamente todos los bots de fuerza bruta que van contra el login, con un impacto mínimo en usuarios reales (un par de segundos de espera la primera vez).</li>
<li><strong>Contras:</strong> si tienes un formulario de login personalizado en otra URL (algunos temas o plugins lo hacen), necesitas añadir esa ruta también a la regla. Y si tienes muchos usuarios que acceden frecuentemente (una tienda WooCommerce con miles de clientes, por ejemplo), ese par de segundos extra se multiplica.</li>
</ul>
<h3>Bloquear vectores de ataque innecesarios</h3>
<ul>
<li><strong>Qué consigues:</strong> cerrar puertas de entrada que probablemente no necesitas y que los atacantes usan como alternativa al login.</li>
<li><strong>Cómo funciona:</strong> <code>xmlrpc.php</code> es un archivo de WordPress que permite la comunicación remota con tu web. Lo usan algunas apps para publicar desde el móvil y ciertos plugins, pero también es un vector de ataque muy popular porque permite probar credenciales en masa con una sola petición (el método <code>system.multicall</code>). La mayoría de webs WordPress modernas no lo necesitan.</li>
<li><strong>Cómo se hace en Cloudflare:</strong> crea otra regla personalizada:
<ul>
<li>Nombre: Bloquear XML-RPC</li>
<li>Campo: <code>Ruta de URI</code></li>
<li>Operador: <code>contiene</code></li>
<li>Valor: <code>/xmlrpc.php</code></li>
<li>Acción: <code>Bloquear</code></li>
</ul>
</li>
<li><strong>Pros:</strong> eliminas un vector de ataque importante sin afectar al funcionamiento normal de la web en la gran mayoría de casos.</li>
<li><strong>Contras:</strong> si usas Jetpack, la app oficial de WordPress para móvil, o algún servicio que dependa de XML-RPC, dejarán de funcionar. En ese caso, usa <code>Desafío administrado</code> como acción en vez de Block, así los servicios legítimos podrán pasar el desafío.</li>
</ul>
<h3>Restringir el acceso geográfico</h3>
<p><strong>Qué consigues:</strong> reducir drásticamente el volumen de ataques bloqueando el acceso desde países que no forman parte de tu audiencia. La mayoría de botnets operan desde redes distribuidas por todo el mundo, así que limitar geográficamente es muy efectivo.</p>
<ul>
<li><strong>Cómo funciona:</strong> el CDN identifica el país de origen de cada petición por su IP y aplica la acción que tú elijas: bloquear, presentar un desafío o dejar pasar.</li>
<li><strong>Cómo se hace en Cloudflare:</strong> ve a <strong>Seguridad → Reglas de seguridad</strong> y crea una regla usando el campo <strong>País</strong>. Puedes seleccionar los países que quieras restringir y elegir la acción.<br>
Aquí hay dos estrategias según lo agresivo que quieras ser:
<ul>
<li><strong>Restringir solo el login por país:</strong> combina las condiciones <code>Ruta de URI</code> + <code>contains</code> + <code>/wp-login.php</code> <strong>Y</strong> <code>País</code> + <code>es igual a</code> [país]. De este modo solo bloqueas el acceso al login desde esos países, pero pueden visitar tu web con normalidad.</li>
<li><strong>Restringir toda la web por país:</strong> bloquea o aplica el desafío a todo el tráfico de ciertos países. Más agresivo, pero más efectivo si tu web tiene una audiencia geográfica muy clara.<br>
<strong>Mi consejo</strong>: empieza por los países desde los que recibes más ataques (puedes verlo en los registros de eventos de seguridad del CDN) y usa <code>Desafío administrado</code> en vez de <code>Bloqueo</code>. Así, si hay un visitante legítimo de ese país puede pasar la verificación y acceder.</li>
</ul>
</li>
<li><strong>Pros:</strong> reduce el volumen de ataques de forma drástica si tienes geográficamente localizada a tu audiencia.</li>
<li><strong>Contras:</strong> te puedes cargar tráfico legítimo si no piensas bien qué países bloqueas. Servicios como pasarelas de pago, APIs de terceros o herramientas de monitorización pueden operar desde países que no esperas. Y si usas el bloquo en vez del desafío no hay vuelta atrás para esas visitas.</li>
</ul>
<h3>Ajustes generales de seguridad</h3>
<ul>
<li><strong>Qué consigues:</strong> un nivel base de protección que complementa las reglas específicas.<br>
Estos ajustes son el equivalente a cerrar bien todas las ventanas antes de salir de casa. Ninguno por sí solo para un ataque, pero todos juntos complican la vida al atacante:</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li><strong>SSL/TLS en modo Completo (estricto):</strong> si tu hosting incluye certificado SSL (SiteGround y la mayoría de hostings de calidad lo ofrecen gratis), activa este modo para que la conexión entre el CDN y tu servidor esté cifrada de extremo a extremo. Evita ataques de tipo man-in-the-middle.</li>
<li><strong>Siempre usar HTTPS:</strong> redirige todo el tráfico HTTP a HTTPS automáticamente.</li>
<li><strong>Nivel de seguridad en medio o alto:</strong> determina el umbral a partir del cual el CDN presenta desafíos a visitantes sospechosos.</li>
<li><strong>Tiempo del desafío a 30 minutos:</strong> el tiempo durante el cual un visitante que ha pasado un desafío no tendrá que repetirlo.</li>
</ul>
</li>
</ul>
<h3>Último recurso: modo Under Attack</h3>
<p>Este es el <strong>botón de pánico</strong>. No es una medida preventiva, es una medida de emergencia.</p>
<ul>
<li><strong>Qué consigues:</strong> frenar de golpe todo el tráfico malicioso cuando tu web está siendo atacada activamente y lo notas en el rendimiento (la web va lenta, se cae, el servidor no responde).</li>
<li><strong>Cómo funciona:</strong> al activarlo todos los visitantes (humanos y bots) tienen que pasar un desafío JavaScript antes de acceder a cualquier página de tu web. Los bots quedan completamente fuera.</li>
<li><strong>Cómo se hace en Cloudflare:</strong> en la página principal de tu dominio, busca <strong>Modo Under Attack Mode</strong> en el panel lateral derecho y actívalo. Si tienes la app de Cloudflare en el móvil puedes hacerlo desde cualquier sitio.</li>
<li><strong>Pros:</strong> efectividad inmediata. En cuestión de segundos el volumen de tráfico malicioso que llega a tu servidor cae a prácticamente cero. Es la respuesta más rápida que existe.</li>
<li><strong>Contras:</strong> afecta a todos los visitantes, incluidos los legítimos. Añade un par de segundos de espera a cada visita nueva (la pantalla de verificación automática de Cloudflare). Perjudica al SEO si se mantiene activado mucho tiempo porque los bots de búsqueda también tienen que pasar el desafío. Las APIs y webhooks que recibe tu web pueden dejar de funcionar. No es algo para tener puesto permanentemente.</li>
<li><strong>Cuándo usarlo:</strong> solo cuando estás bajo un ataque activo que afecta al rendimiento de tu web y las reglas WAF no son suficientes para contenerlo. Actívalo, espera a que la situación se estabilice, analiza el patrón del ataque, crea reglas de seguridad específicas para ese patrón, y desactívalo.</li>
</ul>
<h2>Capa 2: el hosting como segunda muralla</h2>
<p>Tu hosting es la infraestructura donde vive tu web. Los hosting de calidad incluyen herramientas de seguridad que actúan a nivel de servidor, antes de que WordPress se cargue, eso los convierte en <strong>un segundo filtro muy eficiente para lo que ha conseguido pasar el CDN</strong>.</p>
<p><em>Al igual que como te comenté con las CDN y Cloudflare, en los ejemplos uso SiteGround porque es el hosting que recomiendo y conozco en detalle, pero la mayoría de hosting serios ofrecen funcionalidades equivalentes. Busca en tu panel de control las opciones de bloqueo de IPs, bloqueo de tráfico y logs de acceso.</em></p>
<p>Aquí <strong>las estrategias van de lo más básico (observar) a lo más agresivo (bloquear países enteros)</strong>.</p>
<h3>Vigilar los registros de acceso</h3>
<ul>
<li><strong>Qué consigues:</strong> visibilidad sobre lo que llega a tu servidor. Sin esta información estás tomando decisiones a ciegas.</li>
<li><strong>Cómo funciona:</strong> el hosting registra todas las peticiones que recibe tu servidor, como la IP de origen, la URL solicitada, el código de respuesta HTTP, el user-agent y la marca de tiempo. Revisando estos logs puedes detectar patrones de ataque, o sea, muchas peticiones a <code>wp-login.php</code> desde una misma IP, picos de tráfico inusuales, accesos desde países que no esperas.</li>
<li><strong>Cómo se hace en SiteGround:</strong> ve a <strong>Site Tools → Estadísticas → Registro de acceso</strong>.</li>
</ul>
<p>No necesitas revisar los registros cada día pero sí cuando notes algo raro (web lenta, consumo de recursos alto, avisos del hosting) o como rutina semanal/mensual.</p>
<p>Lo que encuentres ahí te ayuda a tomar mejores decisiones en las otras capas, a la hora de crear reglas de seguridad más específicas en la CDN o bloquear IPs y rangos concretos.</p>
<h3>Bloquear IPs desde el servidor</h3>
<ul>
<li><strong>Qué consigues:</strong> que las IPs que has identificado como atacantes no lleguen ni a cargar PHP. El bloqueo se ejecuta en el servidor así que el impacto en rendimiento de tu WordPress es cero.</li>
<li><strong>Cómo funciona:</strong> añades la IP o el rango de IPs a una lista de bloqueo en el panel de tu hosting. El servidor rechaza esas conexiones antes de que WordPress se entere de que existen.</li>
<li><strong>Cómo se hace en SiteGround:</strong> ve a <strong>Site Tools → Seguridad → Tráfico bloqueado</strong>. Puedes bloquear IPs individuales (por ejemplo, <code>185.234.218.45</code>) o rangos con comodines (por ejemplo, <code>185.234.218.*</code>).</li>
<li><strong>Pros:</strong> muy eficiente a nivel de recursos, el bloqueo se produce antes de que intervenga PHP o WordPress.</li>
<li><strong>Contras:</strong> los ataques de fuerza bruta suelen venir de miles de IPs rotativas así que bloquear IPs una a una es jugar al ratón y al gato. Es efectivo para IPs persistentes que detectas repetidamente en los logs, para ataques masivos distribuidos el bloqueo geográfico o las reglas del CDN son mejores opciones.</li>
</ul>
<h3>Bloquear tráfico por países desde el servidor</h3>
<ul>
<li><strong>Qué consigues:</strong> cortar de raíz todo el tráfico de países que no tienen relación con tu web, sin pasar por ningún desafío ni verificación. Bloqueo total para bien o para mal.</li>
<li><strong>Cómo funciona:</strong> el hosting identifica el país de origen de la IP y, si está en la lista de bloqueados, muestra una página de bloqueo. No hay opción de pasar una verificación como en el CDN. Bloqueo y punto.</li>
<li><strong>Cómo se hace en SiteGround:</strong> ve a <strong>Site Tools → Seguridad → Tráfico bloqueado &gt; Bloquear país</strong>. Selecciona el dominio, elige el país y confirma.</li>
<li><strong style="font-size: 16px;">Pros:</strong><span style="font-size: 16px;"> muy efectivo para reducir carga de servidor. Se ejecuta antes de que WordPress se cargue.</span></li>
<li><strong style="font-size: 16px;">Contras:</strong><span style="font-size: 16px;"> es un bloqueo sin matices. Puedes bloquear visitantes legítimos, clientes, pasarelas de pago o servicios que operen desde esos países. Piénsalo bien antes de activarlo y revísalo periódicamente.</span></li>
</ul>
<blockquote><p>Hay una diferencia importante con el bloqueo geográfico del CDN pues aquí el bloqueo es absoluto, no hay desafío administrado. Si bloqueas un país nadie de ese país accede a nada de tu web. Por eso recomiendo esta estrategia:</p>
<ul>
<li><strong>Bloqueo <em>suave</em> por países</strong> (con posibilidad de que humanos pasen): hazlo en el CDN con el desafío administrado.</li>
<li><strong>Bloqueo <em>duro</em> por países</strong> (nadie accede): hazlo en el hosting, pero solo si estás seguro de que no tienes visitantes, clientes o servicios en esos países.</li>
</ul>
</blockquote>
<h3>El plugin de seguridad del hosting</h3>
<p>Hay algunos hosting que ofrecen su propio plugin de seguridad para WordPress, y como me habrás oído decir más de una vez ante la duda siempre usa primero lo que te ofrezca el hosting, son los mayores interesados en que no tengas problemas.</p>
<p>Siguiendo con el ejemplo, SiteGround tiene <a href="https://es.wordpress.org/plugins/sg-security/" target="_blank" rel="noopener">Security Optimizer</a>, que incluye 2FA, límite de intentos de login, URL de login personalizada y registro de actividad.</p>
<p>Si ya usas un plugin de seguridad, tipo <a href="https://ayudawp.com/tag/vigilante/" target="_blank" rel="noopener">Vigilante</a> o Wordfence, no lo necesitas, pero ojo, que <strong>tener dos plugins de seguridad activos a la vez suele causar conflictos</strong>. Pero si no usas ninguno y tu hosting ofrece uno es una forma rápida de tener lo básico cubierto.</p>
<h2>Capa 3: WordPress, tu último bastión de defensa</h2>
<p>Las dos capas anteriores filtran la gran mayoría del tráfico malicioso, pero <strong>siempre hay peticiones que pasan</strong>, como ataques más sofisticados, IPs sin historial malicioso, o intentos dirigidos desde pocas IPs que no disparan los umbrales de la CDN.</p>
<p>Esta capa tiene <strong>una ventaja que las otras no tienen, el contexto</strong>.</p>
<p>Dentro de WordPress sabes quién está intentando entrar, qué usuario están probando, cuántos intentos llevan, qué están haciendo exactamente, y <strong>puedes tomar decisiones basándote en información muy concreta</strong>.</p>
<p>Voy a organizar esta sección por <strong>estrategias de defensa, de menor a mayor impacto</strong>, y en cada una te doy las herramientas gratuitas con las que puedes aplicarla.</p>
<p>Igual que en las capas anteriores, <strong>de lo preventivo a lo reactivo, del perímetro al último recurso</strong>.</p>
<h3>Limitar los intentos de login</h3>
<ul>
<li><strong>Qué consigues:</strong> que un bot no pueda probar miles de combinaciones de usuario y contraseña sin consecuencias. Después de X intentos fallidos la IP se bloquea temporalmente.</li>
<li><strong>Cómo funciona:</strong> tu plugin de seguridad cuenta los intentos de acceso fallidos desde cada IP. Cuando se supera el umbral que hayas configurado (por ejemplo 5 intentos), esa IP se bloquea durante un tiempo. Si vuelve a intentarlo después del bloqueo y falla otra vez, el siguiente bloqueo es más largo (bloqueo progresivo). Así se desanima a los bots que insisten.</li>
<li><strong>Configuración recomendada:</strong> entre 3 y 5 intentos permitidos, con un primer bloqueo de 15 a 30 minutos y bloqueos progresivos activados.</li>
<li><strong>Con qué puedes hacerlo:</strong>
<ul>
<li><a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="noopener">Vigilante</a>: puedes configurar el límite de intentos, los bloqueos progresivos y recibes avisos por email de los bloqueos. También oculta los mensajes de error de la pantalla de acceso, para no revelar si un usuario existe o no (dato que los atacantes aprovechan para afinar sus ataques).</li>
<li><a href="https://es.wordpress.org/plugins/limit-login-attempts-reloaded/" target="_blank" rel="noopener">Limit Login Attempts Reloaded</a>: plugin ligero y centrado solo en esto. Si no quieres un plugin de seguridad completo y solo buscas limitar los intentos este es el más popular y funciona bien.</li>
</ul>
</li>
<li><strong>Pros:</strong> medida fundamental que frena a la mayoría de bots simples y fácil de configurar.</li>
<li><strong>Contras:</strong> si el ataque viene de miles de IPs rotativas (una botnet) cada IP solo necesita un par de intentos y nunca llega al umbral de bloqueo. Para ataques distribuidos esta medida por sí sola no es suficiente, necesitas las capas anteriores.</li>
</ul>
<h3>Proteger el acceso a wp-login</h3>
<ul>
<li><strong>Qué consigues:</strong> que los bots no encuentren la página de acceso estándar de WordPress. Si no la encuentran no la atacan, y buscan otras.</li>
<li><strong>Cómo funciona:</strong> cambias la URL de login de WordPress por una personalizada que solo tú conozcas. En vez de <code>tudominio.com/wp-login.php</code> tu acceso estará en <code>tudominio.com/lo-que-tu-quieras</code>. Los bots que buscan <code>wp-login.php</code> automáticamente se encuentran con un error 404 y se van.</li>
<li><strong>Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante: activa la URL de acceso personalizada y elige una dirección que puedas recordar. Tienes la opción de informar por email a todos los usuarios a los que les afecte el cambio.</li>
<li><a href="https://es.wordpress.org/plugins/wps-hide-login/" target="_blank" rel="noopener">WPS Hide Login</a>: plugin muy ligero que hace solo esto. Buena opción si no necesitas un plugin de seguridad más completo.</li>
</ul>
</li>
<li><strong>Pros:</strong> reduce el ruido de ataques automatizados de forma considerable. Los bots buscan <code>wp-login.php</code> por defecto y si no lo encuentran, no insisten.</li>
<li><strong>Contras:</strong> esto es <em>seguridad por oscuridad</em>, no seguridad real. Un atacante determinado puede encontrar tu URL de login de otras formas (redireccionando a <code>wp-admin</code>, por ejemplo). No sustituye a las demás medidas, pero complementa.</li>
</ul>
<h3>Identificación en dos pasos (2FA)</h3>
<p><strong>Qué consigues:</strong> que aunque un atacante adivine tu contraseña no pueda entrar. Es la medida individual con más impacto contra ataques de fuerza bruta. El 2FA convierte la fuerza bruta en un ataque completamente inútil contra tu cuenta.</p>
<ul>
<li><strong>Cómo funciona:</strong> después de introducir usuario y contraseña correctos, necesitas un segundo factor de verificación: un código temporal que se envía a tu email, una app de autenticación en tu móvil o una llave de seguridad física. Sin ese segundo factor el acceso no se completa.</li>
<li><strong>Configuración recomendada:</strong> actívalo como mínimo para todos los administradores. Si tienes editores o autores actívalo también para ellos. Puedes activar la opción de dispositivos de confianza para no tener que verificar cada vez que entras desde tu equipo habitual.</li>
<li><strong>Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante: incluye 2FA por correo electrónico. Cuando inicias sesión, recibes un código de un solo uso. Puedes configurar dispositivos de confianza para 30 días y forzar el 2FA por roles.</li>
<li><a href="https://es.wordpress.org/plugins/two-factor/" target="_blank" rel="noopener">Two-Factor</a>: plugin de referencia para 2FA en WordPress, desarrollado por colaboradores del núcleo de WordPress. Admite apps TOTP (Google Authenticator, Authy), códigos por email, llaves de seguridad U2F y códigos de respaldo. Si prefieres 2FA con app de verificación en vez de por email esta es la opción gratuita más completa.</li>
</ul>
</li>
</ul>
<p><em>Puedes usar Two-Factor junto con Vigilante sin problemas desactivando el 2FA de Vigilante y usar Two-Factor para gestionarlo.</em></p>
<ul>
<li><strong>Pros:</strong> efectividad prácticamente absoluta. El 2FA hace que la fuerza bruta sea irrelevante como método para robar credenciales.</li>
<li><strong>Contras:</strong> añade un paso más al login lo que puede resultar incómodo. Si usas 2FA por email y tu servidor de correo falla puedes quedarte fuera de tu propia web (por eso los códigos de respaldo son importantes). Para webs con muchos usuarios (tiendas, membresías) forzar 2FA a todos puede generar quejas. Inicialmente actívalo solo para perfiles con permisos altos y, sobre todo, que puedan acceder a <code>wp-admin</code>, no a clientes por ejemplo.</li>
</ul>
<h3>Política de contraseñas y gestión de usuarios</h3>
<ul>
<li><strong>Qué consigues:</strong> eliminar el eslabón más débil de la cadena, que suele ser una contraseña mala o una cuenta con un nombre predecible. El 80 % de los ataques con éxito a WordPress se basan en contraseñas débiles o robadas.</li>
<li><strong>Qué hacer:</strong>
<ul>
<li><strong>Bloquear nombres de usuario predecibles:</strong> impide que existan usuarios con nombres como «<code>admin</code>«, «<code>test</code>«, «<code>root</code>» o «<code>administrator</code>«, son los primeros que prueban los bots.</li>
<li><strong>Forzar contraseñas seguras:</strong> un mínimo de 12 a 16 caracteres, con mezcla de tipos. Usa un gestor de contraseñas (Bitwarden es gratuito y funciona muy bien).</li>
<li><strong>No reutilizar contraseñas:</strong> si tu contraseña de WordPress es la misma que la de tu email, un atacante que consiga una tiene las dos.</li>
<li><strong>Caducidad de contraseñas:</strong> obliga a cambiarlas periódicamente, sobre todo en entornos con varios usuarios.</li>
<li><strong>Gestión de sesiones:</strong> controla cuántas sesiones simultáneas puede tener un usuario y cierra las que no reconozcas.</li>
</ul>
</li>
<li><strong>Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante: puedes bloquear nombres de usuario inseguros, forzar contraseñas con longitud mínima, configurar caducidad de contraseñas con intervalos personalizados, activar historial de contraseñas para evitar reutilización, y gestionar sesiones activas.</li>
<li>Manualmente: si no usas un plugin de seguridad al menos crea un nuevo usuario administrador con un nombre no predecible, asígnale todo el contenido del usuario «<code>admin</code>«, y elimina ese usuario «<code>admin</code>«. Es un cambio de dos minutos que reduce los intentos exitosos de forma considerable.</li>
</ul>
</li>
</ul>
<h3>Cortafuegos a nivel de aplicación</h3>
<ul>
<li><strong>Qué consigues:</strong> una capa de protección dentro de WordPress que analiza cada petición y bloquea las que tengan patrones maliciosos, antes de que WordPress las procese completamente.</li>
<li><strong>Cómo funciona:</strong> el cortafuegos del plugin examina cada petición HTTP en busca de inyecciones SQL, ataques XSS, intentos de inclusión de archivos, exploración de directorios y otros patrones de ataque conocidos. También permite crear listas de IPs y <code>User-Agent</code> permitidos o bloqueados.</li>
<li><strong>Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante: incluye cortafuegos con protección contra SQL injection, XSS, LFI/RFI, limitación de tráfico, y listas blancas/negras de IPs y User-Agents. Puedes añadir IPs a la lista negra directamente desde el registro de actividad con un clic.</li>
<li><a href="https://es.wordpress.org/plugins/wordfence/" target="_blank" rel="noopener">Wordfence</a> (versión gratuita): cortafuegos bastante completo con escáner de malware. El pero es que su versión gratuita retrasa las reglas de cortafuegos 30 días respecto a la versión de pago, pero como cortafuegos gratuito funciona.</li>
</ul>
</li>
<li><strong>Importante:</strong> no instales más de un plugin con cortafuegos a la vez. Elige uno.</li>
<li><strong>Pros:</strong> añade protección contra tipos de ataque que van más allá de la fuerza bruta (inyecciones, XSS, exploración de archivos).</li>
<li><strong>Contras:</strong> un cortafuegos dentro de WordPress consume recursos de PHP en cada petición. Si el grueso del tráfico malicioso ya está filtrado por el CDN y el hosting, este cortafuegos solo procesa las peticiones que se han colado, lo que minimiza el impacto. Pero si es tu única capa de defensa la carga puede ser importante bajo un ataque fuerte.</li>
</ul>
<h3>Registro de actividad y monitorización</h3>
<ul>
<li><strong>Qué consigues:</strong> visibilidad total sobre lo que pasa dentro de tu WordPress. Sin un registro de actividad muchos ataques pasan desapercibidos hasta que ya han causado daño.</li>
<li><strong>Cómo funciona:</strong> el plugin registra todos los eventos relevantes. Puedes vigilar intentos de acceso (correctos y fallidos), cambios en usuarios, modificaciones de contenido, activaciones de plugins, amenazas bloqueadas, y además podrás filtrar, buscar patrones y exportar los datos.</li>
<li><strong>Qué es relevante para fuerza bruta:</strong>
<ul>
<li>Qué usuarios están siendo atacados (si prueban «<code>admin</code>» y no tienes ese usuario bien, si prueban tu usuario real es que hay un problema mayor).</li>
<li>Desde qué IPs vienen los intentos (para bloquearlas en el CDN o en el hosting).</li>
<li>Si hay intentos coordinados desde varios orígenes (indicio de botnet).</li>
<li>Si alguien ha conseguido entrar (un login con éxito que no reconoces es señal de alarma inmediata).</li>
</ul>
</li>
<li><strong style="font-size: 16px;">Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante: registro de actividad completo con filtros por tipo de evento, gravedad, método HTTP y fecha y exportación a CSV. Desde cada registro puedes añadir la IP o el <code>User-Agent</code> a la lista blanca o negra del cortafuegos con un clic, y tiene enlaces directos a AbuseIPDB para verificar las IPs. Configura la retención a 30 días como equilibrio entre información útil y espacio en base de datos.</li>
<li><a href="https://es.wordpress.org/plugins/wp-security-audit-log/" target="_blank" rel="noopener">WP Activity Log</a>: plugin especializado en el registro de actividad, muy detallado. Si usas un plugin de seguridad sin registro de actividad es un buenísimo complemento.</li>
</ul>
</li>
<li><strong>Pros:</strong> te permite tomar decisiones informadas en vez de actuar a ciegas. Detectas patrones, respondes rápido y aprendes de cada ataque.</li>
<li><strong>Contras:</strong> los registros consumen espacio en la base de datos. Configura un periodo de retención razonable y no acumules meses de logs innecesarios.</li>
</ul>
<h3>Proteger vectores secundarios</h3>
<ul>
<li><strong>Qué consigues:</strong> cerrar puertas laterales que los atacantes pueden usar para obtener información o acceder a tu web sin pasar por el login.</li>
<li><strong>Qué vectores proteger:</strong>
<ul>
<li><strong>API REST y enumeración de usuarios:</strong> por defecto la API REST de WordPress expone la lista de usuarios de tu web en <code>/wp-json/wp/v2/users</code>. Un atacante puede obtener nombres de usuario reales y usarlos en ataques de fuerza bruta dirigidos. Bloquea esta exposición para usuarios no verificados.</li>
<li><strong>Cabeceras de seguridad:</strong> configurar Content Security Policy (CSP), HSTS, X-Frame-Options y otras cabeceras reduce la superficie de ataque general de tu web. No impide la fuerza bruta directamente pero dificulta otros tipos de ataque que pueden complementarla.</li>
<li><strong>Archivos sensibles:</strong> protege el acceso a <code>.htaccess</code>, <code>wp-config.php</code>, <code>readme.html</code> y otros archivos que pueden revelar información de tu instalación.</li>
</ul>
</li>
<li><strong style="font-size: 16px;">Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante: incluye control de la REST API (tres modos: público, solo autenticados, selectivo), configuración completa de cabeceras de seguridad con herramienta de prueba integrada, y protección de archivos sensibles.</li>
<li><a href="https://es.wordpress.org/plugins/all-in-one-wp-security-and-firewall/" target="_blank" rel="nofollow noopener">AIOS</a>: plugin de seguridad muy completo que incluye protección contra muchos de estos otros vectores de ataque.</li>
</ul>
</li>
</ul>
<h3>Tu último recurso: modo bajo ataque desde la aplicación</h3>
<p>Al igual que la CDN tiene su <em>botón de pánico</em> algunos plugins de seguridad tienen el suyo propio dentro de WordPress.</p>
<ul>
<li><strong>Qué consigues:</strong> reforzar toda la protección de WordPress de golpe cuando estás bajo un ataque que ha conseguido pasar las dos capas anteriores.</li>
<li><strong>Cómo funciona:</strong> es prácticamente lo que hace la CDN pero desde WordPress. Al activarlo se aplican restricciones mucho más agresivas de forma temporal:
<ul>
<li>Desafío JavaScript desde la aplicación</li>
<li>Limitación de tráfico muy estricta</li>
<li>Bloqueo de métodos HTTP innecesarios</li>
<li>Restricción de la REST API</li>
<li>Bloqueo total de XML-RPC.</li>
</ul>
</li>
<li><strong>Con qué puedes hacerlo:</strong>
<ul>
<li>Vigilante, que yo sepa ningún otro plugin ofrece esto: el modo bajo ataque aplica todas las restricciones descritas y se desactiva manualmente, o automáticamente a las 4 horas para que no se te olvide que está activo. Te avisa por email cuando se activa y cuando se desactiva.</li>
</ul>
</li>
<li><strong>Pros:</strong> respuesta rápida dentro de WordPress sin necesidad de acceder al CDN o al hosting.</li>
<li><strong>Contras:</strong> siendo honesto, si el ataque es volumétrico (miles de peticiones por segundo), este modo no es el lugar donde deberías frenarlo porque cada petición ya ha llegado a PHP y ha consumido recursos del servidor. El modo bajo ataque del CDN es más efectivo porque frena el tráfico antes. Este modo es útil para ataques dirigidos o persistentes de bajo volumen que las capas anteriores no detectan, o como complemento si no tienes CDN.</li>
</ul>
<h2>¿Qué hago si ya me están atacando?</h2>
<p>Has montado todas las capas, todo está configurado, y <strong>de repente notas que tu web va lenta</strong>, ves <strong>cientos de intentos de login</strong> en el registro de actividad,<strong> o tu hosting te avisa de un consumo de recursos anormal</strong>.</p>
<p><strong>Estás bajo un ataque de fuerza bruta activo</strong>. Esto es lo que tienes que hacer, en orden, desde fuera hacia dentro.</p>
<h3>Activa el modo Under Attack de la CDN</h3>
<p>Es la <strong>respuesta más rápida y efectiva</strong>. En Cloudflare activa el modo Under Attack desde el escritorio de tu dominio (o desde la app del móvil si no estás frente al ordenador). En segundos todo el tráfico tiene que superar un desafío JavaScript y el volumen de peticiones a tu servidor cae drásticamente.</p>
<p>Sí, es incómodo para los visitantes legítimos, y sí, afecta al SEO temporalmente, pero <strong>ante un ataque activo priorizar la disponibilidad de tu web es lo fundamental</strong>. Un par de segundos de espera es infinitamente mejor que una web caída.</p>
<h3>Revisa los logs y bloquea desde el hosting</h3>
<p>Con la CDN protegiendo el perímetro, entra en el panel de tu hosting y revisa los registros de acceso.</p>
<p>Si ves IPs o rangos que generan mucho tráfico hacia tu login bloquéalas directamente, si el ataque viene mayoritariamente de un país concreto plantéate bloquear ese país temporalmente.</p>
<h3>Revisa el registro de actividad en WordPress</h3>
<p>Entra en el registro de actividad de tu plugin de seguridad y analiza:</p>
<ul>
<li>¿Están probando un usuario concreto? Si atacan al usuario «admin», elimínalo o cámbiale el nombre.</li>
<li>¿Vienen de muchas IPs o de pocas? Si son pocas bloqueo permanente, si son muchas, como de un botnet, mejor bloqueo geográfico.</li>
<li>¿Usan un <code>User-Agent</code> específico? Si hay patrón, bloquéalo en el cortafuegos del plugin o del CDN.</li>
<li>¿El ataque viene por <code>wp-login.php</code> o por <code>xmlrpc.php</code>? Si es por XML-RPC bloquéalo ya si no lo tenías ya desactivado.</li>
</ul>
<h3>Activa el modo bajo ataque desde WordPress si fuese necesario</h3>
<p>Si el ataque persiste a pesar del CDN y los bloqueos del hosting, o si es un ataque de bajo volumen pero muy dirigido, activa el modo bajo ataque de tu plugin de seguridad como <strong>refuerzo adicional</strong>.</p>
<h3>Reorganiza y optimiza tus defensas</h3>
<p>Cada ataque te da información para mejorar.</p>
<p>Crea nuevas reglas de seguridad en el CDN basándote en los patrones detectados, ajusta umbrales en el plugin de seguridad, bloquea rangos de IPs persistentes en el hosting.</p>
<blockquote><p>La seguridad es un proceso continuo, no una configuración que haces una vez.</p></blockquote>
<h2>Errores típicos que todos cometemos</h2>
<ul>
<li><strong>Confiar únicamente en el plugin de seguridad:</strong> un plugin dentro de WordPress es la última capa, no la primera. Si todo el peso de la seguridad recae en un plugin, tu servidor absorbe toda la carga de los ataques antes de que el plugin pueda actuar.</li>
<li><strong>No usar CDN/firewall externo:</strong> un CDN con plan gratuito te da protección a nivel de red que ningún plugin puede ofrecer. No hay excusa para no usarlo.</li>
<li><strong>Dejar XML-RPC activo sin necesidad:</strong> si no usas aplicaciones que lo requieran bloquéalo. Es un vector de ataque demasiado fácil de explotar.</li>
<li><strong>No monitorizar:</strong> si no tienes registro de actividad no sabes lo que pasa en tu web. Muchos ataques son silenciosos hasta que ya han causado daño.</li>
<li><strong>Bloquear países sin pensar:</strong> bloquear países puede ser efectivo, pero hazlo con criterio. Si bloqueas un país donde operan servicios que tu web necesita (pasarelas de pago, APIs de email, herramientas de monitorización) vas a crear problemas que no tienen nada que ver con la seguridad.</li>
<li><strong>Instalar varios plugins de seguridad:</strong> Wordfence + Security Optimizer + Vigilane no te hace más seguro, te hace más lento y con más probabilidades de conflictos. Elige uno, aprende a configurarlo y compleméntalo con las demás capas.</li>
<li><strong>No tener copias de seguridad:</strong> la seguridad puede fallar, y si todo falla y tu web está comprometida necesitas poder restaurar una copia limpia. Haz copias de seguridad periódicas y guardadas fuera de tu servidor.</li>
<li><strong>No actualizar:</strong> WordPress, plugins, temas y PHP. Todo actualizado, siempre. El caso reciente de <a href="https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/" target="_blank" rel="nofollow noopener">los 30 plugins comprados y troyanizados a través de Essential</a> demuestra que incluso plugins legítimos pueden convertirse en amenazas. Si un plugin no se actualiza desde hace más de un año búscate un sustituto.</li>
</ul>
<h2>El plan de batalla completo</h2>
<p><a href="https://ayudawp.com/?attachment_id=159096" rel="nofollow"><img fetchpriority="high" decoding="async" class="sombra alignnone wp-image-159096 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-por-capas-1200x1500.jpg" alt="" width="1200" height="1500" srcset="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-por-capas-1200x1500.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-por-capas-768x960.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-por-capas-1229x1536.jpg 1229w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-por-capas-1638x2048.jpg 1638w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-por-capas.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<p>Aquí tienes el <strong>resumen de toda la estrategia, de fuera hacia dentro</strong>, con las herramientas recomendadas en cada paso, configura cada punto en orden.</p>
<p>Lo que hay más arriba en cada tabla es lo primero que actúa y lo más eficiente, lo que está más abajo es la última línea de defensa.</p>
<h3>Perímetro: CDN</h3>
<table>
<thead>
<tr>
<th>Acción</th>
<th>Prioridad</th>
<th>Herramienta</th>
<th>Impacto en usuario</th>
</tr>
</thead>
<tbody>
<tr>
<td>Filtrar bots automatizados</td>
<td>Alta</td>
<td>Cloudflare → Modo Bot Fight</td>
<td>Ninguno</td>
</tr>
<tr>
<td>Challenge en wp-login.php</td>
<td>Alta</td>
<td>Cloudflare → Reglas de seguridad</td>
<td>Mínimo (2-3 segundos)</td>
</tr>
<tr>
<td>Bloquear xmlrpc.php</td>
<td>Alta</td>
<td>Cloudflare → Reglas de seguridad</td>
<td>Ninguno (si no lo usas)</td>
</tr>
<tr>
<td>Restringir acceso por países</td>
<td>Media</td>
<td>Cloudflare → Reglas de seguridad</td>
<td>Variable (depende de la acción)</td>
</tr>
<tr>
<td>SSL, HTTPS, Security Level</td>
<td>Media</td>
<td>Cloudflare → Seguridad / Rendimiento</td>
<td>Ninguno</td>
</tr>
<tr>
<td>Under Attack Mode</td>
<td>Emergencias</td>
<td>Cloudflare → Escritorio</td>
<td>Alto (todos pasan desafío)</td>
</tr>
</tbody>
</table>
<p><a href="https://ayudawp.com/?attachment_id=159093" rel="nofollow"><img decoding="async" class="sombra alignnone wp-image-159093 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-1-cdn-1200x1500.jpg" alt="" width="1200" height="1500" srcset="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-1-cdn-1200x1500.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-1-cdn-768x960.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-1-cdn-1229x1536.jpg 1229w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-1-cdn-1638x2048.jpg 1638w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-1-cdn.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<h3>Muralla: hosting</h3>
<table>
<thead>
<tr>
<th>Acción</th>
<th>Prioridad</th>
<th>Herramienta</th>
<th>Impacto en usuario</th>
</tr>
</thead>
<tbody>
<tr>
<td>Revisar logs de acceso</td>
<td>Alta (rutina)</td>
<td>Site Tools → Estadísticas</td>
<td>Ninguno</td>
</tr>
<tr>
<td>Bloquear IPs maliciosas</td>
<td>Media</td>
<td>Site Tools → Tráfico bloqueado</td>
<td>Ninguno (para atacantes)</td>
</tr>
<tr>
<td>Bloquear países a nivel servidor</td>
<td>Media-baja</td>
<td>Site Tools → Bloquear país</td>
<td>Alto (bloqueo total)</td>
</tr>
</tbody>
</table>
<p><a href="https://ayudawp.com/?attachment_id=159094" rel="nofollow"><img decoding="async" class="sombra alignnone wp-image-159094 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-2-hosting-1200x1500.jpg" alt="" width="1200" height="1500" srcset="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-2-hosting-1200x1500.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-2-hosting-768x960.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-2-hosting-1229x1536.jpg 1229w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-2-hosting-1638x2048.jpg 1638w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-2-hosting.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<h3>Guarnición: WordPress</h3>
<table>
<thead>
<tr>
<th>Acción</th>
<th>Prioridad</th>
<th>Herramienta</th>
<th>Impacto en usuario</th>
</tr>
</thead>
<tbody>
<tr>
<td>Limitar intentos de login</td>
<td>Alta</td>
<td>Limit Login Attempts Reloaded / Vigilante</td>
<td>Ninguno (para usuarios legítimos)</td>
</tr>
<tr>
<td>Ocultar URL de login</td>
<td>Media</td>
<td>WPS Hide Login / Vigilante</td>
<td>Hay que recordar la URL nueva</td>
</tr>
<tr>
<td>Activar 2FA</td>
<td>Alta</td>
<td>Two-Factor / Vigilante</td>
<td>Medio (un paso más en el login)</td>
</tr>
<tr>
<td>Contraseñas fuertes, no usar «admin»</td>
<td>Alta</td>
<td>Manual / Vigilante</td>
<td>Mínimo</td>
</tr>
<tr>
<td>Cortafuegos de aplicación</td>
<td>Media</td>
<td>Wordfence / Vigilante</td>
<td>Ninguno</td>
</tr>
<tr>
<td>Registro de actividad</td>
<td>Alta</td>
<td>WP Activity Log / Vigilante</td>
<td>Ninguno</td>
</tr>
<tr>
<td>Proteger REST API y cabeceras</td>
<td>Media</td>
<td>AIOS / Vigilante</td>
<td>Ninguno</td>
</tr>
<tr>
<td>Modo bajo ataque (aplicación)</td>
<td>Emergencias</td>
<td>Vigilante</td>
<td>Alto (desafío JS, límites estrictos)</td>
</tr>
</tbody>
</table>
<p><a href="https://ayudawp.com/?attachment_id=159095" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-159095 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-3-wordpress-1200x1700.jpg" alt="" width="1200" height="1700" srcset="https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-3-wordpress-1200x1700.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-3-wordpress-768x1088.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-3-wordpress-1084x1536.jpg 1084w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-3-wordpress-1446x2048.jpg 1446w, https://ayudawp.com/wp-content/uploads/2026/05/seguridad-ataques-fuerza-bruta-capa-3-wordpress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h3>Logística: mantenimiento</h3>
<table>
<thead>
<tr>
<th>Acción</th>
<th>Frecuencia</th>
</tr>
</thead>
<tbody>
<tr>
<td>Actualizar WordPress, plugins, temas y PHP</td>
<td>Semanal / Actualizaciones automáticas</td>
</tr>
<tr>
<td>Revisar logs del CDN y del hosting</td>
<td>Semanal / Cuando pase algo raro</td>
</tr>
<tr>
<td>Revisar registro de actividad en WordPress</td>
<td>Semanal</td>
</tr>
<tr>
<td>Comprobar copias de seguridad</td>
<td>Semanal</td>
</tr>
<tr>
<td>Eliminar plugins y temas que no uses</td>
<td>Mensual</td>
</tr>
<tr>
<td>Ajustar reglas y bloqueos según patrones nuevos</td>
<td>Cuando se detecten</td>
</tr>
</tbody>
</table>
<p>Todo lo que ves en esta guía lo puedes configurar en <strong>menos de una hora usando solo herramientas gratuitas</strong>.</p>
<p>No hace falta gastar dinero en licencias de plugins premium para tener una protección sólida contra ataques de fuerza bruta, lo que hace falta es <strong>entender dónde poner cada defensa y configurarla bien</strong>.</p>
<p>La seguridad no es cómoda, algunas de estas medidas añaden pasos al login, bloquean visitantes de ciertos países, o te obligan a recordar una URL personalizada, pero <strong>la alternativa a la seguridad es peor</strong>, porque lo que obtienes es una web caída, datos comprometidos u horas limpiando malware.</p>
<p>Cuando el coste de no protegerte es infinitamente mayor que la pequeña molestia de hacerlo, la decisión es fácil. Y recuerda que la seguridad no es algo que configuras una vez y te olvidas.</p>
<p>Revisa tus logs periódicamente, mantén todo actualizado, y ajusta tus defensas cuando detectes patrones nuevos. Cada ataque que analizas te deja mejor preparado para el siguiente.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/fuerza-bruta/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¡Anda leche, si también se puede optimizar la herramienta de salud del sitio?</title>
		<link>https://ayudawp.com/optimizar-salud-del-sitio/</link>
					<comments>https://ayudawp.com/optimizar-salud-del-sitio/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[WPO - Optimizar WordPress]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[WP-Cron]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159143</guid>

					<description><![CDATA[Hoy toca meterle mano y optimizar – también – la herramienta de salud del sitio de WordPress. Aquí te cuento cómo bajarle el volumen sin renunciar a su utilidad]]></description>
										<content:encoded><![CDATA[<p>La <a href="https://ayudawp.com/salud-del-sitio-wordpress/" target="_blank" rel="noopener">salud del sitio</a> es una de esas funcionalidades de WordPress que parece inofensiva hasta que miras lo que hace por dentro.</p>
<p>Por si no lo sabías, ejecuta un <strong>cron semanal con docenas de comprobaciones</strong>, pinta un <strong>widget en el escritorio con sus propias consultas</strong>, y cada vez que entras en <code>Herramientas → Salud del sitio</code> dispara una tanda de <strong>peticiones a api.wordpress.org</strong> y al propio servidor para <strong>verificar <code>loopback</code>, HTTPS y unas cuantas cosas más</strong>.</p>
<p>¿A que ni lo imaginabas?</p>
<p>En una web con hosting decente no vas a notarlo, pero en un hosting compartido justito o en un servidor que va al límite igual lo notas <strong>¿o no te has fijado lo que tarda en cargar el widget de salud del sitio del escritorio a veces o lo que tarda en cargar la herramienta?</strong></p>
<p>A veces puedes notar que la semana que le toca ejecutarse deja el admin lento durante unos segundos, que el widget del escritorio ralentiza la entrada al escritorio cada vez que accedes, y no te olvides de las consultas al servidor y la telemetría a WordPress.org.</p>
<p>Pues bien, <strong>hoy toca meterle mano y optimizar – también – la herramienta de salud del sitio de WordPress</strong>. Aquí te cuento cómo bajarle el volumen <strong>sin renunciar a su utilidad</strong>, que ni se te ocurra cuestionarla, es imprescindible.</p>
<h2>Qué hace Salud del sitio en la trastienda</h2>
<p>Hay <strong>tres cosas ejecutándose en momentos distintos</strong>:</p>
<ul>
<li>El cron <code>wp_site_health_scheduled_check</code>, que se lanza una vez por semana y ejecuta todos los tests (<code>loopback</code>, HTTPS, versión de PHP, versión de MySQL, comunicación con WordPress.org, etc.).</li>
<li>El widget estado de salud del sitio del escritorio, que consulta un <code>transient</code> y, si no existe, lanza las comprobaciones al vuelo.</li>
<li>Los tests asíncronos que se disparan vía API REST cuando abres la pantalla de salud del sitio.</li>
</ul>
<p>Los tres se pueden intervenir por separado, y lo ideal es tocar solo lo que esté molestando.</p>
<h2>Quitar el cron semanal</h2>
<p>Si quieres <strong>desactivar la comprobación programada</strong> añade esto a un <a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="noopener">mu-plugin</a>:</p>
<pre>/* Quitar la comprobación semanal de salud del sitio */
function ayudawp_remove_site_health_cron() {
    $timestamp = wp_next_scheduled( 'wp_site_health_scheduled_check' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wp_site_health_scheduled_check' );
    }
}
add_action( 'init', 'ayudawp_remove_site_health_cron' );</pre>
<p>Con eso el cron deja de reprogramarse y <strong>te ahorras la tanda semanal de comprobaciones</strong>, que incluye <strong>varias llamadas HTTP externas</strong>. Si algún día quieres volver, comenta las líneas o desinstala el snippet y WordPress lo reprograma solo.</p>
<p>Mientras tanto, por supuesto, la herramienta sigue funcionando, solo tienes que visitar su página para que funcione normalmente.</p>
<h2>Quitar el widget del escritorio</h2>
<p>El widget del escritorio es el que más lata da en el día a día porque lo ves cada vez que entras al admin, pero es que <strong>tarda siempre algo, a veces mucho</strong>. Para eliminarlo…</p>
<pre>/* Quitar el widget de escritorio de salud del sitio */
function ayudawp_remove_site_health_widget() {
    remove_meta_box( 'dashboard_site_health', 'dashboard', 'normal' );
}
add_action( 'wp_dashboard_setup', 'ayudawp_remove_site_health_widget' );</pre>
<p>Sigues pudiendo entrar a <code>Herramientas → Salud del sitio</code> cuando te haga falta, pero dejas de cargarlo al escritorio sin pedirlo.</p>
<h2>Quitar tests concretos que dan guerra</h2>
<p>A veces no quieres matar salud del sitio entera, solo los <strong>tests que marcan falsos positivos en tu hosting</strong>.</p>
<p>Los dos clásicos son la comprobación de <code>loopback</code> (que falla en entornos con <code>Basic Auth</code> o cortafuegos que bloquean peticiones internas) y la de HTTPS. Con el filtro <code>site_status_tests</code> los quitas uno a uno:</p>
<pre>/* Quitar tests específicos de salud del sitio */
function ayudawp_remove_site_health_tests( $tests ) {
    unset( $tests['async']['loopback_requests'] );
    unset( $tests['async']['https_status'] );
    unset( $tests['direct']['available_updates_disk_space'] );
    return $tests;
}
add_filter( 'site_status_tests', 'ayudawp_remove_site_health_tests' );</pre>
<p>Los tests <code>async</code> son los que <strong>lanzan llamadas HTTP</strong>, así que <strong>cada uno que quites baja el coste de abrir la pantalla de salud del sitio</strong>. Los <code>direct</code> se ejecutan en el mismo hilo.</p>
<h2>Cuándo merece la pena meterle mano</h2>
<p>Si tu hosting va sobrado no toques nada. Tener el chequeo activo es útil para detectar versiones de PHP obsoletas o problemas de correo antes de que alguien se queje.</p>
<p>En cambio, sí <strong>merece la pena intervenir</strong> cuando:</p>
<ul>
<li>El <strong>admin va lento</strong> y <a href="https://es.wordpress.org/plugins/query-monitor/" target="_blank" rel="nofollow noopener">Query Monitor</a> te señala el widget o los endpoints <code>site-health</code> como culpables.</li>
<li>Tienes <strong>avisos en rojo de <code>loopback</code> o HTTPS</strong> que son falsos positivos del hosting y no puedes arreglarlos.</li>
<li>Estás <strong>preparando un pico de tráfico</strong> y quieres desactivar todo el cron no crítico durante unos días.</li>
</ul>
<p>Y si esto te ha interesado, échale un ojo también a los trucos de optimización de admin que tengo publicados en la <a href="https://ayudawp.com/categoria/wordpress-performance-optimization/" target="_blank" rel="ugc noopener">categoría de WPO del blog</a>, que van en la misma línea de ganar rendimiento con snippets pequeños que hacen cosas grandes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/optimizar-salud-del-sitio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>El pedido HPOS «sincronizar al leer» se ha desactivado</title>
		<link>https://ayudawp.com/hpos-sincronizar-al-leer-desactivado/</link>
					<comments>https://ayudawp.com/hpos-sincronizar-al-leer-desactivado/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 28 Apr 2026 06:28:10 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159160</guid>

					<description><![CDATA[Si tienes una tienda con WooCommerce puede que hayas visto un aviso nuevo en el escritorio de WordPress con este texto:

El pedido HPOS 'sincronizar al leer' se ha desactivado]]></description>
										<content:encoded><![CDATA[<p>Si tienes una tienda con <strong>WooCommerce</strong> y estás en la <strong>versión 10.7 o superior</strong>, puede que hayas visto <strong>un aviso nuevo en el escritorio de WordPress</strong> con este texto:</p>
<blockquote><p>El pedido HPOS ‘sincronizar al leer’ se ha desactivado</p></blockquote>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-159161 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/pedido-hpos-desactivado-1200x133.jpg" alt="" width="1200" height="133" srcset="https://ayudawp.com/wp-content/uploads/2026/04/pedido-hpos-desactivado-1200x133.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/pedido-hpos-desactivado-768x85.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/pedido-hpos-desactivado-1536x170.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/pedido-hpos-desactivado.jpg 1856w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Si no sabes qué es eso ni si te afecta, tranqui, <strong>vamos a verlo con calma</strong>.</p>
<h2>¿Y esto de qué va, he roto algo?</h2>
<p>Si no tienes claro qué es HPOS te recomiendo que leas primero <a href="https://ayudawp.com/hpos-woocommerce/" target="_blank" rel="noopener ugc">la guía básica de HPOS</a> y <a href="https://ayudawp.com/rendimiento-hpos-woocommerce/" target="_blank" rel="noopener ugc">por qué deberías activarlo</a>.</p>
<p>El resumen rápido es que el HPOS hace que <strong>los pedidos de WooCommerce se almacenen en tablas propias</strong> en vez de usar las tablas <code>wp_posts</code> y <code>wp_postmeta</code> de WordPress, que es donde históricamente se ha metido todo.</p>
<p>Cuando activas <strong>HPOS y el modo de compatibilidad</strong> a la vez, <strong>WooCommerce mantiene los datos de pedidos sincronizados en ambos sitios</strong> (las tablas nuevas y las antiguas).</p>
<p>La idea es que si algún plugin o código personalizado todavía tira de las tablas antiguas, nada se rompa, lo cual, ante un sistema nuevo, es una muy buena idea.</p>
<p>Esa sincronización <strong>funciona en dos direcciones</strong>:</p>
<ul>
<li>La primera y más obvia es de <strong>HPOS hacia las tablas de entradas</strong>: Cada vez que un pedido se crea o se modifica a través de WooCommerce, los datos se copian también a <code>wp_posts</code> y <code>wp_postmeta</code>. Esa dirección sigue funcionando exactamente igual que antes.</li>
<li>La segunda es <strong>la que cambia</strong>, y es esta ya famosa «<strong>sincronización al leer</strong>» (<code>sync on read</code>): Este mecanismo funcionaba al revés. Si algo modificaba los datos del pedido directamente en la tabla de entradas, saltándose WooCommerce por completo (con un <code>wp_update_post</code>, un <code>update_post_meta</code> o una consulta SQL directa), WooCommerce comparaba las marcas de tiempo de ambos registros al leerlos. Si la copia en la tabla de entradas era más reciente, asumía que alguien había escrito ahí y actualizaba las tablas HPOS para que coincidieran.</li>
</ul>
<h2>¿Es que ha cambiado algo desde WooCommerce 10.7?</h2>
<p>Pues sí, desde la versión 10.7 (publicada el 14 de abril de 2026) <strong>esa sincronización al leer viene desactivada por defecto</strong>.</p>
<p>El motivo es que <strong>podía provocar problemas</strong>, porque si un dato antiguo en la tabla de entradas tenía una marca de tiempo rara, WooCommerce lo interpretaba como un cambio legítimo y <strong>sobreescribía los datos buenos de HPOS</strong>. Esto causaba cosas como <strong>reversiones de estado de pedido o datos antiguos machacando a los actuales</strong>.</p>
<p>Con el sistema de almacenamiento HPOS ya maduro y adoptado por la mayoría de tiendas, el equipo de WooCommerce ha decidido que <strong>mantener este mecanismo activo por defecto hace más mal que bien</strong>.</p>
<p>La tabla de entradas siempre estuvo pensada como copia de solo lectura, no como fuente de verdad alternativa.</p>
<h2>¿A quién le afecta esto?</h2>
<p>Aparte de a mi, que por eso te estoy escribiendo y compartiendo lo que me ha tocado aprender, <strong>en realidad a muy pocos</strong>.</p>
<p>Si en tu tienda <strong>usas solo plugins compatibles con HPOS</strong> (que a estas alturas son la gran mayoría) <strong>este cambio no te afecta en nada</strong>. La sincronización normal de HPOS hacia las tablas antiguas sigue funcionando.</p>
<p><strong>Te afecta si cumples estas dos condiciones a la vez</strong>:</p>
<ol>
<li>Tienes <strong>HPOS activo con el modo de compatibilidad</strong> habilitado.</li>
<li>Además <strong>usas código personalizado o algún plugin que escribe datos de pedido</strong> directamente en las tablas <code>wp_posts</code> o <code>wp_postmeta</code> (con funciones como <code>wp_update_post()</code>, <code>update_post_meta()</code> o consultas SQL directas) esperando que esos cambios se reflejen automáticamente en HPOS.</li>
</ol>
<p>Si no tienes claro si te afecta, <strong>hazte estas preguntas</strong>:</p>
<ul>
<li>¿Tienes funciones personalizadas en tu <code>functions.php</code> o en mu-plugins que modifiquen datos de pedidos con <code>update_post_meta()</code>?</li>
<li>¿Usas algún plugin de gestión de pedidos que no se haya actualizado en mucho tiempo?</li>
<li>¿Has escrito consultas SQL directas que toquen la tabla <code>wp_postmeta</code> para campos de pedidos?</li>
</ul>
<p>Si la respuesta a todo es «NO» puedes descartar el aviso y seguir con tu vida.</p>
<h2>¿Y qué hago si me afecta?</h2>
<p>Lo primero y más importante es <strong>actualizar tu código</strong> para que use la <a href="https://developer.woocommerce.com/docs/developing-using-woocommerce-crud-objects/" target="_blank" rel="nofollow noopener">capa CRUD de WooCommerce</a> en vez de escribir directamente en las tablas de entradas. Esto ya se recomienda desde WooCommerce 3.0 (que salió en 2017), así que si todavía no lo has hecho <strong>va siendo hora</strong>.</p>
<p>En la práctica eso significa <strong>sustituir cosas como</strong>:</p>
<pre>// Lo que ya no deberías usar
update_post_meta( $order_id, '_billing_email', 'nuevo@email.com' );
</pre>
<p><strong>Por el equivalente</strong> con los objetos de WooCommerce:</p>
<pre>// Lo correcto
$order = wc_get_order( $order_id );
$order-&gt;set_billing_email( 'nuevo@email.com' );
$order-&gt;save();
</pre>
<p>Si necesitas tiempo para hacer esos cambios <strong>puedes reactivar temporalmente la sincronización al leer con este filtro</strong>:</p>
<pre>// Reactivar sincronización al leer (solución temporal)
add_filter( 'woocommerce_hpos_enable_sync_on_read', '__return_true' );
</pre>
<p>Pero ojo, esto <strong>es un parche temporal</strong>. El equipo de WooCommerce ha avisado de que <strong>la sincronización al leer podría eliminarse por completo en una versión futura</strong>, así que no te acostumbres.</p>
<h2>Pues sí, debes activar HPOS sin compatibilidad en cuando puedas</h2>
<p>Si tu tienda lleva un tiempo con HPOS activo, todos tus plugins son compatibles y todo funciona bien, lo mejor que puedes hacer es desactivar el modo de compatibilidad directamente.</p>
<p>Ve a <strong>WooCommerce &gt; Ajustes &gt; Avanzado &gt; Características</strong> y desactívalo. Así WooCommerce deja de duplicar datos en las tablas antiguas y te ahorras el peso de esa sincronización en cada operación con pedidos.</p>
<p>Eso sí, antes de hacerlo asegúrate de tener una copia de seguridad y de haber comprobado que nada depende de las tablas clásicas.</p>
<p>Si te surge algún problema siempre puedes volver a activar el modo de compatibilidad, esperar a que se sincronice todo y cambiar de vuelta. <a href="https://ayudawp.com/dudas-hpos-woocommerce/" target="_blank" rel="noopener ugc">Aquí tienes la guía de dudas habituales sobre HPOS</a> donde explico el proceso con más detalle.</p>
<h2>¿Y las mejoras de rendimiento de WooCommerce?</h2>
<p><strong>Además de este cambio en la sincronización</strong>, la versión de WooCommerce 10.7 incorporó <strong>mejoras de rendimiento bastante interesantes para tiendas con HPOS activo</strong>.</p>
<p>La más llamativa es que <strong>las consultas de la API REST para pedidos han bajado de 271 a 132 por petición, un 51% menos</strong>, gracias a un sistema de precarga de caché que elimina las consultas N+1 durante la serialización.</p>
<p>El pago también reduce un 15% las consultas SQL totales. Si tienes <a href="https://ayudawp.com/rendimiento-hpos-woocommerce/" target="_blank" rel="noopener ugc">HPOS activado</a> y tu tienda mueve volumen, esta actualización se nota.</p>
<h2>Lo que tienes que hacer ahora</h2>
<p>Hay varias posibilidades, que te resumo:</p>
<ul>
<li>Si ves el aviso en tu escritorio y todo funciona bien, simplemente descártalo.</li>
<li>Si tienes dudas sobre si tu código personalizado escribe directamente en las tablas de entradas, revísalo.</li>
<li>Si llevas tiempo con HPOS sin problemas plantéate desactivar el modo de compatibilidad para sacarle todo el jugo al rendimiento.</li>
</ul>
<p>Para cualquier duda sobre compatibilidad de plugins con HPOS echa un vistazo a <a href="https://ayudawp.com/compatibilidad-plugins-hpos-woocommerce/" target="_blank" rel="noopener ugc">este artículo donde explico cómo declarar la compatibilidad</a> o me preguntas en la sección de comentarios, que para eso está.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/hpos-sincronizar-al-leer-desactivado/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¡Adiós WordPress, he creado mi web con IA en media hora!  … y lo que pasó después se le olvidó contarlo</title>
		<link>https://ayudawp.com/mantenimiento-web-vibe-coding/</link>
					<comments>https://ayudawp.com/mantenimiento-web-vibe-coding/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 27 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Inteligencia Artificial y WordPress]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Cursor AI]]></category>
		<category><![CDATA[Lovable]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158614</guid>

					<description><![CDATA[La narrativa del "Adiós WordPress, la IA me lo hace todo" funciona bien en un post viral. Es simple, es llamativa y tiene ese punto de rebeldía que genera likes.]]></description>
										<content:encoded><![CDATA[<p>Cada semana <strong>aparece un nuevo post viral</strong> en Reddit, en X o en algún foro de programación con el mismo guion, siempre es más o menos así:</p>
<ol>
<li>Alguien descubre Claude Code, Cursor, Lovable o cualquier herramienta de vibe coding, o eso dice.</li>
<li>Monta un sitio web en una tarde, lo despliega gratis en Vercel, o eso cuenta.</li>
<li>Y proclama con orgullo que nunca más va a tocar WordPress.</li>
</ol>
<p>Los comentarios se llenan de <strong>gente celebrándolo, los likes suben</strong>, la historia no puede ser más potente. Y, sí, tiene en parte razón, como todo en la vida.</p>
<p>Pero hay un detalle que estos posts nunca cuentan, y es <strong>qué pasa en la semana 2, en el mes 3</strong>, cuando llega la primera actualización de seguridad, cuando el cliente quiere cambiar un texto o cuando Google indexa el sitio y no encuentra ni estructura ni mapa del sitio.</p>
<p>Si has leído mi tutorial sobre <a href="https://ayudawp.com/vibe-coding-plugin-wordpress/" target="_blank" rel="noopener ugc">cómo crear un plugin WordPress sin saber programar</a> este artículo bien podría que sea de lectura obligatoria para no venirte demasiado arriba. Y es que <strong>una cosa es que <em>puedas</em> hacerlo y otra muy distinta es que <em>debas</em> hacerlo siempre, para todo y sin criterio</strong>.</p>
<p>Vamos a leer el cuento, sin dramas y con datos, si es que los hay.</p>
<h2>Adios WordPress</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158707 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/bye-bye-wordpress.jpg" alt="bye bye wordpress" width="1200" height="760" srcset="https://ayudawp.com/wp-content/uploads/2026/03/bye-bye-wordpress.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/bye-bye-wordpress-768x486.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>El post que más repercusión ha tenido últimamente es uno titulado «<strong>Bye bye WordPress</strong>» en <a href="https://www.reddit.com/r/ClaudeCode/comments/1rmfpzj/bye_bye_wordpress/" target="_blank" rel="nofollow noopener">el subreddit de Claude Code</a>, que acumuló más de 360 votos positivos. El autor contó cómo <strong>había migrado dos sitios de clientes a Astro y React, los había desplegado en Vercel sin coste y se había despedido de WordPress para siempre</strong>.</p>
<p>La historia es irresistible ¿verdad?, porque tomas una herramienta que todo el mundo conoce (WordPress), la sustituyes por algo nuevo y brillante (IA + framework moderno), y encima te ahorras el hosting (teóricamente).</p>
<p><strong>El David contra Goliat de toda la vida, aplicado al desarrollo web</strong>, si obviamos detalles tan poco relevantes (léase la ironía) como que WordPress es Open Source y un proyecto de comunidad (el auténtico David) y las alternativas son en su mayoría siempre aplicaciones cerradas y propietarias (el verdadero Goliat), pero bueno, molar mola.</p>
<p>Luego, si te paras a leer los comentarios con calma también ahí la cosa cambia:</p>
<ul>
<li>Propietarios de agencias que explican que sus clientes necesitan landing pages, formularios con lógica, campañas de email y seguimiento, <strong>funcionalidades que no vas a replicar con <a href="https://ayudawp.com/tag/vibe-coding/" target="_blank" rel="noopener ugc">vibe coding</a> en una tarde</strong>.</li>
<li>Desarrolladores experimentados avisando de <strong>los problemas que vienen después</strong>.</li>
<li>Gente que directamente dice que están <strong>usando la IA no para abandonar WordPress, sino para hacerlo mejor y más rápido</strong>.</li>
</ul>
<p><strong>Es un debate que merece la pena</strong>, pero con todos los datos sobre la mesa, no solo con la captura de pantalla del momento en que todo funciona.</p>
<h2>Pues sí, tienen parte de razón</h2>
<p>Seamos sinceros desde el principio, porque no voy a ponerme a defender WordPress ciegamente. Sí, lo he dicho yo.</p>
<p>Para un sitio estático de cinco páginas tipo tarjeta de visita, con un formulario de contacto y poco más, <strong>WordPress siempre fue como usar un cañón para cazar moscas para webs simples, pero no a partir de la IA generativa, siempre</strong>.</p>
<p>Un CMS completo con base de datos, sistema de usuarios, panel de administración, actualizaciones periódicas, para mostrar una dirección, un teléfono y cuatro fotos. Ahí <strong>el vibe coding, una plantilla HTML, el bloc de notas incluso</strong>, tienen todo el sentido del mundo.</p>
<p>Si lo único que necesitas es un sitio estático que no va a cambiar en meses, que no necesita que nadie sin conocimientos técnicos lo edite y que básicamente es un escaparate digital, usar la IA para generarlo y desplegarlo en un hosting gratuito es una opción perfectamente válida.</p>
<p>Ese caso de uso, que es totalmente lógico y que responde a montones de necesidades, probablemente representa un 15 o 20 por ciento del mercado de WordPress, y posiblemente no debería. Para el otro 80 por ciento la historia cambia, mucho.</p>
<h2>El día después de la euforia</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158757 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/meme-nena-coche.jpg" alt="meme nena coche" width="1200" height="674" srcset="https://ayudawp.com/wp-content/uploads/2026/03/meme-nena-coche.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/meme-nena-coche-768x431.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>El post viral típico termina en el momento perfecto, y es cuando todo funciona. La demo está bonita, el despliegue ha ido bien, la captura de pantalla queda espectacular.</p>
<p>Lo que nadie cuenta es lo que viene después, y es bastante menos viral.</p>
<h3>Esas puñeteras dependencias</h3>
<p>Tu flamante sitio generado con IA probablemente usa React, Astro, Next.js o algún framework de JavaScript moderno, y <strong>estos frameworks evolucionan a un ritmo brutal</strong>. Next.js saca versiones mayores cada pocos meses, y no son cambios cosméticos, son cambios que rompen cosas.</p>
<p><strong>Tu sitio que hoy funciona perfectamente puede dejar de compilar con la siguiente versión</strong> del framework, o del runtime de Node, o de cualquiera de las decenas de dependencias que tiene por debajo.</p>
<p>Con WordPress las actualizaciones siguen ciclos predecibles y las puedes hacer desde el admin sin tocar código, incluso de manera automática. Y si algo falla hay miles de guías y una comunidad enorme para ayudarte. Con tu sitio <em>vibe-coded</em> cuando algo se rompe estás tú a solas con tu prompt y tus ganas.</p>
<h3>¡Ahhh los cambios!</h3>
<p>Tu cliente, tu jefe o tú mismo quieres cambiar un texto del pie de página, y esto con WordPress abres el editor, lo cambias y listo. Con un sitio generado por IA tienes que abrir el código, encontrar el archivo correcto, modificarlo, volver a desplegar y rezar para que no se rompa nada por el camino. O volver a pedirle a la IA que lo cambie, que a veces lo clava y <strong>a veces te reorganiza medio proyecto, o te cambia la codificación de caracteres, a veces te hace perder horas para un simple cambio de un texto</strong>.</p>
<p>Para un desarrollador esto no es problema, para el dueño de una peluquería que quiere actualizar sus horarios de verano, es una putada y gorda.</p>
<h3>La factura de tokens ¿ah pero esto no era gratis?</h3>
<p>Generar el sitio inicial puede costarte unos pocos euros en tokens. pero <strong>cada vez que necesitas un cambio, una corrección, una nueva funcionalidad o un arreglo, vuelves a pasar por caja</strong>. Y el coste se acumula rápido, sobre todo si el proyecto crece.</p>
<p>Hay un caso que circula por la comunidad de desarrollo que lo ilustra a la perfección, el de un desarrollador que decidió crear un blog desde cero con IA, prescindiendo de cualquier CMS.</p>
<p>El resultado fueron <strong>cientos de miles de líneas de código generado, un gasto considerable en tokens y cero escalabilidad para algo que con WordPress tenía gratis</strong>, mantenido por una comunidad de millones de personas y con un ecosistema de plugins que cubre prácticamente cualquier necesidad.</p>
<h3>El espejismo del hosting <em>gratuito</em></h3>
<p>Uno de los argumentos estrella de los posts virales es «<strong>y encima lo despliego gratis en Vercel</strong>«. Suena genial, pero tiene trampa.</p>
<p>Los planes gratuitos de Vercel, Netlify y similares están diseñados para proyectos personales y prototipos. Tienen <strong>límites de ancho de banda, de proyectos mensuales y de funciones</strong>.</p>
<p>Cuando tu sitio empieza a recibir tráfico real esos límites se alcanzan rápido y entonces toca pasar por caja, y <strong>los planes de pago de estas plataformas no son precisamente baratos</strong> comparados con un hosting WordPress de calidad.</p>
<p>Además, con un hosting WordPress especializado no solo tienes espacio en un servidor, tienes copias de seguridad automáticas, certificados SSL gestionados, CDN integrado, entorno de staging para probar cambios, soporte técnico que entiende tu plataforma y optimizaciones específicas para WordPress. El hosting «gratuito» para tu sitio vibe-coded no te da nada de eso, es un servidor que sirve archivos estáticos, y encima estás solito como un pollito.</p>
<h2>La seguridad es esa cosa que no sabes que no sabes</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158758 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/vigilancia-por-satelite.jpg" alt="vigilancia por satelite" width="1152" height="922" srcset="https://ayudawp.com/wp-content/uploads/2026/03/vigilancia-por-satelite.jpg 1152w, https://ayudawp.com/wp-content/uploads/2026/03/vigilancia-por-satelite-768x615.jpg 768w" sizes="auto, (max-width: 1152px) 100vw, 1152px"></p>
<p>Este es el punto <strong>donde la cosa se pone seria de verdad</strong>, y donde menos se para a pensar la gente que <strong>celebra el vibe coding como sustituto de WordPress</strong>.</p>
<p>Los datos son claros y poco tranquilizadores, porque según todos los estudios que se están haciendo estas herramientas como <strong>ChatGPT y GitHub Copilot generan código correcto solo entre el 46 y el 65 por ciento de las veces</strong>. Y no hablamos solo de errores funcionales, hablamos de vulnerabilidades de seguridad, y para que te hagas una idea, <strong>un 40 por ciento de las consultas SQL generadas por IA son vulnerables</strong>.</p>
<p>No son cifras pequeñas, no es ver el vaso medio vacío, esos porcentajes cuando hablamos de seguridad son una burrada.</p>
<p>Cuando usas WordPress tienes a tu disposición 20 años de batallas de seguridad ganadas (y perdidas, y aprendidas). Tienes <strong>un equipo de seguridad dedicado que revisa el código del núcleo. plugins especializados en seguridad que se actualizan constantemente, hosting especializado con medidas de protección integradas</strong>, y tienes <strong>una comunidad entera que detecta, reporta y parchea vulnerabilidades a diario</strong>.</p>
<p>Cuando usas un sitio generado por vibe coding <strong>tienes lo que la IA decidió poner</strong>. Si no sabes de seguridad web (que es lo normal si estás usando vibe coding precisamente porque no sabes programar) no vas a detectar que tu formulario de contacto es vulnerable a XSS, que tu API no valida los datos de entrada o que tus rutas no tienen protección contra accesos no autorizados.</p>
<p>En WordPress todo el entorno es conocido, las vulnerabilidades se documentan, se parchean y se publican avisos, tu sitio <em>vibecodeado</em> tiene posibles vulnerabilidades que ni tú conoces.</p>
<p>Y sí, es verdad que WordPress es un objetivo frecuente de ataques precisamente porque alimenta al 40% de Internet, pero eso también significa que cualquier vulnerabilidad se detecta rápido y se parchea más rápido todavía, es una plataforma que ha aprendido de cada golpe. <strong>Tu sitio generado por IA no ha recibido ningún golpe todavía, y cuando lo reciba, no tiene ni comunidad ni equipo de seguridad detrás</strong> para responder.</p>
<p>Piensa que si mañana se descubre una vulnerabilidad en el formulario de contacto de tu sitio WordPress, lo más probable es que el plugin que uses publique una actualización en horas y tú la apliques con un clic. <strong>Si la vulnerabilidad está en tu formulario generado por IA, primero tienes que enterarte de que existe</strong> (¿cómo?), luego entender dónde está el problema (¿en qué archivo, en qué función?), después generar un parche con la IA que no rompa nada más, y finalmente desplegarlo. Todo eso asumiendo que te enteras antes de que alguien la explote.</p>
<p>¿Estoy diciendo que no se puede generar una web o código seguro con IA?, para nada, si sabes lo que hacer y cómo hacerlo puedes generar algo aseguro. A lo que me refiero es a que <strong>estás a solas ante el peligro</strong>, y mucho tienes que saber de seguridad para que no se te pase ninguna comprobación importante, y saber cómo revisarla.</p>
<h2>Código más viejo que el hilo negro</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158761 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/meme-di-caprio-oscars-actualizar.jpg" alt="meme di caprio oscars actualizar" width="666" height="500"></p>
<p>Hay una frase que resume esto perfectamente y que viene del blog de Val Town:</p>
<blockquote><p>El vibe coding genera código anticuado a la velocidad a la que la IA lo escupe</p></blockquote>
<p>Y, es curioso, pero es que ya existe incluso un nombre para este fenómeno entre los desarrolladores profesionales: «<strong>vibe coding rescue</strong>«, que es básicamente rescatar proyectos generados por IA que funcionan por fuera pero que por dentro son un desastre.</p>
<p>El problema de fondo es que <strong>la programación no consiste en generar líneas de código</strong>. Programar consiste en entender cómo funciona lo que has construido, en saber por qué una decisión técnica es mejor que otra, en poder modificar el sistema cuando cambian los requisitos sin que todo se venga abajo.</p>
<p>Cuando le pides a una IA que te genere un sitio web completo, obtienes algo que funciona, pero no entiendes cómo funciona. El día que necesitas cambiarlo (que siempre llega), te encuentras con <strong>código que ni tú ni nadie puede mantener de forma razonable</strong>.</p>
<p>Es como mirar el motor de un coche sin saber de mecánica. Ves las piezas encajadas, pero no sabes cómo se conectan ni por dónde empezar si necesitas cambiar o arreglar algo.</p>
<p>El comentario más votado en aquel famoso post de Reddit donde alguien proclamaba su despedida de WordPress lo decía bien claro, con más votos incluso que el propio post original, es uno que recordaba que con una solución a medida eres tú el responsable de mantener ese código para siempre. Y «para siempre» es mucho tiempo cuando no entiendes lo que tienes entre manos.</p>
<p>Lo peor es que este problema se multiplica con el tiempo. Cada vez que le pides a la IA que añada algo nuevo o que arregle algo, el código crece, se complica y se vuelve más difícil de entender. Y como la IA no tiene una visión global de la arquitectura (trabaja con lo que le metes en el contexto de cada sesión), <strong>las decisiones de diseño pueden ser inconsistentes entre una sesión y otra</strong>. El resultado es un proyecto que funciona a base de parches superpuestos, donde cada cambio tiene el potencial de romper algo que funcionaba antes.</p>
<p>Con WordPress, incluso si usas código personalizado o plugins a medida, trabajas dentro de <strong>una arquitectura conocida y documentada</strong>. Los hooks, los filtros, la estructura de la base de datos, las convenciones de nombres, todo sigue un patrón predecible que cualquier desarrollador de WordPress puede entender. Si mañana necesitas contratar a alguien para que mantenga tu sitio, lo puede hacer.</p>
<p>Si mañana necesitas que alguien mantenga tu sitio generado por vibe coding, <strong>buena suerte explicándole donde va cada pieza y para qué sirve</strong>.</p>
<h2>Los bebés crecen, cagoendiez</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158762 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/nene-enfadado-meme.jpg" alt="nene enfadado meme" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/03/nene-enfadado-meme.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/nene-enfadado-meme-768x432.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Hasta aquí todo suena a problemas teóricos, a <strong>cosas que podrían pasar, pero es que pasan, y pasan rápido</strong>. Porque los proyectos web no se quedan quietos, incluso tú, sin que nadie te lo pida, empiezas a querer más.</p>
<h3>Necesitas un blog</h3>
<p>Tu sitio estático de cinco páginas está genial, pero ahora quieres publicar artículos para atraer visitas. Necesitas un sistema de contenidos con categorías, etiquetas, paginación, búsqueda interna, feed RSS, URLs amigables, metadatos para SEO, esas pequeñas cosas que damos por hechas.</p>
<p>En WordPress instalas un tema y empiezas a escribir, con vibe coding, acabas de abrir <strong>un proyecto de semanas para algo que lleva resuelto desde 2003</strong>.</p>
<h3>Quieres vender algo</h3>
<p>Puede ser un producto digital, un servicio, unas camisetas, pues <strong>necesitas pasarelas de pago, gestión de inventario, gastos de envío, impuestos por zona, facturas, devoluciones, emails transaccionales, página de mi cuenta, la leeecheee</strong>.</p>
<p>WooCommerce te da todo eso instalando un plugin y configurándolo. Generarlo desde cero <strong>con IA es un proyecto de meses con un nivel de complejidad enorme, y con implicaciones legales y de seguridad</strong> que no te puedes permitirte ignorar.</p>
<h3>Quieres posicionar en Google</h3>
<p>Has creado tu sitio pero nadie lo encuentra. Pues hablamos de <strong>SEO técnico</strong>, y eso supone estructura de encabezados, datos estructurados, mapa del sitio XML, robots.txt, canonical URLs, velocidad de carga, Core Web Vitals, Open Graph para redes sociales, etc, etc, etc.</p>
<p>WordPress tiene plugins que gestionan todo esto con unos clics. Tu sitio generado por IA lo más seguro es que ni siquiera tenga un mapa del sitio salvo que lo generes aparte, y te acuerdes de actualizarlo.</p>
<h3>Tienes que cumplir con el RGPD</h3>
<p>En cuanto <strong>tu sitio recoge datos</strong> (y un simple formulario de contacto ya lo hace) necesitas banner de cookies configurable, política de privacidad, gestión del consentimiento, derecho de acceso y supresión de datos, registro de consentimientos y demás.</p>
<p>En WordPress hay plugins especializados que se actualizan cada vez que cambia la normativa. Con vibe coding, <strong>cada requisito legal es código que tienes que generar, revisar, mantener y actualizar tú</strong>.</p>
<h3>Necesitas varios idiomas</h3>
<p>Tu proyecto crece y quieres llegar a más mercados, y toca traducir contenidos, gestionar las relaciones entre idiomas, los selectores de idioma, las URLs por idioma, <a href="https://ayudawp.com/hreflang-en-wordpress/" target="_blank" rel="noopener ugc">el puñetero<code>hreflang</code></a>.</p>
<p>En WordPress hay plugins consolidados que lo resuelven de manera totalmente profesional y con actualizaciones frecuentes, pero generarlo desde cero es <strong>una pesadilla técnica que multiplica la complejidad de todo el proyecto</strong>.</p>
<h3>Accesibilidad</h3>
<p>Desde junio de 2025 la Ley Europea de Accesibilidad obliga a muchos negocios digitales a cumplir con <strong>requisitos de accesibilidad web</strong>. WordPress tiene un equipo dedicado a accesibilidad, temas que cumplen WCAG y plugins específicos para auditar y mejorar la accesibilidad de tu sitio.</p>
<p>Con vibe coding la accesibilidad depende enteramente de lo que la IA haya decidido implementar, que en la mayoría de los casos no incluye ni etiquetas ARIA adecuadas, ni contraste suficiente, ni navegación por teclado correcta.</p>
<p>Cada una de estas necesidades, por separado, ya es un buen motivo para replantearte si tu sitio generado por IA da la talla. Juntas son una lista de tareas pendientes que crece más rápido de lo que la IA puede resolverlas.</p>
<h2>La gente pide cosas…</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158760 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/meme-the-office-apreton-manos.jpg" alt="meme the office apreton manos" width="1197" height="1094" srcset="https://ayudawp.com/wp-content/uploads/2026/03/meme-the-office-apreton-manos.jpg 1197w, https://ayudawp.com/wp-content/uploads/2026/03/meme-the-office-apreton-manos-768x702.jpg 768w" sizes="auto, (max-width: 1197px) 100vw, 1197px"></p>
<p>Aquí viene la segunda derivada, y la más peligrosa. Porque hay un paso que mucha gente da sin pensarlo demasiado, me refiero a que tu sitio generado con IA te ha quedado bien, funciona, has aprendido un montón en el proceso, y decides que puedes ofrecer esto como servicio. Hacer webs para otros con vibe coding, sin WordPress, a un precio competitivo y con la velocidad de la IA como argumento de venta.</p>
<p>Suena bien en la teoría, pero en la práctica <strong>los problemas que ya tenías con tu propio proyecto se multiplican por cada cliente</strong> que añades.</p>
<h3>El cliente quiere editar su propia web</h3>
<p>Y no sabe de código, ni quiere saber, ni tiene por qué saber, pero <strong>se empeña en querer cambiar</strong> el horario de verano de su negocio, subir una foto nueva, publicar una oferta. Con WordPress le das acceso al escritorio, le enseñas dónde está el editor en diez minutos y se apaña solo.</p>
<p>Con tu sitio vibe-coded, cada cambio de texto es una llamada que te hacen a ti, o una sesión con la IA que pagas tú, o un despliegue que gestionas tú. Multiplica eso por cinco clientes y ya tienes un <strong>trabajo a tiempo completo solo en cambios menores</strong>.</p>
<h3>Se cae a las tres de la mañana</h3>
<p>El sitio de un cliente deja de funcionar un viernes por la noche, cosas que pasan.</p>
<p>Con WordPress en un hosting especializado, probablemente tiene copias de seguridad automáticas diarias que puedes restaurar con un par de clics, además de un equipo de soporte disponible 24/7 que conoce la plataforma.</p>
<p>Con un sitio vibe-coded desplegado en Vercel o Netlify, tienes los logs del servidor (si sabes dónde buscarlos), la documentación del framework (si sabes cuál es el problema) y tu herramienta de IA (si tienes saldo de tokens). A las tres de la mañana, con el teléfono del cliente echando humo.<strong> ¡Nahhh, cosas menores! ¿o no?</strong></p>
<h3>Otro desarrollador tiene que tomar el relevo</h3>
<p>Tú te vas de vacaciones, cambias de trabajo o simplemente dejas de trabajar con ese cliente y alguien tiene que encargarse del sitio. Porque<strong> te puedes tomar unos días ¿no?</strong></p>
<p>Con WordPress, le pasas los accesos y en media hora está orientado, sabe dónde está todo, conoce la estructura, entiende los plugins.</p>
<p>Con un sitio generado por IA, le estás pasando <strong>miles de líneas de código sin documentar, con una arquitectura que ni tú mismo elegiste</strong> conscientemente, y sin ninguna garantía de que las decisiones técnicas sean coherentes entre sí. Ese desarrollador va a tardar más en entender lo que hay que en crearlo de nuevo.</p>
<h3>Varios clientes, cero estandarización</h3>
<p>Con WordPress cada proyecto nuevo parte de la misma base, tienes el mismo CMS, las mismas convenciones de todo, el mismo panel de administración. Puedes crear procesos, reutilizar configuraciones, formar a un equipo.</p>
<p><strong>Con vibe coding cada proyecto es un mundo aparte</strong>. La IA puede tomar decisiones diferentes cada vez, usar estructuras distintas, nombrar las cosas de formas incompatibles, tiene esas cosas, por mucho que te empeñes en darle instrucciones es, por diseño, inconsistente, digámoslo de otro modo, por ponernos poéticos, digamos que <strong>la IA «vive el momento»</strong>.</p>
<p>Gestionar cinco proyectos vibe-coded a la vez es gestionar cinco bases de código completamente diferentes sin ningún denominador común.</p>
<p>Ofrecer sitios generados por IA como servicio profesional sin una plataforma detrás que unifique la gestión, el mantenimiento y la seguridad <strong>es asumir una responsabilidad enorme con herramientas que no están pensadas para eso</strong>.</p>
<h2>Lo que WordPress ya te da resuelto (y que no valoras hasta que lo pierdes)</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-156914" src="https://ayudawp.com/wp-content/uploads/2025/11/wordpress-potencia-inteligencia-artificial.jpg" alt="wordpress potencia inteligencia artificial" width="1200" height="673" srcset="https://ayudawp.com/wp-content/uploads/2025/11/wordpress-potencia-inteligencia-artificial.jpg 1200w, https://ayudawp.com/wp-content/uploads/2025/11/wordpress-potencia-inteligencia-artificial-768x431.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Cuando llevas años usando WordPress es fácil dar por sentado todo lo que el ecosistema te ofrece. Pero cuando intentas replicarlo desde cero con vibe coding, te das cuenta de la magnitud de lo que tienes gratis:</p>
<ul>
<li><strong>Sistema de gestión de contenidos completo</strong>, con editor visual, revisiones, borradores programados, papelera y gestión de medios. Algo que parece sencillo hasta que intentas construirlo.</li>
<li><strong>Sistema de usuarios y permisos</strong> con roles diferenciados (administrador, editor, autor, colaborador, suscriptor) y la posibilidad de crear roles personalizados.</li>
<li><strong>Ecosistema de más de 60.000 plugins</strong> que cubren desde SEO hasta comercio electrónico, pasando por seguridad, rendimiento, formularios, copias de seguridad, analítica y prácticamente cualquier necesidad que se te ocurra.</li>
<li><strong>Miles de temas</strong> profesionales, responsivos, accesibles y optimizados para SEO, muchos de ellos gratuitos.</li>
<li><strong>Hosting especializado</strong> con configuraciones optimizadas, copias de seguridad automáticas, certificados SSL, CDN integrado y soporte técnico que entiende WordPress.</li>
<li><strong>Comunidad global</strong> de desarrolladores, diseñadores y usuarios que generan documentación, tutoriales, foros de soporte, meetups y WordCamps en todo el mundo.</li>
<li><strong>Actualizaciones automáticas</strong> de seguridad del núcleo, con un equipo dedicado que responde ante vulnerabilidades.</li>
<li><strong>Internacionalización nativa</strong>, preparado para ser traducido a cualquier idioma con herramientas estándar.</li>
<li><strong>API REST completa</strong> que permite usar WordPress como backend para aplicaciones modernas, incluidas las headless.</li>
<li><strong>Accesibilidad incorporada</strong>, con un equipo específico dentro del proyecto WordPress que trabaja para que el CMS cumpla con las directrices WCAG.</li>
</ul>
<p>Todo esto no apareció de la noche a la mañana. Son 20 años de desarrollo, de prueba y error, de millones de sitios en producción exponiendo problemas y generando soluciones. <strong>Pretender replicarlo con unos cuantos prompts no es ambicioso, es no entender la magnitud del problema</strong>.</p>
<h2>Software libre frente a dependencia de plataformas</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158764 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/codigo-open-source.jpg" alt="codigo open source" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/03/codigo-open-source.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/codigo-open-source-768x432.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Hay un argumento de fondo que casi nunca aparece en los posts virales de «<strong>¡Adiós WordPress!</strong>«, y que para mí es de los más importantes. Me refiero a <strong>la cuestión de la libertad</strong>.</p>
<p><strong>WordPress es software libre, licenciado bajo GPL</strong>. Eso significa que el código es tuyo, que puedes modificarlo, redistribuirlo, usarlo para lo que quieras sin pedir permiso a nadie. No dependes de una empresa que pueda cambiar las condiciones, subir los precios o cerrar el servicio mañana.</p>
<p>Si desaparece Automattic WordPress sigue existiendo, si desaparece tu empresa de hosting te llevas tu sitio a otro servidor y listo. <strong>Tu contenido, tu código, tus datos son tuyos de verdad</strong>.</p>
<p>Ahora piensa en el escenario del vibe coding… Tu sitio depende de una herramienta de IA propiedad de una empresa privada.</p>
<p>Si mañana Anthropic cambia los precios de Claude, si OpenAI modifica las condiciones de uso de su API, si Cursor AI cambia su modelo de suscripción o si Vercel decide que el plan gratuito ya no le sale rentable, <strong>tu método y herramientas de trabajo se van a la mierda</strong>.</p>
<p>No tienes control sobre ninguna de esas piezas. Estás construyendo sobre un terreno alquilado, y <strong>el propietario puede cambiar las reglas cuando quiera</strong>.</p>
<p>Y no es solo una cuestión práctica, es también una cuestión de principios. WordPress nació del software libre y sigue siéndolo, la licencia GPL garantiza que las libertades que tienes hoy las van a tener las generaciones que vengan después.</p>
<p>Que cualquier persona, en cualquier parte del mundo, pueda crear su presencia en Internet sin depender de la buena voluntad de una corporación, que el conocimiento acumulado durante dos décadas siga siendo accesible y compartido.</p>
<p><strong>El vibe coding, por muy democratizador que parezca, genera exactamente la dependencia opuesta</strong>.</p>
<p><strong>Dependes de modelos de IA propietarios</strong>, de plataformas de despliegue con planes de <strong>precios que cambian cada trimestre</strong>, de frameworks mantenidos por empresas que priorizan su modelo de negocio sobre tu estabilidad.</p>
<p>Si la IA que usas deja de estar disponible o cambia su comportamiento entre versiones (algo que pasa constantemente), tu capacidad de mantener tu propio sitio desaparece con ella.</p>
<blockquote><p>Con WordPress eres dueño de tu web, con vibe coding eres inquilino de un ecosistema de herramientas IA que no controlas.</p></blockquote>
<h2>Solo contra el mundo (o con una comunidad detrás)</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158763 size-full" src="https://ayudawp.com/wp-content/uploads/2026/03/comunidad-wordpress.jpg" alt="comunidad wordpress" width="1200" height="818" srcset="https://ayudawp.com/wp-content/uploads/2026/03/comunidad-wordpress.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/comunidad-wordpress-768x524.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Hay otro aspecto que se pasa por alto en casi todas las comparativas técnicas, y es el factor humano.</p>
<p><strong>Cuando usas WordPress</strong> y te atascas puedes buscar en los foros de soporte de WordPress.org, preguntar en grupos de Facebook o Telegram, asistir a un meetup local o contratar a cualquiera de los miles de desarrolladores especializados que hay en el mercado.</p>
<p>Con un sitio generado por vibe coding y te atascas, puedes <strong>volver a preguntarle a la IA</strong>, que puede o no darte la respuesta correcta. O buscar en foros genéricos de programación, donde tu problema específico con tu código específico generado por tu prompt específico probablemente no lo ha tenido nadie antes.</p>
<p>Esto no es cosa de broma ni un problema menor, ni de lejos.</p>
<p><strong>La comunidad de WordPress es una de las más grandes del mundo</strong> del software, hay WordCamps en decenas de países, meetups mensuales en cientos de ciudades, canales de Slack activos, blogs especializados, podcasts, newsletters y una cantidad enorme de conocimiento compartido gratuito. Si tienes un problema con WordPress, es casi seguro que alguien lo ha tenido antes y ha publicado la solución.</p>
<p><strong>Con un sitio generado por vibe coding estás por tu cuenta</strong>. Tu código es único, tu arquitectura es única, tus bugs son únicos, y la solución a cada problema pasa por volver a sentarte delante de la IA, explicarle el contexto desde cero y esperar que esta vez acierte.</p>
<h2>El camino es WordPress + IA, no WordPress o IA</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-156760" src="https://ayudawp.com/wp-content/uploads/2025/12/ia-conectada-wordpress.jpg" alt="ia conectada wordpress" width="1200" height="800" srcset="https://ayudawp.com/wp-content/uploads/2025/12/ia-conectada-wordpress.jpg 1200w, https://ayudawp.com/wp-content/uploads/2025/12/ia-conectada-wordpress-768x512.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Aquí es donde está la verdadera oportunidad, y lo que aún me sorprende que haya gente que no lo entienda.</p>
<p>La IA no es el sustituto de WordPress, es su mejor complemento. Los que están sacando más partido de todo esto no son los que abandonan WordPress por el vibe coding, sino los que <strong>usan la IA para hacer WordPress mejor, más rápido y más potente</strong>.</p>
<p>¿Qué te aporta?</p>
<ul>
<li><strong>Desarrollo con turbo:</strong> Usar Claude Code, Cursor o herramientas similares para crear plugins a medida, personalizar temas, generar bloques del editor o automatizar tareas repetitivas. En vez de generar un sitio entero desde cero creas las piezas que necesitas dentro de un ecosistema que ya funciona.</li>
<li><strong>Mantenimiento asistido:</strong> Usar la IA para revisar código, detectar cuellos de botella de rendimiento, analizar logs de seguridad o generar consultas SQL optimizadas. Precisamente lo que cuento en el <a href="https://ayudawp.com/vibe-agentic-coding/" target="_blank" rel="noopener ugc">tutorial de vibe coding y agentic coding para WordPress</a>.</li>
<li><strong>Contenido potenciado:</strong> Usar la IA para generar borradores, optimizar textos para SEO, crear descripciones de producto o traducir contenidos. Todo dentro de WordPress, donde tienes el editor, la estructura y las herramientas que ya conoces.</li>
<li><strong>Sitios más limpios:</strong> Cuando la IA te permite crear la funcionalidad exacta que necesitas, dejas de depender de plugins multifunción hinchados que cargan el sitio de código innecesario. El resultado son sitios WordPress que rinden como si fueran a medida, porque en cierto modo lo son.</li>
</ul>
<p><strong>WordPress está integrando la IA a todos los niveles</strong>. Desde el <a href="https://ayudawp.com/tag/abilities-api/" target="_blank" rel="noopener ugc">Abilities API</a> hasta los <a href="https://ayudawp.com/tag/ai-building-blocks/" target="_blank" rel="noopener ugc">AI Building Blocks</a>, pasando por herramientas como <a href="https://ayudawp.com/tag/telex/" target="_blank" rel="noopener ugc">Telex</a>, que permite generar código WordPress con lenguaje natural. Si te interesa saber todo <strong>lo que igual te estás perdiendo</strong>, lo explico a fondo en mi artículo sobre <a href="https://ayudawp.com/dudas-web-wordpress-inteligencia-artificial/" target="_blank" rel="noopener ugc">si merece la pena hacer una web con WordPress en tiempos de inteligencia artificial</a>.</p>
<p>Los desarrolladores que están sacando mejores resultados no son los que se fueron de WordPress. Son los que se quedaron y <strong>ahora tienen superpoderes</strong>.</p>
<h2>¿Para quién sí tiene sentido prescindir de WordPress?</h2>
<p>Sería deshonesto e incluso injusto no reconocer que hay <strong>casos donde el vibe coding sin WordPress es una opción lógica</strong>:</p>
<ul>
<li><strong>Proyectos personales y experimentos:</strong> Si quieres cacharrear, aprender cómo funciona algo o montar un proyecto para ti sin intención de mantenerlo a largo plazo, adelante. El vibe coding es perfecto para prototipos y proyectos desechables.</li>
<li><strong>Landing pages con fecha de caducidad:</strong> Una página de captación para un evento, una campaña concreta o un lanzamiento que va a durar unas semanas. No necesita mantenimiento a largo plazo, no necesita CMS, no necesita ecosistema.</li>
<li><strong>Sitios estáticos que nunca van a crecer:</strong> Si realmente sabes que tu sitio va a ser cinco páginas para siempre, sin blog, sin tienda, sin formularios complejos, sin necesidad de que nadie técnicamente inexperto lo edite, puede tener sentido.</li>
<li><strong>Conceptos y prototipos:</strong> Quieres validar una idea rápido y barato antes de invertir en un desarrollo serio. El vibe coding te da velocidad, y si la idea funciona, ya construirás la versión definitiva con la tecnología adecuada.</li>
</ul>
<p>La clave es tener claro en cuál de estos puntos estás, si necesitas algo así. El problema surge cuando alguien monta un prototipo, funciona, y asume que puede escalar a producción sin cambiar de enfoque.</p>
<h2>Las <em>tablas de la ley</em></h2>
<p>Para que quede claro de un vistazo, aquí tienes la comparativa entre lo que obtienes con cada enfoque:</p>
<table>
<thead>
<tr>
<th>Aspecto</th>
<th>Vibe coding (sin CMS)</th>
<th>WordPress + IA</th>
</tr>
</thead>
<tbody>
<tr>
<td>Velocidad inicial</td>
<td>Muy rápida</td>
<td>Rápida (con experiencia o plantilla)</td>
</tr>
<tr>
<td>Mantenimiento a largo plazo</td>
<td>Dependes de ti (o de la IA)</td>
<td>Comunidad, hosting y herramientas especializadas</td>
</tr>
<tr>
<td>Seguridad</td>
<td>Lo que la IA genere y tú no detectes</td>
<td>Equipo de seguridad, plugins, hosting protegido</td>
</tr>
<tr>
<td>Edición por no técnicos</td>
<td>Prácticamente imposible</td>
<td>Editor visual, roles, interfaz amigable</td>
</tr>
<tr>
<td>SEO técnico</td>
<td>Lo que tú implementes manualmente</td>
<td>Plugins especializados y estructura nativa</td>
</tr>
<tr>
<td>Comercio electrónico</td>
<td>Proyecto de meses</td>
<td>WooCommerce listo en horas</td>
</tr>
<tr>
<td>Escalabilidad</td>
<td>Muy limitada sin reescribir</td>
<td>Miles de plugins y desarrolladores disponibles</td>
</tr>
<tr>
<td>Coste de cambios futuros</td>
<td>Impredecible (tokens + tiempo)</td>
<td>Predecible y generalmente bajo</td>
</tr>
<tr>
<td>Cumplimiento legal (RGPD)</td>
<td>Todo manual</td>
<td>Plugins actualizados con la normativa</td>
</tr>
<tr>
<td>Soporte y documentación</td>
<td>Stack Overflow y tu IA</td>
<td>Comunidad global, foros, meetups, WordCamps</td>
</tr>
<tr>
<td>Actualizaciones de seguridad</td>
<td>Las que tú hagas (si te acuerdas)</td>
<td>Automáticas en el núcleo</td>
</tr>
<tr>
<td>Accesibilidad web</td>
<td>Depende del código generado</td>
<td>Equipo dedicado y directrices WCAG</td>
</tr>
</tbody>
</table>
<h2>Consejos finales: si aun así decides prescindir de WordPress</h2>
<p>No voy a decirte que no lo hagas. Cada proyecto tiene sus circunstancias y no existe una herramienta universal. Pero si decides tirar por el camino del vibe coding para un proyecto real, al menos ten en cuenta estas cosas:</p>
<ol>
<li><strong>Revisa siempre el código generado:</strong> Nunca, jamás, pongas en producción código que no has revisado. La IA genera código que «funciona» pero eso no significa que sea seguro, eficiente o mantenible a largo plazo.</li>
<li><strong>Pide siempre validación de seguridad:</strong> Incluye en tus prompts instrucciones explícitas sobre saneado de datos, escapado de salida, validación de entradas y protección contra los ataques más comunes. Y luego revísalo igualmente. Yo tengo publicadas mis SKILLs, por si no sabes por dónde empezar.</li>
<li><strong>Documenta todo:</strong> Si no entiendes el código al menos que quede documentado qué hace cada parte. Tu yo del futuro (o quien herede el proyecto) te lo agradecerá. Pídele a la IA que te documente cada paso.</li>
<li><strong>Ten un plan de mantenimiento:</strong> Antes de lanzar, piensa en quién va a actualizar las dependencias, quién va a corregir los bugs, quién va a aplicar los parches de seguridad. Si la respuesta es «nadie» o «ya veré», estás a un incidente de quedarte con un sitio comprometido.</li>
<li><strong>No confundas prototipo con producto:</strong> Si tu sitio <em>vibe-coded</em> funciona y quieres escalar plantéate seriamente migrarlo a una plataforma profesional. Un prototipo que «va tirando» en producción es una bomba de relojería.</li>
<li><strong>Calcula el coste de verdad:</strong> Suma los tokens, las horas de depuración, las vueltas con la IA para conseguir lo que quieres, el tiempo de mantenimiento futuro. Compáralo con el coste de un hosting WordPress de calidad y un tema profesional. Puede que te lleves una sorpresa.</li>
</ol>
<h2>El mejor momento para usar WordPress con IA es ya</h2>
<p>La narrativa del «<strong>Adiós WordPress, la IA me lo hace todo</strong>» funciona bien en un post viral. Es simple, es llamativa y <strong>tiene ese punto de rebeldía que genera <em>likes</em></strong>.</p>
<p>La realidad del desarrollo web es otra. Los sitios web no son proyectos que se terminan un día y ya, son proyectos que tienen una vida, a veces larga, y hay que mantenerlos. Y es en ese mantenimiento continuo, en la gestión diaria del contenido, en la seguridad, en el cumplimiento legal, en la escalabilidad, en la capacidad de que personas no técnicas participen, donde <strong>WordPress lleva dos décadas demostrando su valor</strong>.</p>
<p>La IA no viene a sustituir a WordPress sino a hacerlo todavía más potente. Quién entienda esto antes tiene una ventaja enorme sobre el que siga pensando que elegir entre IA y WordPress es la pregunta correcta.</p>
<blockquote><p>La pregunta correcta es ¿cómo uso la IA para hacer más y mejor con WordPress?</p></blockquote>
<p>Y esa tiene muchas respuestas buenas, casi todas aquí, en este tu blog.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/mantenimiento-web-vibe-coding/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Divi 5 o Elementor 4 ¿qué maquetador es mejor, ha cambiado algo?</title>
		<link>https://ayudawp.com/divi-5-elementor-4/</link>
					<comments>https://ayudawp.com/divi-5-elementor-4/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[Temas WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Divi]]></category>
		<category><![CDATA[Elementor]]></category>
		<category><![CDATA[Principiante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158939</guid>

					<description><![CDATA[Si estás dudando qué maquetador elegir entre Elementor o Divi, aquí tienes una comparativa de las últimas versiones, pues ambos se han renovado completamente.]]></description>
										<content:encoded><![CDATA[<p>Febrero y marzo de 2026 fueron dos meses intensos para los que trabajamos con WordPress. Divi 5 salió el 26 de febrero y Elementor 4 apenas un mes después, el 30 de marzo.</p>
<p><strong>Los dos maquetadores más usados del ecosistema WordPress han renovado su arquitectura casi a la vez</strong>, y eso no pasa todos los días.</p>
<p>No estamos hablando de actualizaciones al uso, con un puñado de funciones nuevas y un par de correcciones, <strong>tanto Elementor como Divi han reescrito buena parte de su base de código</strong>.</p>
<p>Elementor ha apostado por lo que llaman el «<strong>editor atómico</strong>«, con un enfoque CSS-first. Divi, por su parte, ha tirado la casa por la ventana con una <strong>reescritura completa de Divi Builder desde cero</strong>, tras más de tres años de desarrollo (llevo siguiendo todo el proceso, desde la <a href="https://ayudawp.com/divi-5-alpha-demo/">primera demo de Divi 5</a> hasta la <a href="https://ayudawp.com/divi-5-alpha-publica/">alpha pública</a>).</p>
<p>Así que si llevas tiempo <strong>preguntándote cuál elegir, o si te estás planteando cambiar de uno a otro</strong>, este es el mejor momento para comparar, vamos a ello.</p>
<h2>Migración y retrocompatibilidad</h2>
<p>Los dos se han tomado la retrocompatibilidad en serio, pero con estrategias diferentes.</p>
<h3>Migrar de Elementor 3 a Elementor 4</h3>
<p>Permite usar elementos de v3 y v4 en la misma página. <strong>No necesitas migrar nada</strong>, los widgets antiguos siguen funcionando tal cual, puedes ir adoptando los elementos atómicos gradualmente. Es lo más seguro y menos agresivo.</p>
<h3>Migrar de Divi 4 a Divi 5</h3>
<p>Divi 5 incluye un migrador que <strong>convierte todos los módulos de Divi 4</strong> al nuevo formato. El proceso es rápido, pero conviene probarlo primero en staging (tengo una <a href="https://ayudawp.com/migracion-divi-5/">guía detallada del proceso de migración a Divi 5</a> con lo que me he encontrado).</p>
<p>También hay un modo de compatibilidad hacia atrás para módulos de terceros que todavía no se han adaptado.</p>
<p>Elegant Themes mantiene compatibilidad con Divi 4 durante al menos seis meses después del lanzamiento, con actualizaciones de seguridad. Pasado ese periodo las rutas de actualización convergerán y todos los sitios recibirán el aviso de actualización a Divi 5.</p>
<hr>
<p>Si tienes un sitio complejo con muchos plugins de terceros la migración a <strong>Divi 5 requiere más precaución</strong>. Con Elementor 4 la transición es más progresiva y con menos riesgo, pero en contrapartida mantiene demasiada compatibilidad con código antiguo.</p>
<h2>Arquitectura y rendimiento</h2>
<p>Este es el punto donde los dos han metido más trabajo, y donde el cambio respecto a las versiones anteriores es más evidente.</p>
<h3>Elementor 4</h3>
<p>Elementor ha introducido lo que llaman el «<strong>Atomic Editor</strong>» para pasar de un sistema basado en widgets con estilos inline a un <strong>enfoque basado en CSS</strong> donde los estilos se gestionan a través de clases y variables reutilizables.</p>
<p>Esto genera un <strong>DOM más limpio y menos código repetido</strong>. Según datos de Elementor <strong>la reducción de código CSS puede llegar al 70 %</strong> en páginas que usan íntegramente los elementos <em>atómicos</em> frente al sistema antiguo de la v3.</p>
<p><strong>Elementor 4 y la versión 3 coexisten en la misma página</strong>, no tienes que migrar todo de golpe, puedes ir adoptando los nuevos elementos atómicos poco a poco mientras mantienes los widgets de v3 funcionando.</p>
<p>Lo malo es que la mejora en estas situaciones sería limitada, <strong>arrastrando problemas de las versiones 3.x</strong>.</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="Elementor 4.0 full walkthrough (Atomic Editor explained) with Roi &#x2728;" width="1600" height="900" src="https://www.youtube.com/embed/obdVGjOyVtE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p> </p>
<h3>Divi 5</h3>
<p>La gente de Elegant Themes ha ido más lejos en cuanto a reescritura, pues es un <strong>maquetador completamente nuevo, desarrollado con React</strong> y una arquitectura moderna desde la misma base.</p>
<p>Y aquí viene lo gordo, porque <strong>Divi 5 ha eliminado los shortcodes</strong> que lastraban el rendimiento de Divi 4 y ahora usa un formato de almacenamiento basado en <strong>HTML5, alineado con el sistema de bloques de WordPress</strong>.</p>
<p><strong>Este cambio es enorme</strong>, pues ya no hay procesamiento de shortcodes en cada carga de página, el CSS se genera de forma limpia, los scripts no esenciales se cargan en diferido y el peso base de cada página se ha reducido de forma considerable.</p>
<p>Si desactivas Divi 5 ya no te quedas con un montón de shortcodes ilegibles en el contenido como pasaba antes.</p>
<p>Hice <a href="https://ayudawp.com/divi-5-core-web-vitals-divi-4/">mis propias pruebas de rendimiento comparando Divi 5 con Divi 4</a> cuando todavía estaba en fase alpha, con dos sitios idénticos en el mismo servidor, y ya entonces la mejora apuntaba maneras.</p>
<p>Ahora, con la versión final, los datos son todavía mejores. Según pruebas recientes (WP All Import, Oxygen), <strong>Divi 5 iguala o supera a Elementor en varias métricas clave</strong>:</p>
<ul>
<li><strong>Mejor FCP</strong> (First Contentful Paint)</li>
<li><strong>Mejor Speed Index</strong></li>
<li><strong>Menos peticiones HTTP</strong></li>
<li><strong>Puntuaciones de Lighthouse superiores</strong> tanto en móvil como en escritorio.</li>
</ul>
<p>Elementor puede tener un tamaño de página ligeramente menor en algunas situaciones, pero <strong>Divi 5 genera menos peticiones al servidor y un CSS más limpio que Elementor</strong>.</p>
<p>El salto de rendimiento de Divi 5 frente a Divi 4 ha sido tremendo. Si probaste Divi 4 y te pareció lento, <strong>Divi 5 es otro producto</strong>.</p>
<p>Frente a Elementor 4, la diferencia ya no es que Divi vaya por detrás, <strong>van bastante igualados</strong>, con Divi llevando ventaja en varias métricas.</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="Divi 5 Official! &#x1f389; (Beta Ends Today)" width="1600" height="900" src="https://www.youtube.com/embed/BXSpybFcf_I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p> </p>
<table>
<thead>
<tr>
<th>Aspecto</th>
<th>Elementor 4</th>
<th>Divi 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Enfoque de arquitectura</td>
<td>CSS-first («Atomic Editor»)</td>
<td>Reescritura completa en React + HTML5 (sin shortcodes)</td>
</tr>
<tr>
<td>Peso de CSS/JS</td>
<td>Reducción hasta -70 % con elementos <em>atómicos</em> frente a las v3.x</td>
<td>CSS limpio, scripts diferidos, peso base muy reducido frente Divi 4</td>
</tr>
<tr>
<td>Core Web Vitals (Lighthouse)</td>
<td>Buenos, mejora clara frente a v3</td>
<td>Iguales o superiores a Elementor 4 en FCP y Speed Index</td>
</tr>
<tr>
<td>Peticiones HTTP</td>
<td>Menos que Divi 4, pero más que Divi 5 en tests comparativos</td>
<td>Significativamente menos que Elementor en mis propias pruebas</td>
</tr>
<tr>
<td>Almacenamiento de contenido</td>
<td>Estructura propietaria</td>
<td>HTML5 / block-based (contenido limpio al desactivar)</td>
</tr>
<tr>
<td>Convivencia con versión anterior</td>
<td>v3 y v4 en la misma página</td>
<td>Migrador automático + modo compatibilidad para Divi 4</td>
</tr>
</tbody>
</table>
<h2>Sistema de diseño</h2>
<p>Aquí es donde estos cambios marcan un antes y un después para los dos maquetadores porque ambos <strong>han adoptado conceptos que vienen del mundo del diseño de interfaces</strong> (Figma, Sketch) y que hasta ahora eran territorio exclusivo de herramientas de desarrollo.</p>
<h3>Elementor 4</h3>
<p>Trae tres novedades gordas en este apartado:</p>
<ul>
<li><strong>Variables</strong>: puedes definir valores globales para colores, tipografías y espaciados. Cambias un valor y se actualiza en todo el sitio. Funcionan como design tokens.</li>
<li><strong>Clases CSS</strong>: puedes crear clases reutilizables y asignarlas a cualquier elemento. Nada de ir widget por widget cambiando estilos, que era una pesadilla.</li>
<li><strong>Sincronización con estilos globales</strong>: las nuevas variables y clases se sincronizan automáticamente con los colores y fuentes globales de v3, lo que facilita la transición.</li>
</ul>
<h3>Divi 5</h3>
<p>En esto ha ido un paso más allá con un sistema de presets bastante completo:</p>
<ul>
<li><strong>Variables de diseño</strong>: similares a las de Elementor, permiten definir valores globales para colores, tipografías, tamaños y espaciados.</li>
<li><strong>Preajustes anidados y apilables</strong>: puedes crear presets a nivel de módulo y a nivel de grupo de opciones (por ejemplo, un preset solo para bordes) y anidarlos. Aplicas un preset de módulo y los presets de opciones se aplican automáticamente.</li>
<li><strong>Inspector</strong>: inspirado directamente en Figma. Clic derecho en cualquier sección y ves un panel con todos los estilos aplicados (colores, fuentes, medios, presets). Puedes editar todo desde ahí, incluso hacer cambios en lote. Esto es una pasada para cuando importas layouts y necesitas adaptar la paleta de colores de golpe.</li>
</ul>
<table>
<thead>
<tr>
<th>Función</th>
<th>Elementor 4</th>
<th>Divi 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tokens de diseño / variables globales</td>
<td>Sí (colores, tipografía, espaciado)</td>
<td>Sí (colores, tipografía, tamaños, espaciado)</td>
</tr>
<tr>
<td>Clases CSS reutilizables</td>
<td>Sí</td>
<td>Sí (integradas en presets)</td>
</tr>
<tr>
<td>Presets anidados/apilables</td>
<td>No</td>
<td>Sí (a nivel de módulo y de grupo de opciones)</td>
</tr>
<tr>
<td>Inspector visual tipo Figma</td>
<td>No</td>
<td>Sí (edición en lote desde un solo panel)</td>
</tr>
<tr>
<td>Retrocompatibilidad con estilos antiguos</td>
<td>Sincronización automática v3 → v4</td>
<td>Migrador integrado</td>
</tr>
</tbody>
</table>
<p>En este apartado <strong>Divi 5 lleva ventaja</strong> porque el sistema de preajustes anidados y el inspector son herramientas que ahorran mucho tiempo, sobre todo cuando trabajas con plantillas importadas o gestionas varios sitios con la misma identidad visual.</p>
<h2>Editor y experiencia de uso</h2>
<p>El día a día con un maquetador se juega aquí, no en la lista de funcionalidades.</p>
<h3>Elementor 4</h3>
<p>Mantiene la estructura de editor que ya conocemos: panel lateral izquierdo con los ajustes del elemento seleccionado y edición visual en el lienzo. Las novedades más visibles son:</p>
<ul>
<li><strong>Edición inline mucho más fluida</strong> (puedes editar textos directamente en el lienzo).</li>
<li><strong>La pestaña de estilo se ha unificado</strong> para los elementos atómicos, lo que simplifica la navegación.</li>
<li><strong>Pro Interactions</strong>: animaciones al hacer scroll, efectos al pasar el cursor y transformaciones personalizadas sin necesidad de plugins de terceros.</li>
<li><strong>Selección múltiple de elementos</strong>: seleccionas varios a la vez y les aplicas cambios en bloque.</li>
</ul>
<h3>Divi 5</h3>
<p>Aquí también ha renovado la experiencia de edición de arriba abajo:</p>
<ul>
<li><strong>El maquetador visual es mucho más rápido</strong> que en Divi 4. El editor de backend, que era muuuy lento con páginas complejas, ha mejorado de forma impresionante.</li>
<li><strong>Paneles acoplables</strong>: puedes anclar los paneles de ajustes a la barra lateral o dejarlos flotantes, y gestionar varios paneles abiertos a la vez.</li>
<li><strong>Menú contextual con clic derecho para todo</strong> (añadir, copiar, pegar, inspeccionar), que agiliza mucho el flujo de trabajo.</li>
<li>El <strong>Command Center</strong> (similar a la paleta de comandos de VS Code) para acceder a cualquier función del maquetador escribiendo su nombre.</li>
<li>La <strong>vista de capas</strong> para gestionar la estructura sin tocar el lienzo.</li>
<li><strong>Siete puntos de ruptura</strong> adaptables (responsive) personalizables (Divi 4 tenía tres fijos).</li>
</ul>
<p>Si quieres ver los cambios de Divi 5 con más detalle tengo una <a href="https://ayudawp.com/cambios-divi-5-guia-visual/">guía visual completa de los cambios de Divi 5</a> que te puede servir de referencia.</p>
<p>En el caso de que vengas de Divi 4 la mejora de rendimiento del editor es lo primero que vas a notar, si vienes de Elementor, el inspector y los paneles acoplables te van a llamar la atención.</p>
<p>Los dos editores son buenos actualmente pero <strong>Divi ha dado un salto más grande porque partía de más atrás</strong>.</p>
<h2>Componentes y modularidad</h2>
<p>Los dos maquetadores han apostado fuerte por los <strong>componentes reutilizables</strong>, aunque con enfoques distintos.</p>
<h3>Elementor 4 Components</h3>
<p>Sustituyen a los antiguos widgets globales. La diferencia es que los componentes sincronizan estructura y estilos (los widgets globales solo sincronizaban estilos), y además <strong>permiten personalización controlada en cada necesidad</strong>.</p>
<p>Es decir, puedes tener un componente de tarjeta de producto que se sincroniza en todo el sitio, pero cambiar el texto o la imagen en cada lugar donde lo uses sin romper la sincronización global.</p>
<p>También <strong>los formularios se han modularizado</strong>, ahora los Atomic Forms descomponen los formularios en elementos individuales (etiqueta, campo, botón de envío) que puedes organizar libremente en el lienzo.</p>
<h3>Divi 5 Nested Modules</h3>
<p>Permiten meter <strong>módulos dentro de otros módulos sin límites</strong>, lo que abre muchas posibilidades, como poder poner un botón dentro de un menú, un formulario dentro de una tarjeta, o <strong>construir estructuras de menú complejas sin necesidad de plugins</strong> adicionales.</p>
<p>Los controles de Flexbox y CSS Grid se aplican a cualquier contenedor, lo que da <strong>una flexibilidad de maquetación que antes no existía</strong> en Divi.</p>
<table>
<thead>
<tr>
<th>Capacidad</th>
<th>Elementor 4</th>
<th>Divi 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Componentes reutilizables</td>
<td>Components (sincronizan estructura + estilos)</td>
<td>Global Modules + Divi Cloud</td>
</tr>
<tr>
<td>Personalización por instancia</td>
<td>Sí (Component Properties)</td>
<td>Parcial</td>
</tr>
<tr>
<td>Módulos anidados</td>
<td>Limitado (dentro de contenedores)</td>
<td>Sí, sin límite de profundidad</td>
</tr>
<tr>
<td>Formularios modulares</td>
<td>Atomic Forms (campos como elementos independientes)</td>
<td>Módulo de formulario clásico (mejoras en camino)</td>
</tr>
<tr>
<td>CSS Grid nativo</td>
<td>No (Flexbox)</td>
<td>Sí</td>
</tr>
<tr>
<td>Breakpoints responsive</td>
<td>Personalizables</td>
<td>7 breakpoints personalizables</td>
</tr>
</tbody>
</table>
<p>Ambas ideas <strong>resuelven los problemas de manera muy eficiente</strong>.</p>
<p>Elementor con sus Components apuesta por la consistencia a escala (perfecto para agencias que gestionan muchos sitios), mientras que Divi con los Nested Modules apuesta por la flexibilidad creativa (perfecto para diseñadores que quieren control total sobre la estructura).</p>
<h2>Integración con IA</h2>
<p>Aquí es donde las diferencias se ponen interesantes porque los dos <strong>han ido por caminos bastante distintos</strong>.</p>
<h3>Elementor AI</h3>
<p>Tiene como dos capas, o <strong>dos modos de usar IA</strong>. Por un lado está la IA base, que está integrada directamente en el editor. Genera textos, imágenes, código CSS personalizado y diseños de secciones completas.</p>
<p>Funciona con un <strong>sistema de créditos</strong>. Un prompt de texto o código cuesta 1 crédito, una imagen 33 créditos, un contenedor con layout 40 créditos.</p>
<p>Los planes específicos de IA van desde unos 44 €/año (24.000 créditos) hasta 176 €/año (100.000 créditos). Con el plan Elementor One (desde 168 €/año en precio de lanzamiento) los créditos se comparten entre IA, optimización de imágenes y otras funciones.</p>
<p>La segunda capa es <strong>Angie</strong>, un agente de <strong>IA que va más allá</strong> de generar texto o imágenes, pues entiende la estructura de tu sitio WordPress (tema, plugins, campos personalizados) y puede crear widgets personalizados, snippets de código y extensiones funcionales a partir de instrucciones en lenguaje natural.</p>
<p>Todo se prueba en un entorno de pruebas antes de tocar tu sitio en producción. Usa el <a href="https://ayudawp.com/mcp-wordpress/" target="_blank" rel="noopener ugc">Model Context Protocol (MCP)</a> para heredar automáticamente el contexto de tu instalación.</p>
<p>Ahora bien, la realidad de Angie a día de hoy es que según pruebas de empresas como Crocoblock, que basan su negocio en gran medida en Elementor, es que <strong>al agente todavía falla bastante</strong>.</p>
<p>Tiende a generar HTML en crudo en lugar de usar los widgets de Elementor, y hay muchos prompts complejos que simplemente no funcionan.</p>
<p>Es un <strong>concepto prometedor pero todavía está muy verde</strong>. Lo que sí funciona bien de Elementor AI es la generación de imágenes y el CSS personalizado, que conoce la estructura de los módulos de Elementor.</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="Introducing Elementor AI" width="1600" height="900" src="https://www.youtube.com/embed/_P_4SHBQtiQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p> </p>
<h3>Divi AI</h3>
<p>El maquetador Divi toma un <strong>enfoque diferente pues todo está integrado directamente en el maquetador</strong>, sin plugins separados. Desde cualquier campo de texto, imagen o código puedes invocar la IA.</p>
<p>Sus capacidades son estas:</p>
<ul>
<li>Generación y reescritura de textos (títulos, párrafos, posts enteros).</li>
<li>Generación de imágenes.</li>
<li>Código CSS personalizado, entrenado específicamente con la base de código de los módulos de Divi.</li>
<li>Generación de layouts completos: le describes tu negocio y una cadena de agentes crea el esqueleto de la página, construye la estructura, rellena con texto e imágenes y personaliza los estilos.</li>
</ul>
<p>Divi acaba de empezar a desarrollar su propio <strong>AI Agent</strong> (aparece en los registros de cambio de las versiones 5.1 y 5.2), pero está en fases muy tempranas, todavía no es funcional del todo.</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="Introducing Divi AI For Divi 5!" width="1600" height="900" src="https://www.youtube.com/embed/uRvQk1sROvE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p> </p>
<table>
<thead>
<tr>
<th>Inteligencia Artificial</th>
<th>Elementor AI</th>
<th>Divi AI</th>
</tr>
</thead>
<tbody>
<tr>
<td>Generación de texto</td>
<td>Sí (por créditos)</td>
<td>Sí (ilimitada con Divi Pro)</td>
</tr>
<tr>
<td>Generación de imágenes</td>
<td>Sí (33 créditos/imagen)</td>
<td>Sí (ilimitada con Divi Pro)</td>
</tr>
<tr>
<td>CSS personalizado</td>
<td>Sí, con conocimiento de los módulos</td>
<td>Sí, entrenado en código Divi</td>
</tr>
<tr>
<td>Generación de layouts completos</td>
<td>Sí (AI Site Planner gratuito)</td>
<td>Sí (Quick Sites + agentes encadenados)</td>
</tr>
<tr>
<td>Agente IA autónomo</td>
<td>Angie (gratuito, beta, muy verde)</td>
<td>AI Agent (en desarrollo temprano)</td>
</tr>
<tr>
<td>Modelo de cobro</td>
<td>Por créditos (desde 44 €/año)</td>
<td>Ilimitado con Divi Pro (255 €/año)</td>
</tr>
</tbody>
</table>
<p>La diferencia grande en precios:, sobre todo porque <strong>Divi AI es ilimitado</strong> si tienes Divi Pro (unos 255 €/año) o el bundle Lifetime + Pro Services (unos 273 € de pago único + 195 €/año de servicios). <strong>Con Divi AI hay créditos, no hay topes, mientras que en Elementor AI pagas por uso</strong>.</p>
<p>¿Qué sale mejor?, pues depende:</p>
<ul>
<li><strong>Si usas mucho la IA</strong> diseñando <strong>el modelo de Divi es más predecible en costes</strong>.</li>
<li>Si utilizas la IA <strong>para maquetar de forma puntual</strong> el sistema de créditos de <strong>Elementor puede salir más económico</strong>.</li>
</ul>
<h2>WooCommerce</h2>
<p>Los dos maquetadores ofrecen compatibilidad completa con WooCommerce, pero con diferencias.</p>
<h3>Elementor Pro</h3>
<p>La versión 4 ya incluye módulos específicos para WooCommerce:</p>
<ul>
<li>Páginas de producto</li>
<li>Listados de tienda</li>
<li>Carrito y pago personalizables visualmente.</li>
</ul>
<p>Pero ojo, <strong>el WooCommerce Builder de Elementor completo requiere adicionalmente el plan Advanced Solo</strong> (unos 77 €/año) o superior. Con Elementor 4 estos módulos se benefician del nuevo sistema <em>atómico</em> y del rendimiento mejorado.</p>
<h3>Divi 5</h3>
<p>En esto ha completado la migración de todos los módulos de WooCommerce a la nueva arquitectura:</p>
<ul>
<li>Galería de producto</li>
<li>Módulos de checkout y carrito</li>
<li>Módulos de pago</li>
</ul>
<p>Funciona con <strong>cualquier plan de Divi, sin restricciones</strong> por nivel de suscripción.</p>
<p>El Loop Builder de Divi permite crear listados de productos con consultas personalizadas, filtros avanzados y diseños de cuadrícula flexibles.</p>
<p>En funcionalidad pura de WooCommerce <strong>están bastante igualados</strong>.</p>
<p>La diferencia es que <strong>en Elementor necesitas un plan medio-alto para acceder al builder completo de WooCommerce</strong>, mientras que <strong>en Divi viene incluido en todos los planes</strong>.</p>
<h2>Ecosistema y escalabilidad</h2>
<p><strong>Elementor</strong> tiene una ventaja obvia, porque con <strong>más de 12 millones de instalaciones</strong> activas, gracias a la acertada estrategia de ofrecer una version (capada) en WordPress.org, <strong>su ecosistema de plugins y extensiones de terceros es enorme</strong>.</p>
<p>Hay <strong>cientos de addons</strong> disponibles (JetElements, Essential Addons, Premium Addons…) que amplían las funcionalidades del maquetador. La versión 4 mantiene retrocompatibilidad con los addons de v3 así que el ecosistema existente sigue funcionando.</p>
<p>Además, <strong>Elementor se está convirtiendo en una plataforma</strong> más que en un simple plugin, porque ofrece hosting propio (Elementor Cloud), integración con herramientas de accesibilidad (Ally), optimización de imágenes, envío de emails transaccionales y gestión centralizada de sitios, todo dentro de su plan One.</p>
<p><strong>Divi</strong> tiene su propio marketplace con plugins y módulos de terceros, aunque <strong>más reducido que el de Elementor</strong>, pues cometieron el error, a mi modo de ver, de no ofrecer versión limitada en WordPress.org.</p>
<p>La transición a Divi 5 ha sido un reto para los desarrolladores de terceros, ya que la reescritura completa del maquetador requiere adaptar los plugins. Muchos ya tienen versiones compatibles, pero otros siguen en desarrollo.</p>
<p>Si dependes mucho de plugins de terceros para Divi, <strong>conviene comprobar la compatibilidad antes de migrar</strong>.</p>
<p>Divi <strong>incluye en su paquete base Divi Cloud</strong> (almacenamiento de assets en la nube), <strong>Divi Dash</strong> (gestión de múltiples sitios) y las extensiones <strong>DonDivi</strong> (que Elegant Themes ha adquirido recientemente, incluyendo <strong>DiviMenus</strong>). También tienes <strong>Bloom</strong> (formularios de suscripción) y <strong>Monarch</strong> (botones sociales) <strong>sin coste adicional</strong>.</p>
<h2>Modelo de precios</h2>
<p>Aquí <strong>las diferencias son grandes y merece la pena verlas con calma</strong>. Los precios de Elementor están en euros directamente, los de Divi están en dólares (los paso a euros aproximados al cambio actual).</p>
<table>
<thead>
<tr>
<th>Plan</th>
<th>Elementor Pro</th>
<th>Divi (Elegant Themes)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Entrada</td>
<td>Essential: 54 €/año, 1 sitio</td>
<td>Aual: ~82 €/año, sitios ilimitados</td>
</tr>
<tr>
<td>Intermedio</td>
<td>Advanced Solo: 77 €/año, 1 sitio (WooCommerce + Popups)</td>
<td>—</td>
</tr>
<tr>
<td>Multi-sitio</td>
<td>Advanced: 91 €/año, 3 sitios</td>
<td>(todos los planes incluyen sitios ilimitados)</td>
</tr>
<tr>
<td>Agencia</td>
<td>Expert: 183 €/año, 25 sitios / Agency: 367 €/año, 1.000 sitios</td>
<td>Divi Lifetime: ~229 € pago único, sitios ilimitados para siempre</td>
</tr>
<tr>
<td>Todo incluido con IA</td>
<td>One: desde 168 €/año (25.000 créditos mensuales compartidos)</td>
<td>Divi Pro: ~255 €/año (IA ilimitada + Cloud + VIP Support)</td>
</tr>
<tr>
<td>Lifetime + IA</td>
<td>No disponible</td>
<td>~273 € (pago único) + ~195 €/año servicios Pro</td>
</tr>
</tbody>
</table>
<p>Un par de cosas a tener en cuenta:</p>
<p><strong>Elementor no ofrece licencia ilimitada</strong>. Eso significa que si dejas de pagar dejas de recibir actualizaciones y soporte. <strong>Divi sí la ofrece, y a 229 € con sitios ilimitados</strong> es difícil de batir para quién trabaja con muchos sitios.</p>
<p>En cuanto a <strong>Elementor Free</strong>, que existe y que a veces se presenta como una ventaja, la realidad es que cada vez se queda más corto. Le faltan el Theme Builder, los formularios, los popups, el WooCommerce Builder y la mayoría de widgets Pro. Es más un <strong>gancho comercial para vender la versión de pago</strong> que un producto usable en producción.</p>
<p><strong>Divi no tiene versión gratuita</strong>, pero ofrece una demo para probar y 30 días de garantía de devolución.</p>
<p>La comparación directa <strong>depende mucho del tipo de uso que le vayas a dar</strong>:</p>
<ul>
<li><strong>Para un solo sitio con WooCommerce</strong>, Elementor Advanced Solo (77 €) sale más barato que Divi anual (82 €), pero Divi incluye sitios ilimitados.</li>
<li><strong>Para agencias</strong>, el lifetime de Divi a 229 € con sitios ilimitados es muy difícil de superar frente a los 367 €/año de Elementor Agency.</li>
<li><strong>Si la IA ilimitada te interesa</strong>, los 255 €/año de Divi Pro son más predecibles que el sistema de créditos de Elementor.</li>
</ul>
<h2>Entonces, ¿cuál es mejor actualmente, Divi o Elementor?</h2>
<p>No hay un ganador absoluto pero sí perfiles claros para cada uno dependiendo de tus prioridades. Siento no mojarme más, pero es la realidad.</p>
<p><strong>Elementor te viene mejor si:</strong></p>
<ul>
<li>Necesitas un <strong>ecosistema de plugins de terceros grande</strong> y maduro.</li>
<li>Valoras una <strong>transición gradual</strong> sin migraciones bruscas.</li>
<li>Buscas una <strong>plataforma todo-en-uno</strong> (maquetador + hosting + IA + accesibilidad + email).</li>
<li>Tu flujo de trabajo se basa en <strong>componentes reutilizables sincronizados</strong> a escala.</li>
<li>Gestionas <strong>pocos sitios</strong> y no necesitas licencias ilimitadas.</li>
</ul>
<p><strong>Divi te viene mejor si:</strong></p>
<ul>
<li>Gestionas <strong>muchos sitios</strong> y necesitas una licencia que cubra todos sin límite.</li>
<li>Quieres un <strong>pago único</strong> (lifetime) y olvidarte de renovaciones anuales del maquetador.</li>
<li><strong>Usas mucho la IA</strong> y prefieres un modelo de uso ilimitado sin créditos.</li>
<li>Valoras el inspector y el sistema de preajustes anidados para <strong>gestionar sistemas de diseño</strong>.</li>
<li>Necesitas <strong>flexibilidad máxima de maquetación</strong> con módulos anidados y CSS Grid nativo.</li>
</ul>
<p>Los dos están en un momento de transición, y es algo que también debes valorar.</p>
<p>Elementor 4 es más maduro en su nueva arquitectura (lleva más de un año con las funciones atómicas en alpha y beta). Divi 5 acaba de salir de beta y todavía está puliendo detalles, pero el ritmo de actualizaciones es alto (cada dos semanas).</p>
<p><strong>Si estás empezando</strong> un proyecto nuevo hoy, <strong>cualquiera de los dos es una buena elección</strong>.</p>
<p>Si ya tienes sitios en uno de ellos, la migración al otro rara vez compensa el esfuerzo. Lo que sí conviene es actualizar a las nuevas versiones y aprovechar las mejoras de rendimiento y las nuevas herramientas de diseño que ambos traen.</p>
<p>Si quieres más información, demos o capturas aquí tienes las webs oficiales de ambos:</p>
<ul>
<li><a href="https://ayudawp.com/recomiendo/elementor/" data-eafl-id="87355" data-eafl-parsed="1" class="eafl-link eafl-link-text eafl-link-cloaked" target="_blank" rel="nofollow noopener noreferrer sponsored">Elementor Pro 4</a></li>
<li><a href="https://ayudawp.com/recomiendo/divi/" data-eafl-id="80136" data-eafl-parsed="1" class="eafl-link eafl-link-text eafl-link-cloaked" target="_blank" rel="nofollow noopener noreferrer">Divi 5</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/divi-5-elementor-4/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>¿Se pueden ocultar bloques WordPress según el tamaño de pantalla o dispositivo? Pero sin plugins, por favor</title>
		<link>https://ayudawp.com/ocultar-bloques-por-dispositivo/</link>
					<comments>https://ayudawp.com/ocultar-bloques-por-dispositivo/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Editor de WordPress]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Principiante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158766</guid>

					<description><![CDATA[Ocultar un bloque en móvil y que se siga viendo en escritorio era una de esas cosas que WordPress debería haber tenido desde hace años. Hasta ahora necesitabas un plugin como Block Options, o andarte]]></description>
										<content:encoded><![CDATA[<p><strong>Ocultar un bloque en móvil y que se siga viendo en escritorio</strong> era una de esas cosas que WordPress debería haber tenido desde hace años. Hasta ahora necesitabas un <a href="https://ayudawp.com/opciones-visibilidad-bloques/" target="_blank" rel="noopener ugc">plugin como Block Options</a>, o andarte con clases CSS a mano, para conseguir algo tan básico, pero <strong>WordPress incorpora la visibilidad por tipo de dispositivo desde la versión 7.0</strong>.</p>
<p>La nueva funcionalidad se llama <strong>Block Visibility</strong> y permite <strong>ocultar cualquier bloque por tipo de dispositivo</strong> (escritorio, tablet o móvil) directamente desde el editor, sin instalar nada. También <strong>mantiene la opción de ocultar un bloque por completo</strong>, que ya existía desde WordPress 6.9, eso no cambia, pero ahora todo se gestiona desde el mismo sitio.</p>
<p>Te cuento cómo funciona, y también la parte técnica qué necesitas saber si desarrollas temas o plugins.</p>
<h2>Cómo ocultar un bloque por dispositivo</h2>
<p>Selecciona el bloque que quieras ocultar y abre el menú de opciones (los tres puntos de la barra de herramientas o clic derecho). Verás una opción nueva, <strong>Ocultar</strong> (Hide en inglés), con el atajo de teclado <code>⇧⌘H</code> en Mac.</p>
<p><a href="https://ayudawp.com/?attachment_id=158770" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158770 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/menu-ocultar-bloque-wordpress-1200x767.jpg" alt="menu ocultar bloque wordpress" width="1200" height="767" srcset="https://ayudawp.com/wp-content/uploads/2026/04/menu-ocultar-bloque-wordpress-1200x767.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/menu-ocultar-bloque-wordpress-768x491.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/menu-ocultar-bloque-wordpress-1536x982.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/menu-ocultar-bloque-wordpress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Al pulsar en ese enlace del menú se abre una pequeña <strong>ventana emergente con las opciones de visibilidad</strong>:</p>
<ul>
<li><strong>Omitir del contenido publicado</strong>: oculta el bloque por completo. No se procesa en el HTML de la página, así que nadie lo ve en ningún dispositivo. Es lo mismo que hacía <code>blockVisibility: false</code> en WordPress 6.9.</li>
<li><strong>Ocultar en escritorio</strong>: oculta el bloque en pantallas de escritorio.</li>
<li><strong>Ocultar en tableta</strong>: oculta el bloque en tabletas.</li>
<li><strong>Ocultar en móvil</strong>: oculta el bloque en móviles.</li>
</ul>
<p><a href="https://ayudawp.com/?attachment_id=158771" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158771 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/ocultar-bloque-wordpress-por-dispositivo-1200x767.jpg" alt="ocultar bloque wordpress por dispositivo" width="1200" height="767" srcset="https://ayudawp.com/wp-content/uploads/2026/04/ocultar-bloque-wordpress-por-dispositivo-1200x767.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/ocultar-bloque-wordpress-por-dispositivo-768x491.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/ocultar-bloque-wordpress-por-dispositivo-1536x982.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/ocultar-bloque-wordpress-por-dispositivo.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Puedes marcar las combinaciones que necesites. Por ejemplo, si quieres que un bloque solo se vea en móvil, marcas «Ocultar en escritorio» y «Ocultar en tableta».</p>
<h3>Indicadores en la vista de lista</h3>
<p>Cuando un bloque tiene reglas de visibilidad activas la vista de lista del editor muestra iconos junto al nombre del bloque indicando <strong>en qué dispositivos está oculto</strong>. Viene bien para no perder la pista de qué has ocultado y dónde.</p>
<p><a href="https://ayudawp.com/?attachment_id=158773" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158773 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/indicador-bloque-wordpress-oculto-en-dispositivos-1200x767.jpg" alt="indicador bloque wordpress oculto en dispositivos" width="1200" height="767" srcset="https://ayudawp.com/wp-content/uploads/2026/04/indicador-bloque-wordpress-oculto-en-dispositivos-1200x767.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/indicador-bloque-wordpress-oculto-en-dispositivos-768x491.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/indicador-bloque-wordpress-oculto-en-dispositivos-1536x982.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/indicador-bloque-wordpress-oculto-en-dispositivos.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h2>Vista previa en el editor de bloques</h2>
<p>Por ir terminando, la comprobación de esta funcionalidad es sencilla, solo tienes que cambiar a la vista previa integrada en el editor de WordPress de un dispositivo que hayas ocultado para <strong>comprobar que no se ve</strong>, y a más, por supuesto, puedes comprobar en la web que no se verá si cambias el tamaño de pantalla.</p>

<a href="https://ayudawp.com/ocultar-bloques-por-dispositivo/bloque-visible-en-escritorio/" rel="nofollow"><img width="1200" height="767" src="https://ayudawp.com/wp-content/uploads/2026/04/bloque-visible-en-escritorio-1200x767.jpg" class="attachment-medium size-medium" alt="bloque visible en escritorio" srcset="https://ayudawp.com/wp-content/uploads/2026/04/bloque-visible-en-escritorio-1200x767.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-visible-en-escritorio-768x491.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-visible-en-escritorio-1536x982.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-visible-en-escritorio.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px" decoding="async" fetchpriority="high"></a>
<a href="https://ayudawp.com/ocultar-bloques-por-dispositivo/bloque-oculto-en-tableta/" rel="nofollow"><img width="1200" height="767" src="https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-tableta-1200x767.jpg" class="attachment-medium size-medium" alt="bloque oculto en tableta" srcset="https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-tableta-1200x767.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-tableta-768x491.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-tableta-1536x982.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-tableta.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/ocultar-bloques-por-dispositivo/bloque-oculto-en-movil/" rel="nofollow"><img width="1200" height="767" src="https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-movil-1200x767.jpg" class="attachment-medium size-medium" alt="bloque oculto en movil" srcset="https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-movil-1200x767.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-movil-768x491.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-movil-1536x982.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/bloque-oculto-en-movil.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<p> </p>
<h2>Las tripas: CSS en vez de no renderizar</h2>
<p>Aquí hay una diferencia importante que conviene tener clara y es que cuando marcas <strong>«Omit from published content»</strong> el bloque directamente no se incluye en el HTML de la página. No existe en el DOM, no se carga, no aparece en ningún sitio. Esto es lo que ya hacía WordPress 6.9 con <code>blockVisibility: false</code> y sigue funcionando exactamente igual.</p>
<p>Cuando ocultas por dispositivo (desktop, tablet, mobile), la cosa cambia: el bloque <strong>sí se renderiza en el DOM</strong>. Lo que hace WordPress es aplicar reglas CSS con media queries para ponerle un <code>display: none</code> en los viewports que hayas seleccionado. El contenido está ahí, simplemente no se ve.</p>
<p>Esto tiene implicaciones prácticas. Si ocultas una imagen pesada en móvil con esta funcionalidad, el navegador del móvil sigue descargando la imagen aunque no la muestre. Para casos donde el rendimiento es lo que te preocupa, la opción de «Omitir del contenido publicado» o el enfoque clásico con <code>render_block</code> y <code>wp_is_mobile()</code> siguen siendo mejor opción.</p>
<h2>La estructura técnica: metadatos del bloque</h2>
<p>La visibilidad se guarda en los metadatos del bloque, dentro de la clave <code>blockVisibility</code>. La estructura ha cambiado respecto a WordPress 6.9, que solo admitía un booleano.</p>
<p>Ocultar un bloque por completo sigue siendo igual:</p>
<pre>{
  "metadata": {
    "blockVisibility": false
  }
}</pre>
<p>La novedad es que ahora <code>blockVisibility</code> también puede ser un objeto con una clave <code>viewport</code>:</p>
<pre>{
  "metadata": {
    "blockVisibility": {
      "viewport": {
        "mobile": false,
        "tablet": true,
        "desktop": true
      }
    }
  }
}</pre>
<p>En este ejemplo, <code>mobile: false</code> significa que el bloque no se muestra en móvil. Los valores <code>true</code> o la ausencia de la clave significan que sí se muestra.</p>
<p>La clave <code>viewport</code> está anidada a propósito dentro de <code>blockVisibility</code>. La idea es que en futuras versiones se puedan añadir más criterios de visibilidad al mismo nivel (por ejemplo, por rol de usuario o por franjas horarias), sin romper la estructura actual.</p>
<p>En el markup serializado del bloque, queda así:</p>
<pre>&lt;!-- wp:paragraph {"metadata":{"blockVisibility":{"viewport":{"mobile":false}}}} --&gt;
&lt;p&gt;Este párrafo no se ve en móvil.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</pre>
<h3>Los breakpoints actuales</h3>
<p>WordPress 7.0 usa tres breakpoints fijos:</p>
<ul>
<li><strong>Móvil</strong>: pantallas de hasta 480px de ancho.</li>
<li><strong>Tableta</strong>: de 480px a 782px.</li>
<li><strong>Escritorio</strong>: más de 782px.</li>
</ul>
<p>Estos valores están definidos tanto en PHP (<code>lib/block-supports/block-visibility.php</code>) como en JavaScript (<code>packages/block-editor/src/components/block-visibility/constants.js</code>) y, al menos de momento, no se pueden cambiar ni desde <code>theme.json</code> ni desde ningún filtro.</p>
<p>El punto de corte de 782px te sonará si has trabajado con el admin de WordPress, que usa ese mismo valor para su diseño responsive. El de 480px coincide con los breakpoints de los estilos base de Gutenberg. No son valores especialmente estándar fuera de WordPress (muchos frameworks usan 768px para tablet), pero son coherentes con el resto del ecosistema.</p>
<h2>Qué necesitas saber si desarrollas temas o plugins</h2>
<p>Si tu tema o plugin genera, transforma o analiza markup de bloques en el servidor, ojo: el campo <code>blockVisibility</code> en los metadatos del bloque ahora puede ser dos cosas distintas. Hasta WordPress 6.9 era siempre un booleano (<code>false</code>). Desde WordPress 7.0 puede ser un booleano o un objeto con la estructura de <code>viewport</code> que acabamos de ver.</p>
<p>Si tu código asume que <code>blockVisibility</code> siempre es un valor escalar, va a petarte cuando se encuentre con un objeto. Revisa y adapta.</p>
<p>Si tus bloques no tocan el markup en el servidor, no tienes que hacer nada. La visibilidad por viewport es un block support que se aplica automáticamente. No hace falta declarar nada en el <code>block.json</code> de tus bloques.</p>
<p>Lo mismo se aplica a patrones y bloques reutilizables, de manera que si ya tienen reglas de visibilidad guardadas funcionan sin tocar nada.</p>
<h2>Adiós a los plugins de visibilidad por dispositivo</h2>
<p>Plugins como Block Visibility, EditorsKit o Conditional Blocks han hecho un trabajo estupendo cubriendo esta carencia durante años, pero si lo único que necesitabas era ocultar bloques por tipo de pantalla, a partir de WordPress 7.0 ya no necesitas ninguno de ellos para esta funcionalidad.</p>
<p>Ahora bien, si usas características más avanzadas de esos plugins (visibilidad por perfil de usuario, por fechas, por geolocalización, por parámetros de URL), esas cosas siguen sin estar por defecto en WordPress y vas a seguir necesitándolos. WordPress 7.0 solo cubre el caso de visibilidad por <code>viewport</code>, que es el más común y el que más gente pedía.</p>
<p>Y un detalle para quienes vengan de EditorsKit es que si lo desactivas las clases CSS que el plugin añadía a los bloques ocultos siguen estando en tu contenido. Los bloques volverán a mostrarse porque el CSS que los ocultaba ya no se carga.</p>
<p>La funcionalidad nativa de WordPress 7.0 usa un sistema diferente (metadatos del bloque, no clases CSS), así que no hay migración automática. Si tienes bloques ocultos con EditorsKit y quieres pasar al sistema nativo tendrás que reconfigurar la visibilidad bloque a bloque.</p>
<h2>Lo que falta y lo que viene en WordPress 7.1</h2>
<p>La funcionalidad de WordPress 7.0 es intencionalmente limitada. Se lanzó con lo mínimo para que funcione bien, y el plan es ampliarla en la próxima versión mayor.</p>
<p>Para WordPress 7.1 está previsto:</p>
<ul>
<li><strong>Breakpoints configurables desde theme.json</strong>: que cada tema pueda definir sus propios puntos de corte y etiquetas de viewport, en lugar de estar limitado a los tres valores fijos actuales.</li>
<li><strong>Control por tipo de bloque</strong>: que los temas puedan activar o desactivar la visibilidad por viewport para bloques concretos, igual que ya se hace con otros block supports como color o tipografía.</li>
<li><strong>Integración con el style engine</strong>: ahora mismo la propiedad CSS <code>display</code> necesita un workaround con el filtro KSES para funcionar. En 7.1 debería gestionarse de forma nativa.</li>
</ul>
<p>También hay debate abierto sobre si usar media queries de viewport es el enfoque correcto o si container queries serían más apropiadas para bloques individuales. Y sobre el formato de las media queries, que ahora usan la sintaxis moderna de rangos (<code>width &lt;= 480px</code>) en lugar del clásico <code>max-width</code>.</p>
<p>Si te interesa seguir el desarrollo, el <a href="https://github.com/WordPress/gutenberg/issues/75707" target="_blank" rel="nofollow noopener">issue #75707 en GitHub</a> es donde se está coordinando todo lo de WordPress 7.1. Y la <a href="https://make.wordpress.org/core/2026/03/15/block-visibility-in-wordpress-7-0/" target="_blank" rel="nofollow noopener">nota oficial de desarrollo de WordPress 7.0</a> tiene los detalles técnicos de lo que ya está funcionando.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/ocultar-bloques-por-dispositivo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tus propias noticias personalizadas como widget de escritorio en WordPress</title>
		<link>https://ayudawp.com/noticias-personalizadas-widget-escritorio-wordpress/</link>
					<comments>https://ayudawp.com/noticias-personalizadas-widget-escritorio-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 21 Apr 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[Functions]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[RSS]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158955</guid>

					<description><![CDATA[Si haces webs para clientes, un widget con tus noticias o las de su sector es un detalle de branding que se agradece mucho. El cliente entra al escritorio y ve información relevante en vez del blog de WordPress.org, que probablemente no le dice nada.]]></description>
										<content:encoded><![CDATA[<p>El escritorio de WordPress te recibe con un <strong>widget</strong> de «<strong>Eventos y noticias de WordPress</strong>» que, seamos sinceros, <strong>a la mayoría de usuarios les importa entre poco y nada</strong>.</p>
<p>Si gestionas webs para clientes es todavía peor, porque les estás mostrando <strong>información que no les aporta nada y ocupa un espacio que podría ser útil</strong>.</p>
<p>La buena noticia es que <strong>puedes cambiarlo por tus propias fuentes de noticias</strong>, ya sea con un poco de código o con un plugin que te lo deja todo listo. Aquí tienes las dos opciones.</p>
<p>Pero antes…</p>
<h2>¿Y para qué quiero noticias personalizadas en el escritorio de WordPress?</h2>
<p>Si haces webs para clientes, un widget con tus noticias o las de su sector es un <strong>detalle de branding</strong> que se agradece mucho. El cliente entra al escritorio y ve información relevante en vez del blog de WordPress.org, que probablemente no le dice nada.</p>
<p>También viene bien si tienes un equipo de redactores o editores y quieres que vean <strong>novedades del proyecto</strong>, <strong>fuentes de referencia del sector</strong> o <strong>avisos internos</strong> nada más acceder. Y si simplemente quieres tener a mano tus <strong>blogs favoritos sin salir de WordPress</strong>, pues también.</p>
<p>Casos típicos donde encaja bien:</p>
<ul>
<li><strong>Agencias y freelances</strong> que entregan proyectos a clientes y quieren dejar el <strong>escritorio personalizado</strong>.</li>
<li><strong>Medios y blogs</strong> con varios redactores, para compartir <strong>fuentes de información comunes</strong>.</li>
<li><strong>Intranets o sitios corporativos</strong> donde el escritorio es la primera pantalla que ven los usuarios.</li>
<li><strong>Tu propio WordPress</strong>, para tener <strong>las noticias que te interesan a un clic</strong>.</li>
</ul>
<p>Si aún tienes interés, vamos a las opciones…</p>
<h2>Opción rápida: código de funciones</h2>
<p>Si solo necesitas mostrar un par de feeds RSS en el escritorio y quieres algo ligero, con un snippet te sobra. Puedes añadirlo a tu <a href="https://ayudawp.com/crea-un-plugin-para-liberar-el-fichero-functions-php/" target="_blank" rel="noopener ugc">plugin de personalizaciones</a>, al <code>functions.php</code> de tu tema hijo o donde tú prefieras.</p>
<pre>&lt;?php
/**
 * Widget de escritorio con noticias RSS personalizadas.
 *
 * Sustituye el widget por defecto de WordPress por uno con tus feeds.
 * Quita la primera línea si vas a añadir el código al functions.php o
 * a un plugin de fragmentos de código. Déjala si lo subes como mu-plugin
 *
 * Personaliza los feeds en el array $feeds (url y título).
 * Ajusta $items_per_feed y $max_items a tu gusto.
 */

// Registra el widget personalizado y quita el de WordPress
add_action( 'wp_dashboard_setup', 'ayudawp_custom_news_widget_setup' );

function ayudawp_custom_news_widget_setup() {
    // Quita el widget por defecto de noticias y eventos de WordPress
    remove_meta_box( 'dashboard_primary', 'dashboard', 'side' );

    // Añade el widget personalizado
    wp_add_dashboard_widget(
        'ayudawp_custom_news',
        'Últimas noticias',  // Cambia el título a lo que quieras
        'ayudawp_custom_news_widget_output'
    );
}

function ayudawp_custom_news_widget_output() {
    // === PERSONALIZA AQUÍ ===
    // Añade o quita feeds a tu gusto
    $feeds = array(
        array(
            'url'   =&gt; 'https://ayudawp.com/feed/',
            'title' =&gt; 'Ayuda WordPress',
        ),
        array(
            'url'   =&gt; 'https://es.wordpress.org/news/feed/',
            'title' =&gt; 'WordPress España',
        ),
    );

    $items_per_feed = 3;  // Elementos por feed
    $max_items      = 8;  // Máximo total de elementos
    // === FIN DE PERSONALIZACIÓN ===

    include_once ABSPATH . WPINC . '/feed.php';

    $all_items = array();

    foreach ( $feeds as $feed_data ) {
        $rss = fetch_feed( $feed_data['url'] );

        if ( is_wp_error( $rss ) ) {
            continue;
        }

        $feed_items = $rss-&gt;get_items( 0, $items_per_feed );

        foreach ( $feed_items as $item ) {
            $all_items[] = array(
                'title'  =&gt; esc_html( $item-&gt;get_title() ),
                'link'   =&gt; esc_url( $item-&gt;get_permalink() ),
                'date'   =&gt; $item-&gt;get_date( 'U' ),
                'source' =&gt; esc_html( $feed_data['title'] ),
            );
        }
    }

    if ( empty( $all_items ) ) {
        echo '&lt;p&gt;' . esc_html__( 'No hay noticias disponibles.', 'ayudawp' ) . '&lt;/p&gt;';
        return;
    }

    // Ordena por fecha (más recientes primero)
    usort( $all_items, function ( $a, $b ) {
        return $b['date'] - $a['date'];
    } );

    // Limita al máximo configurado
    $all_items = array_slice( $all_items, 0, $max_items );

    echo '&lt;div class="rss-widget"&gt;&lt;ul&gt;';

    foreach ( $all_items as $item ) {
        printf(
            '&lt;li&gt;&lt;a href="%s" target="_blank" rel="noopener"&gt;%s&lt;/a&gt; &lt;span class="rss-date"&gt;%s&lt;/span&gt; &lt;cite&gt;%s&lt;/cite&gt;&lt;/li&gt;',
            esc_url( $item['link'] ),
            esc_html( $item['title'] ),
            esc_html( date_i18n( get_option( 'date_format' ), $item['date'] ) ),
            esc_html( $item['source'] )
        );
    }

    echo '&lt;/ul&gt;&lt;/div&gt;';
}</pre>
<p>[imagen del widget de noticias personalizado en el escritorio de WordPress]</p>
<p>Este código <strong>hace tres cosas</strong>:</p>
<ol>
<li>Quita el widget de noticias de WordPress por defecto</li>
<li>Añade uno nuevo con los feeds RSS que tú elijas</li>
<li>Los muestra ordenados por fecha.</li>
</ol>
<p>Lo que tienes que tocar está al principio de la función <code>ayudawp_custom_news_widget_output()</code>, el array <code>$feeds</code> con las URLs y nombres de tus feeds, <code>$items_per_feed</code> para cuántos elementos quieres de cada feed, y <code>$max_items</code> para el total que se muestra en el widget. También puedes cambiar el título del widget en la línea de <code>wp_add_dashboard_widget()</code>.</p>
<p>A diferencia del <code>wp_widget_rss_output()</code> que trae WordPress de serie, este código añade varios feeds y los mezcla ordenados por fecha, así ves las noticias más recientes de todas tus fuentes juntas.</p>
<p>Si quieres volver a mostrar el widget original de WordPress, solo tienes que quitar la línea del <code>remove_meta_box()</code>.</p>
<h2>Opción completa: plugin</h2>
<p>Si necesitas más control, o si gestionas sitios para clientes y quieres <strong>que el escritorio muestre información útil sin tocar código</strong>, el plugin <a href="https://es.wordpress.org/plugins/periscopio/" target="_blank" rel="nofollow noopener">Periscopio</a> te lo pone fácil.</p>
<p>Es un <strong>plugin gratuito que sustituye el widget de noticias por defecto por uno totalmente configurable</strong> desde una página de ajustes. Lo que te ofrece resumido, es esto:</p>
<ul>
<li>Feeds RSS ilimitados, con validación de URL antes de añadirlos y ordenados por fecha.</li>
<li>Sección de eventos de la comunidad WordPress con localidad personalizable (los saca de la API de WordPress.org).</li>
<li>Enlaces configurables en el pie del widget, tanto en la sección de eventos como en la de noticias.</li>
<li>Título del widget editable.</li>
<li>Caché configurable (de 1 a 72 horas) con opción de vaciarla manualmente.</li>
<li>Posibilidad de ocultar el widget original de WordPress o dejarlo junto al tuyo.</li>
</ul>
<h3>Instalación y configuración</h3>
<p>Lo instalas como cualquier otro plugin desde el directorio de WordPress.org. Una vez activado, ve a <strong>Ajustes &gt; Periscopio</strong> y ahí tienes todo.</p>
<p><a href="https://ayudawp.com/?attachment_id=158961" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158961 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/periscopio-wordpress-ajustes-1200x733.jpg" alt="periscopio wordpress ajustes" width="1200" height="733" srcset="https://ayudawp.com/wp-content/uploads/2026/04/periscopio-wordpress-ajustes-1200x733.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/periscopio-wordpress-ajustes-768x469.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/periscopio-wordpress-ajustes-1536x938.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/periscopio-wordpress-ajustes.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>La página de ajustes está dividida en secciones al estilo clásico de WordPress. En la parte de feeds <strong>puedes añadir las URLs que quieras</strong>, y el plugin las valida antes de guardarlas para evitar errores.</p>
<p>También puedes configurar <strong>cuántos elementos quieres por feed</strong> y el máximo total.</p>
<p>Periscopio viene con <strong>cinco feeds preconfigurados</strong> (WordPress.org, el blog de Matt Mullenweg, Make WordPress, WordPress España y Ayuda WordPress), pero <strong>puedes cambiarlos todos desde el minuto cero</strong>.</p>
<h3>¿Qué tal queda?</h3>
<p><a href="https://ayudawp.com/?attachment_id=158960" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158960 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/widget-escritorio-wordpress-noticias-personalizadas-1200x678.jpg" alt="widget escritorio wordpress noticias personalizadas" width="1200" height="678" srcset="https://ayudawp.com/wp-content/uploads/2026/04/widget-escritorio-wordpress-noticias-personalizadas-1200x678.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/widget-escritorio-wordpress-noticias-personalizadas-768x434.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/widget-escritorio-wordpress-noticias-personalizadas-1536x867.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/widget-escritorio-wordpress-noticias-personalizadas.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>El widget <strong>queda integrado con el estilo nativo de WordPress</strong>, así que no desentona, pero con algún detalle que, aunque está mal que lo diga yo, <strong>mejora al widget que trae WordPress por defecto</strong>.</p>
<p>Los eventos aparecen arriba con información de WordCamps y quedadas cercanas a tu localidad, que puedes modificar, y debajo las noticias de tus feeds mezcladas y ordenadas por fecha.</p>
<h2>¿Cuándo usar cada opción?</h2>
<p>Si es para ti, para un proyecto concreto o simplemente quieres un par de feeds sin complicarte, el código te vale de sobra.</p>
<p>Si <strong>gestionas varios sitios, trabajas con clientes o necesitas la parte de eventos y una gestión de feeds más cómoda</strong> (con validación, caché y ajustes visuales), Periscopio te ahorra tiempo y te ofrece mucha más personalización a golpe de clic.</p>
<hr>
<p>Para seguir enredando con códigos de este tipo relacionados con el mismo asunto, con los widgets de escritorio, también puedes probar como <a href="https://ayudawp.com/crea-tus-propios-widgets-para-el-escritorio-de-wordpress/" target="_blank" rel="noopener ugc">crear widgets de escritorio con contenido propio</a> (no RSS) o <a href="https://ayudawp.com/widget-escritorio-soporte/" target="_blank" rel="noopener ugc">añadir un formulario de soporte para tus clientes</a>, tienes más ideas en el blog.</p>
<p>Y si lo que quieres es <a href="https://ayudawp.com/quitar-widgets-por-defecto-en-el-escritorio/" target="_blank" rel="noopener ugc">directamente limpiar el escritorio de cajas que no uses</a>, también puedes hacerlo con un par de líneas de código.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/noticias-personalizadas-widget-escritorio-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¡¿WordPress es una mentira?!</title>
		<link>https://ayudawp.com/wordpress-es-una-mentira/</link>
					<comments>https://ayudawp.com/wordpress-es-una-mentira/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 20 Apr 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Automattic]]></category>
		<category><![CDATA[Matt Mullenweg]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=159056</guid>

					<description><![CDATA[Entiendo tu frustración después de 15 años, yo llevo algunos más y también me frustro con WordPress a menudo.]]></description>
										<content:encoded><![CDATA[<p>Querido Marcin…</p>
<p>Llevo unos días viendo circular <a href="https://marcindudek.dev/blog/wordpress-manifesto/" target="_blank" rel="nofollow noopener">tu manifiesto contra WordPress</a>, eso que empezó como un tuit largo, luego ampliaste en tu blog y que hasta Matt Mullenweg te ofreció quedar por Zoom, como dijo, «<em>aunque no sea para responder, solo para entender de dónde sacas estas conclusiones</em>». <strong>Un exitazo</strong>.</p>
<p>Esta respuesta seguro que no llega tan lejos, está escrita por un bloguero hispano, y no solemos captar la atención del mundo anglo, por lo que sea, pero alguien la leerá.</p>
<p>Así que voy a tomarte aparte un momento, como un colega que lleva solo unos pocos más años que tú en esto, porque <strong>tu manifiesto tiene cosas con parte de razón, otras que son medias verdades y unas cuantas que son directamente falsas</strong>. Mezclarlas todas con el mismo volumen no es una llamada de atención, es ruido, o eso me ha parecido.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-159064 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/WordPress-is-a-lie-1200x1211.jpg" alt="" width="1200" height="1211" srcset="https://ayudawp.com/wp-content/uploads/2026/04/WordPress-is-a-lie-1200x1211.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/WordPress-is-a-lie-150x150.jpg 150w, https://ayudawp.com/wp-content/uploads/2026/04/WordPress-is-a-lie-768x775.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/WordPress-is-a-lie.jpg 1310w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<h2>En lo que sí tienes razón</h2>
<p>Vamos a empezar por <strong>lo que suscribo del todo</strong>, ¿te parece?</p>
<ul>
<li>La interfaz para <strong>desactivar comentarios</strong> en todo el sitio es un lío absurdo repartido por media docena de pantallas, tienes razón.  Yo mismo he compartido <a href="https://ayudawp.com/desactivar-funcionalidades-wordpress/" target="_blank" rel="noopener">como quitar estas mierdas</a>, pero sí, es un jaleo.</li>
<li>El <code>/wp-admin/options.php</code> existe desde siempre, es súper útil, y no hay un solo enlace visible en el escritorio. Ahora, también te digo que <a href="https://ayudawp.com/accede-a-todas-las-opciones-de-wordpress/" target="_blank" rel="noopener">esa pantalla de opciones al completo una burrada</a>, y el 90% de los usuarios no deberían tocar ahí.</li>
<li>El <a href="https://ayudawp.com/modo-recuperacion-wordpress/" target="_blank" rel="noopener">modo de recuperación</a> mandando el <strong>aviso solo al email del admin principal</strong> cuando un sitio tiene varios administradores es un fallo de diseño de libro. Como todo en WordPress <a href="https://ayudawp.com/errores-modo-recuperacion-wordpress/" target="_blank" rel="noopener">se puede personalizar con un sencillo filtro</a>, pero razón tienes.</li>
<li>Y sí, también, <strong>contribuir al core puede ser frustrante y lento</strong>.</li>
</ul>
<p><strong>Todo eso lo firmo contigo</strong>, son críticas lógicas, más que lógicas, <strong>tienes más razón que un santo</strong>.</p>
<h2>Las medias verdades</h2>
<p>Aquí empezamos a tener un problema tú y yo (dialéctico, por supuesto).</p>
<p>Dices que en una instalación limpia «<em>XML-RPC está abierto de par en par</em>» y «<em>en cuanto publicas, los bots empiezan a hacer fuerza bruta contra wp-login</em>», y <strong>estás mezclando dos cosas que no son lo mismo</strong>.</p>
<p><strong>XML-RPC</strong> es un puerta abierta a posibles ataques, correcto, pero los ataques a <code>wp-login.php</code> son otro, y cualquier hosting decente (<a href="https://ayudawp.com/hosting-wordpress/" target="_blank" rel="noopener ugc">SiteGround</a>, Kinsta, Cloudways) los frena de serie, y si tu hosting no lo hace tampoco necesitas un plugin de seguridad de 80 euros al año con mil opciones que no vas a tocar. Con uno pequeño y enfocado basta, y para eso tienes este gratuito, <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="noopener ugc">Vigilante</a>, que hace eso y mucho más.</p>
<p>Luego dices que «<em>necesitas un plugin para <code>meta titles</code>, <code>descriptions</code>, <code>meta tags</code> básicas, en 2026, no hay excusa, el SEO debería ser nativo</em>».</p>
<p>Marcin, querido amigo, <strong>WordPress tiene mapas del sitio nativos desde la versión 5.5</strong>, tiene <code>wp_robots</code>, tiene <strong>canonical automático</strong>, las <code>title tags</code> los gestiona el tema con <code>title-tag</code> desde hace una década. Lo que no tiene es un panel tipo Yoast, y eso es otra cosa muy distinta a «<strong>no tiene SEO</strong>».</p>
<p><strong>Los huecos que deja el core se tapan con plugins pequeños y enfocados, no con un stack de diez suscripciones anuales</strong> como pintas tú. Yo mismo tengo compartidos gratis tres que ejemplifican justo lo contrario de lo que denuncias:</p>
<ul>
<li><a href="https://github.com/fernandotellado/open-graph-tags-wordpress" target="_blank" rel="nofollow noopener">Automatic Open Graph Tags</a>, un sencillo código (o plugin si lo prefieres) que <strong>añade Open Graph y Twitter Cards sin configuración</strong>. Cero ajustes, cero suscripciones, gratis del todo.</li>
<li><a href="https://es.wordpress.org/plugins/native-sitemap-customizer/" target="_blank" rel="noopener ugc">Native Sitemap Customizer</a>, que te deja <strong>personalizar el mapa del sitio que ya trae WordPress</strong>, sin instalar otro plugin que reinvente la rueda.</li>
<li><a href="https://es.wordpress.org/plugins/noindexer/" target="_blank" rel="noopener ugc">NoIndexer</a>, para <strong>marcar <code>noindex</code> selectivo</strong> en contenidos concretos.</li>
</ul>
<p>Los tres son gratis, los tres hacen una sola cosa y la hacen bien, los tres son <strong>gratis y disponibles para quien quiera utilizarlos</strong>, ninguno tiene versión pro, ni suscripción, ni muro de pago. Así que lo de «<em>WordPress te obliga a un stack de plugins de pago para tener SEO</em>» <strong>es falso</strong>. Hay ecosistema de sobra, y encima gratis, pero hay que buscarlo.</p>
<p>Otra que (casi) me ha dolido leer: «<em>…el hosting es barato porque WordPress funciona en PHP antiguo y en servidores compartidos cutres</em>». Esto es <strong>falso de principio a fin</strong>.</p>
<p>El core admite PHP 8.3, el mínimo recomendado lo suben con cada versión, y <strong>si tu hosting te deja tirado en PHP 7.2 el problema es tu hosting no WordPress</strong>. Echarle la culpa al CMS de que el hosting barato sea malo es como culpar al coche de que la gasolina sea de garrafa.</p>
<p>Y, aunque ya te he dicho antes que te suscribo la mayor en esto de contribuir al core, la anécdota del «<em>cogí un bug de la lista de good first bugs, mandé mi PR y nadie me contestó</em>» es ¿cómo decirte?.</p>
<p>Vale, contribuir al core es lento, a veces una putada, eso lo he suscrito, lo firmo si quieres, pero tu anécdota no demuestra que sea imposible, lo que demuestra es que con una experiencia, la tuya, te desanimaste y escribiste un manifiesto. Que es perfectamente legítimo, no digo que no lo sea, solo faltaría, pero no es lo mismo.</p>
<p>Yo mismo he mandado reportes en varias ocasiones y el baile de cambio de sitios donde informar llega a ser hasta molesto, pero bueno, luego me acuerdo de que <strong>todos somos voluntarios</strong> (por si se te había olvidado) y se me pasa y a otra cosa.</p>
<h2>Así se critica WordPress</h2>
<p>Aquí viene la parte que más me gusta de todo esto, porque mientras tras escribir tu manifiesto, <a href="https://profiles.wordpress.org/nickhamze/" target="_blank" rel="nofollow noopener">Nick Hamze</a> leyó lo mismo que hemos leído todos y pensó otra cosa…</p>
<p>De todos los puntos de tu manifiesto <strong>lo del modo de recuperación</strong> era el único con un fallo concreto y en el que se podía aportar algo funcional. Así que en vez de escribir otra réplica, Nick hizo algo distinto, <a href="https://gist.github.com/nickhamze/74380ca440577800d6c38e1280374fa3" target="_blank" rel="nofollow noopener">cogió el bug, escribió el parche</a>, lo acompañó de cuatro tests unitarios, investigó los tickets de Trac relacionados (el #51267, el #47192, el #47352, el #47939) y lo publicó en <strong>un gist listo para que alguien lo lleve al core</strong>.</p>
<p>Incluye hasta el razonamiento de por qué el parche es defendible pese al ticket que se cerró como «<em>invalid</em>» en 2020, y sugiere cómo plantearlo en Trac si hay reticencias.</p>
<p><strong>Eso es contribuir</strong>. Eso, en un rato de sábado por la mañana, vale más que todo tu manifiesto junto, y que este post mío. Desmonta tu queja principal, la de «<em>no se puede aportar a core, el pipeline está cerrado</em>», mejor que cualquier argumento que yo te pueda dar. Nick no ha pedido permiso, no ha esperado a que alguien le conteste en Slack, no ha escrito sobre lo roto que está el sistema, ha escrito el código, <strong>ha hecho WordPress</strong>.</p>
<h2>Lo que no se puede rebatir, solo discutir</h2>
<p>Queda <strong>la parte grande de tu manifiesto</strong>, la de Automattic, WP Engine, la GPL como «estafa», la «comunidad» como ficción. Aquí <strong>no hay hechos que rebatir, hay una visión, una opinión</strong>. Y las opiniones se debaten, no se discuten ni desmontan.</p>
<p>Mi visión rápida es que sí, hay tensiones, y sí, Automattic es una empresa que extrae valor. Otro sí es que <strong>el caso WP Engine es feo y ha dejado mal sabor a mucha gente, yo mismo llevo un año criticando estas posturas</strong>.</p>
<p>Ahora bien, llamar a todo esto «<em>un estanque con un solo pez grande</em>» ignora que <strong>hay miles de desarrolladores ganándose la vida con WordPress sin que Automattic se les haya comido nada</strong>, cientos de plugins pequeños honestos, comunidades locales que sí funcionan, yo mismo he ayudado a organizar unas cuantas y te aseguro que <strong>la gente no va a WordCamp Logroño o la Meetup de Sevilla porque Automattic les obligue</strong>.</p>
<p>Tu retrato es cinematográfico, queda muy bien, pero no cuadra con lo que yo veo cada día.</p>
<p>Y la teoría de que «<em>nadie en el poder quiere que core sea bueno porque se cargaría a los desarrolladores de plugins</em>» es, con todo el cariño, una tontería que mejora las de Automattic, que las tiene, convirtiéndola en villana cuando <strong>la realidad es mucho más aburrida</strong>, y es que el core va lento porque tiene <strong>20 años de deuda técnica, millones de sitios que no pueden romper, y un equipo humano limitado</strong>.</p>
<p>Ni conspiración ni colapso, solo software viejo.</p>
<h2>Querido Marcin, para cerrar</h2>
<p>Entiendo tu <strong>frustración después de 15 años</strong>, yo llevo algunos más y también me frustro con WordPress a menudo.</p>
<p>Pero también te digo que escribir un manifiesto con más pasión que datos, mezclar bugs reales con teorías sobre el pez grande que se come a los pequeños y llamar «<em>colapso hasta en el calendario</em>» a un CMS que mueve el 43% de la web no es una llamada a las armas, más parece un hilo de X buscando ruido. Algo ya lo sabes tú, porque cuando Mullenweg te respondió ofreciéndote sentaros a hablarlo, tu primera reacción fue dudar de si iba en serio.</p>
<p><strong>WordPress tiene problemas</strong>, varios, y algunos de los que señalas son reales, pero se arreglan como hizo Nick Hamze, con un <code>.diff</code> y cuatro tests unitarios, o compartiendo plugins gratis y tutoriales a diario desde hace 20 años, como este humilde bloguero español, no con un manifiesto en Twitter.</p>
<p>Un abrazo desde España, de un veterano a otro. Ya me perdonarás los puntillos de ironía, pero seguro que si coincidimos en persona entenderás que soy un poco capullo, es mi particular sentido del (cuestionable) humor.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/wordpress-es-una-mentira/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>«Esta entrada usa plugins que no son compatibles con la colaboración en tiempo real»</title>
		<link>https://ayudawp.com/plugins-incompatibles-colaboracion-tiempo-real/</link>
					<comments>https://ayudawp.com/plugins-incompatibles-colaboracion-tiempo-real/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 16 Apr 2026 06: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[Avanzado]]></category>
		<category><![CDATA[Colaboración en tiempo real]]></category>
		<category><![CDATA[Editor de WordPress]]></category>
		<category><![CDATA[Experto]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158832</guid>

					<description><![CDATA[Desde WordPress 7.0 está disponible la colaboración en tiempo real en el editor de bloques para que dos o más personas pueden editar la misma entrada a la vez, al estilo Google Docs. Peeeero … es posible que que te hayas topado con un mensaje que corta de raíz la experiencia.]]></description>
										<content:encoded><![CDATA[<p>Desde WordPress 7.0 está disponible una de las novedades más anunciadas de los últimos años, la <strong>colaboración en tiempo real en el editor de bloques</strong>. Con esta funcionalidad dos o más personas pueden editar la misma entrada a la vez, al estilo Google Docs, viendo los cambios del otro al momento. Hasta aquí bien, peeeero … es posible que que te hayas topado con un mensaje que corta de raíz la experiencia.</p>
<p>Al abrir una entrada que otro usuario ya está editando, en lugar de entrar en modo colaborativo, WordPress te muestra el aviso «<strong>Esta entrada ya está siendo editada</strong>» de siempre, pero con un cambio, este mensaje añadido:</p>
<blockquote><p><em>«Debido a que esta entrada usa <strong>plugins que no son compatibles con la colaboración en tiempo real</strong> solo una persona puede editarla al mismo tiempo.»</em></p></blockquote>
<p>Te da dos opciones, o «<strong>Tomar posesión</strong>» o «<strong>Salir del editor</strong>«, o sea, el bloqueo de siempre. Y lo más frustrante es que no te dice qué plugin es el incompatible, ni un nombre, ni una pista, te toca adivinarlo.</p>
<p><a href="https://ayudawp.com/?attachment_id=158844" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158844 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/aviso-plugin-incompatible-colaboracion-en-tiempo-real-wordpress-1200x675.jpg" alt="aviso plugin incompatible colaboracion en tiempo real wordpress" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/04/aviso-plugin-incompatible-colaboracion-en-tiempo-real-wordpress-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/aviso-plugin-incompatible-colaboracion-en-tiempo-real-wordpress-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/aviso-plugin-incompatible-colaboracion-en-tiempo-real-wordpress-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/aviso-plugin-incompatible-colaboracion-en-tiempo-real-wordpress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>En este artículo te explico <strong>por qué sale este aviso, cómo encontrar el plugin que lo provoca, qué hacer si no eres desarrollador, y cómo corregir la incompatibilidad</strong> si mantienes plugins propios, con ejemplo real incluido.</p>
<p>Pero no adelantemos acontecimientos, que igual no sabes qué leches es esto de la colaboración en tiempo real. Te lo cuento.</p>
<h2>Qué es la colaboración en tiempo real de WordPress</h2>
<p>Hasta ahora, cuando alguien estaba editando una entrada en WordPress, el resto de usuarios quedaban bloqueados. Podías tomar posesión del post o irte, pero editar a la vez no era posible. Desde WordPress 7.0 esto cambia.</p>
<p><strong>La colaboración en tiempo real (RTC) permite que dos o más personas editen el mismo contenido a la vez</strong>. Ves el cursor del otro usuario, sus cambios aparecen en tu pantalla al momento y el sistema se encarga de que no haya conflictos. Por debajo usa <a href="https://yjs.dev/" target="_blank" rel="nofollow noopener">Yjs</a>, una librería del tipo <code>CRDT</code> (Conflict-free Replicated Data Type) que resuelve los conflictos de edición sin perder datos.</p>
<p>Por defecto, WordPress usa <code>HTTP polling</code> como transporte, lo que significa que los clientes envían y reciben cambios a través de peticiones HTTP normales. No es lo más rápido del mundo, pero funciona en cualquier hosting sin necesidad de WebSockets ni configuración especial. Los proveedores de hosting que quieran ofrecer una experiencia mejor pueden sustituir el transporte por WebSockets usando el filtro <code>sync.providers</code>.</p>
<p>Desde las primeras betas de WordPress 7.0, la funcionalidad se ha podido activar manualmente desde <code>Ajustes &gt; Escritura</code>, marcando la casilla ahí incluida, que por defecto se decidió que estuviese inactiva por defecto, ya que en realidad es muy poca gente quien va a usar esta herramienta y consume recursos.</p>
<p>También hay una constante, <code>WP_ALLOW_COLLABORATION</code> que puedes añadir en <code>wp-config.php</code> y permite activar o desactivar la funcionalidad si pasar por los ajustes, así:</p>
<pre>define( 'WP_ALLOW_COLLABORATION', true );</pre>
<h3>Cómo funcionan las tripas de la sincronización en la RTC</h3>
<p>La sincronización, como te acabo de comentar, se basa en Yjs, una librería de CRDT que <strong>permite que varios clientes editen el mismo documento</strong> sin coordinación central. Cada cambio se codifica como una operación CRDT que se puede aplicar en cualquier orden y siempre lleva al mismo resultado.</p>
<p>El proveedor de transporte mediante <code>HTTP polling</code> hace que los clientes envíen y reciban actualizaciones a través de la REST API de WordPress. Los datos CRDT se almacenan en <code>post_meta</code> en un tipo de contenido interno llamado <code>wp_sync_storage</code> (uno por documento). Las actualizaciones se agrupan en lotes y se compactan periódicamente.</p>
<p>WordPress 7.0 limita inicialmente la colaboración a dos usuarios simultáneos para proteger a los hosting. El equipo de desarrollo ha mencionado varias veces que será configurable desde el wp-config, pero a fecha de hoy todavía no se ha documentado el nombre concreto de esa constante. Los proveedores de hosting también pueden sustituir el transporte HTTP por WebSockets usando el filtro <code>sync.providers</code> para una latencia menor y mejor rendimiento con más usuarios.</p>
<p>Todo lo que pasa por los data stores de WordPress (<code>core/editor</code>, <code>core/block-editor</code>) se sincroniza automáticamente. Eso incluye los atributos de los bloques, el título, el extracto y el post meta registrado con <code>show_in_rest</code>. Lo que no pasa por esos data stores (meta boxes clásicas, handlers de <code>save_post</code>, scripts que modifican el DOM directamente) no se sincroniza.</p>
<p>Lo sé, es un poco técnico, pero es que este artículo es tanto para usuarios como para desarrolladores. No voy a hacer preguntas ni cuenta como nota para examen alguno. Seguimos…</p>
<h2>Por qué sale el aviso de plugins no compatibles</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158843 size-full" src="https://ayudawp.com/wp-content/uploads/2026/04/entrada-siendo-editada-colaboracion-en-tiempo-real-wordpress.jpg" alt="entrada siendo editada colaboracion en tiempo real wordpress" width="1014" height="700" srcset="https://ayudawp.com/wp-content/uploads/2026/04/entrada-siendo-editada-colaboracion-en-tiempo-real-wordpress.jpg 1014w, https://ayudawp.com/wp-content/uploads/2026/04/entrada-siendo-editada-colaboracion-en-tiempo-real-wordpress-768x530.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/entrada-siendo-editada-colaboracion-en-tiempo-real-wordpress-260x180.jpg 260w" sizes="auto, (max-width: 1014px) 100vw, 1014px"></p>
<p><strong>La colaboración en tiempo real sincroniza el estado del editor a través de los almacenamientos de datos</strong> de WordPress y Yjs. Todo lo que pasa por ahí (atributos de bloques, post meta registrado con <code>show_in_rest</code>) se sincroniza automáticamente entre los usuarios conectados.</p>
<p>Pero <strong>las cajas meta clásicas no pasan por ahí</strong>. Una caja meta clásica (registrada con <code>add_meta_box()</code>) procesa HTML directamente y guarda sus datos a través de un gancho de <code>save_post</code>. Ese flujo no tiene nada que ver con el almacenamiento de datos de Gutenberg, así que <strong>los cambios que hagas en una caja meta clásica no se sincronizan</strong> con el otro usuario. Si los dos editáis a la vez, <strong>uno puede machacar los cambios del otro</strong> sin darse cuenta.</p>
<p>Para evitar eso, <strong>WordPress toma una decisión radical</strong>, y es que <strong>si detecta que hay cajas meta clásicas registradas en el editor desactiva la colaboración</strong> entera y te muestra el aviso. No intenta sincronizar unas cosas sí y otras no, simplemente la apaga.</p>
<h2>Cómo encontrar el plugin culpable</h2>
<p>Esta es la parte que a todo el mundo le interesa, seas usuario o desarrollador. WordPress no te dice qué plugin es, así que te toca investigar. Hay varias formas de hacerlo, de más fácil a más técnica.</p>
<h3>Descarte por desactivación (el más fiable)</h3>
<p>La forma más rápida y segura de identificar el plugin que bloquea la colaboración es esta:</p>
<ol>
<li>Asegúrate de que la colaboración en tiempo real está activada en <code>Ajustes &gt; Escritura</code>.</li>
<li>Desactiva todos los plugins.</li>
<li>Abre una entrada con dos usuarios a la vez y comprueba que la colaboración funciona (deberías ver el cursor del otro usuario).</li>
<li>Ve activando los plugins uno a uno.</li>
<li>Después de activar cada plugin, vuelve a abrir la entrada con los dos usuarios.</li>
<li>Cuando la colaboración deje de funcionar y te vuelva a salir el aviso, ese es el plugin problemático.</li>
</ol>
<p>Es el método clásico de descarte. Lleva un rato, pero <strong>no falla</strong>, es gratis y tiene cero curva de aprendizaje, es para todos los públicos.</p>
<h3>Mirar la parte inferior del editor</h3>
<p>Fíjate en la captura del aviso, en la parte inferior de la pantalla del editor se ve el texto «<strong>Cajas meta</strong>» con un desplegable.</p>
<p><a href="https://ayudawp.com/?attachment_id=158850" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158850 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/04/cajas-meta-editor-bloques-wordpress-1200x675.jpg" alt="cajas meta editor bloques wordpress" width="1200" height="675" srcset="https://ayudawp.com/wp-content/uploads/2026/04/cajas-meta-editor-bloques-wordpress-1200x675.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/04/cajas-meta-editor-bloques-wordpress-768x432.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/04/cajas-meta-editor-bloques-wordpress-1536x864.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/04/cajas-meta-editor-bloques-wordpress.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Si algún plugin ha registrado cajas meta en ese contenido las verás listadas ahí. Eso ya te da una pista de cuáles son los candidatos, pero <strong>no es definitivo, porque a veces tampoco el editor las coloca ahí abajo</strong>.</p>
<h3>Buscar en el código (para desarrolladores)</h3>
<p>Si tienes acceso por SSH o FTP a tu servidor, un grep rápido te da la lista de todos los plugins que registran meta boxes:</p>
<pre>grep -r "add_meta_box" wp-content/plugins/ --include="*.php" -l</pre>
<blockquote><p><strong>Nota importante</strong>: No todos los plugins que registran cajas meta causan el problema. Solo los que las registran en tipos de contenido donde quieras usar la colaboración. Un plugin que solo registra cajas meta en una pantalla de ajustes o en un tipo de contenido personalizado que no uses para colaborar no va a interferir.</p></blockquote>
<h3>Query Monitor</h3>
<p>Esa joya de plugin por el que nunca estaremos suficientemente agradecidos, <a href="https://ayudawp.com/query-monitor/" target="_blank" rel="noopener ugc">Query Monitor</a>, te <strong>muestra las cajas meta registradas y qué componente las ha registrado</strong>. Con eso puedes identificar rápidamente qué plugin está añadiendo cajas meta al editor.</p>
<h2>Qué hacer si no eres desarrollador</h2>
<p>Si has identificado el plugin que causa el problema y no tienes ni idea de programación tienes dos opciones, ambas igual de válidas, pero mejor siempre la primera.</p>
<h3>Contactar con el desarrollador del plugin</h3>
<p>Esta es la mejor opción. Ve al repositorio del plugin en WordPress.org, busca el foro de soporte y abre un hilo explicando el problema. Algo así:</p>
<p style="padding-left: 40px;"><em>«He activado la colaboración en tiempo real de WordPress 7.0 y el editor me muestra el aviso ‘Debido a que esta entrada usa plugins que no son compatibles con la colaboración en tiempo real solo una persona puede editarla al mismo tiempo’. He comprobado por descarte que el plugin que lo provoca es el vuestro. ¿Tenéis previsto hacerlo compatible?»</em></p>
<p>Si el desarrollador del plugin lee español, puedes enlazarle este artículo directamente, que más abajo tiene la explicación técnica y el código necesario para hacer la corrección. Si solo lee inglés, la <a href="https://make.wordpress.org/core/2026/03/10/real-time-collaboration-in-the-block-editor/" target="_blank" rel="nofollow noopener">nota oficial de desarrollo</a> y el documento de <a href="https://github.com/Automattic/vip-real-time-collaboration/blob/trunk/docs/COMMON_ISSUES.md" target="_blank" rel="nofollow noopener">problemas comunes de VIP</a> tienen toda la información que necesita.</p>
<h3>Decidir qué prefieres: el plugin o la colaboración</h3>
<p>Mientras el desarrollador actualiza el plugin (si lo hace) tienes que elegir. Si la funcionalidad que aporta el plugin no es imprescindible para ti, desactívalo y disfruta de la colaboración en tiempo real. Si el plugin te hace más falta que la colaboración déjalo activo y sigue editando como siempre, con el bloqueo de edición compartida de siempre.</p>
<p>No es la situación ideal, pero es la realidad de una versión mayor que cambia algo tan de base como el modelo de edición de WordPress. Con el tiempo, la mayoría de plugins se irán adaptando.</p>
<h2>Los cuatro problemas de compatibilidad más comunes (para desarrolladores)</h2>
<p>A partir de aquí el artículo se pone más técnico. Si desarrollas o mantienes plugins de WordPress, esto te interesa. La <a href="https://make.wordpress.org/core/2026/03/10/real-time-collaboration-in-the-block-editor/" target="_blank" rel="nofollow noopener">dev note oficial</a> y la <a href="https://github.com/Automattic/vip-real-time-collaboration/blob/trunk/docs/COMMON_ISSUES.md" target="_blank" rel="nofollow noopener">documentación de WordPress VIP</a> identifican cuatro patrones que causan problemas con la colaboración en tiempo real.</p>
<h3>Cajas meta clásicas (el caso más frecuente)</h3>
<p>Si tu plugin registra una meta box con <code>add_meta_box()</code> y guarda datos con un gancho de <code>save_post</code>, WordPress desactiva la colaboración para ese tipo de post. Da igual que la meta box sea pequeña o que solo tenga un checkbox. Si está ahí, la colaboración se apaga.</p>
<p>La solución es migrar la funcionalidad a un panel en el sidebar del editor de bloques (usando <code>PluginDocumentSettingPanel</code>) y asegurarte de que el post meta esté registrado con <code>show_in_rest =&gt; true</code>. La meta box clásica puedes mantenerla como fallback para el editor clásico.</p>
<h3>Inputs no controlados que no reflejan cambios externos</h3>
<p>Esto afecta a plugins que ya tienen interfaz en el editor de bloques, pero la han construido usando <code>defaultValue</code> en lugar de <code>value</code> en los inputs. Un input con <code>defaultValue</code> solo responde a lo que escribe el usuario local, no a los cambios que llegan de otros clientes.</p>
<p>La solución: usa siempre inputs controlados con <code>value</code>, derivando ese valor del data store de WordPress con <code>useSelect</code>.</p>
<h3>Estado local con useState que desconecta del data store</h3>
<p>Otro error habitual: copiar el valor del data store a un <code>useState</code> local. En el momento que haces eso, tu componente se desconecta del estado compartido. Las actualizaciones de otros usuarios llegan al data store, pero tu componente sigue mostrando la copia local que hizo al montarse.</p>
<p>La regla: no copies datos compartidos a <code>useState</code>. Lee siempre directamente del data store.</p>
<h3>Bloques con efectos secundarios al insertarse</h3>
<p>Si tienes un bloque personalizado que abre un modal automáticamente cuando se inserta, ese modal se abrirá para todos los usuarios conectados, porque el contenido del bloque se sincroniza de inmediato.</p>
<p>La solución: en lugar de abrir el modal automáticamente, muestra un placeholder con un botón que abra el modal al hacer clic. Así el efecto es local y voluntario.</p>
<h2>Ejemplo práctico: Adaptando el plugin AI Share &amp; Summarize</h2>
<p>Vamos a verlo con un caso real, mi plugin <a href="https://es.wordpress.org/plugins/ai-share-summarize/" target="_blank" rel="nofollow noopener">AI Share &amp; Summarize</a>, que tiene una caja meta en la barra lateral del editor que permite ocultar los botones de compartir en entradas o páginas individuales. Es una casilla sencilla, pero esa caja meta clásica es suficiente para que WordPress desactive la colaboración en tiempo real en todos los tipos de contenido donde esté registrada. Pequeñita pero potente ¿no?</p>
<p>Vamos a ver el código actual, entender por qué falla y hacer las modificaciones necesarias paso a paso.</p>
<h3>El código actual y por qué causa el problema</h3>
<p>El archivo <code>includes/class-meta-box.php</code> del plugin hace tres cosas: registra el post meta con <code>register_post_meta()</code> y <code>show_in_rest =&gt; true</code> (esto está bien hecho), registra una caja meta clásica con <code>add_meta_box()</code> (esto causa el problema) y guarda los datos desde un gancho de <code>save_post</code> (necesario para el editor clásico, pero innecesario en el de bloques).</p>
<p>La buena noticia es que la parte más complicada ya está resuelta, porque el meta está correctamente registrado para la REST API. Solo necesitamos cuatro cambios.</p>
<h3>Paso 1: Añadir revisions_enabled al registro del meta</h3>
<p>La nota para desarrolladores de WordPress 7.0 recomienda que el post meta registrado para la colaboración tenga <code>revisions_enabled =&gt; true</code>. Esto hace que los cambios en el meta se registren en el historial de revisiones, algo que viene muy bien cuando hay varios editores trabajando a la vez.</p>
<p>En el método <code>ayudawp_register_meta()</code>, añade el parámetro:</p>
<pre>public function ayudawp_register_meta() {
    $post_types = get_post_types( array( 'public' =&gt; true ), 'names' );

    foreach ( $post_types as $post_type ) {
        register_post_meta( $post_type, self::META_KEY, array(
            'show_in_rest'      =&gt; true,
            'single'            =&gt; true,
            'type'              =&gt; 'boolean',
            'default'           =&gt; false,
            'revisions_enabled' =&gt; true, // Track changes in revision history.
            'auth_callback'     =&gt; function() {
                return current_user_can( 'edit_posts' );
            },
        ) );
    }
}</pre>
<h3>Paso 2: Registrar la meta box solo en el editor clásico</h3>
<p>Este es el cambio clave. Necesitamos que <code>add_meta_box()</code> solo se ejecute cuando estemos en el editor clásico. Cuando el editor de bloques esté activo, no registramos la meta box, y eso permite que la colaboración funcione.</p>
<p>Modifica el método <code>ayudawp_add_meta_box()</code>:</p>
<pre>public function ayudawp_add_meta_box() {
    $post_types = get_post_types( array( 'public' =&gt; true ), 'names' );

    foreach ( $post_types as $post_type ) {
        // Skip if the block editor is active for this post type.
        if ( function_exists( 'use_block_editor_for_post_type' )
            &amp;&amp; use_block_editor_for_post_type( $post_type )
        ) {
            continue;
        }

        add_meta_box(
            'ayudawp_aiss_exclude_metabox',
            __( 'AI Share &amp; Summarize', 'ai-share-summarize' ),
            array( $this, 'ayudawp_render_meta_box' ),
            $post_type,
            'side',
            'default'
        );
    }
}</pre>
<p>Con este cambio, los usuarios del editor clásico siguen teniendo la meta box de siempre. Los que usen el editor de bloques no la verán, y la colaboración no se desactivará.</p>
<h3>Paso 3: Crear un panel en la barra lateral del editor de bloques</h3>
<p>Ahora necesitamos que los usuarios del editor de bloques puedan seguir ocultando los botones en entradas individuales. Para eso toca crear un panel en la barra lateral del editor usando <code>PluginDocumentSettingPanel</code>.</p>
<p>Creamos (bueno, yo en este ejemplo, que el plugin es mío) un nuevo archivo <code>assets/js/editor-sidebar.js</code>:</p>
<pre>/**
 * AI Share &amp; Summarize - Block Editor Sidebar Panel
 *
 * Replaces the classic meta box in the block editor with a sidebar panel
 * compatible with WordPress 7.0 real-time collaboration.
 */
( function () {
    var el              = wp.element.createElement;
    var registerPlugin  = wp.plugins.registerPlugin;
    var PluginDocPanel  = wp.editor.PluginDocumentSettingPanel
                          || wp.editPost.PluginDocumentSettingPanel;
    var CheckboxControl = wp.components.CheckboxControl;
    var useSelect       = wp.data.useSelect;
    var useDispatch     = wp.data.useDispatch;
    var __              = wp.i18n.__;

    /**
     * Sidebar panel component
     *
     * Reads the exclusion meta value directly from the data store
     * using a controlled input. This keeps the panel in sync across
     * all connected editors during real-time collaboration.
     */
    function AissExcludePanel() {
        // Always read from the data store, never from local state.
        var isExcluded = useSelect( function ( select ) {
            var meta = select( 'core/editor' ).getEditedPostAttribute( 'meta' );
            return meta &amp;&amp; meta._ayudawp_aiss_exclude ? true : false;
        }, [] );

        var editPost = useDispatch( 'core/editor' ).editPost;

        return el(
            PluginDocPanel,
            {
                name: 'aiss-exclude-panel',
                title: 'AI Share &amp; Summarize',
                icon: 'share',
            },
            el( CheckboxControl, {
                label: __( 'Hide share buttons on this content', 'ai-share-summarize' ),
                checked: isExcluded,
                onChange: function ( value ) {
                    editPost( { meta: { _ayudawp_aiss_exclude: value } } );
                },
                help: __(
                    'Check this box to prevent the share and AI buttons from appearing on this specific content.',
                    'ai-share-summarize'
                ),
            } )
        );
    }

    registerPlugin( 'aiss-exclude-panel', {
        render: AissExcludePanel,
        icon: 'share',
    } );
} )();</pre>
<p>Hay varios detalles importantes en este código. El valor del <code>checkbox</code> se lee siempre del data store con <code>useSelect</code>, nunca se copia a un <code>useState</code> local. El <code>input</code> usa <code>checked</code> (controlado), no <code>defaultChecked</code>. Y los cambios se escriben directamente al data store con <code>editPost</code>. Esos tres puntos son los que garantizan que el panel funcione correctamente cuando varios usuarios editan a la vez.</p>
<p>El archivo no necesita JSX ni siquiera proceso de <code>build</code>. Usa <code>wp.element.createElement</code> directamente, así que funciona tal cual.</p>
<h3>Paso 4: Encolar el script en el editor de bloques</h3>
<p>Ahora hay que decirle a WordPress que cargue ese script cuando se abra el editor de bloques. Añade el gancho en el constructor de la clase y el nuevo método:</p>
<p>En el constructor:</p>
<pre>public function __construct() {
    add_action( 'add_meta_boxes', array( $this, 'ayudawp_add_meta_box' ) );
    add_action( 'save_post', array( $this, 'ayudawp_save_meta_box' ), 10, 2 );
    add_action( 'init', array( $this, 'ayudawp_register_meta' ) );
    add_action( 'enqueue_block_editor_assets', array( $this, 'ayudawp_enqueue_editor_sidebar' ) );
}</pre>
<p>Y el nuevo método:</p>
<pre>public function ayudawp_enqueue_editor_sidebar() {
    wp_enqueue_script(
        'ayudawp-aiss-editor-sidebar',
        AYUDAWP_AISS_PLUGIN_URL . 'assets/js/editor-sidebar.js',
        array( 'wp-plugins', 'wp-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n' ),
        AYUDAWP_AISS_VERSION,
        true
    );
}</pre>
<p>El gancho <code>enqueue_block_editor_assets</code> se dispara solo cuando se carga el editor de bloques, así que el script no se carga en ningún otro sitio.</p>
<h3>El archivo completo modificado</h3>
<p>Para que no tengas que ir juntando piezas, abajo tienes el archivo <code>includes/class-meta-box.php</code> completo con todos los cambios aplicados, para que veas el resultado final por si te sirve para tu plugin. Puedes descargarlo directamente desde el enlace que he puesto al final del artículo.</p>
<h3>Qué pasa con los datos existentes</h3>
<p>Las entradas que ya tenían la casilla marcado con la caja meta clásica siguen funcionando con el panel nuevo sin tocar nada. Ambos sistemas leen y escriben en la misma clave de meta (<code>_ayudawp_aiss_exclude</code>). El editor clásico guarda el valor como string <code>'1'</code> y el editor de bloques lo guarda como booleano <code>true</code>, pero la función <code>ayudawp_is_post_excluded()</code> hace un <code>cast</code> a booleano con <code>(bool)</code>, así que las dos representaciones funcionan bien. No hay que migrar datos.</p>
<h3>Probar la colaboración</h3>
<p>Con los cambios hechos, los pasos para comprobar que todo funciona:</p>
<ol>
<li>Asegúrate de tener WordPress 7.0 instalado y la colaboración activada en los ajustes de escritura</li>
<li>Abre una entrada en el editor de bloques con dos usuarios distintos. Si todo va bien verás el cursor del otro usuario en el editor y podréis editar a la vez sin que salte el aviso</li>
<li>Revisa que el panel «AI Share &amp; Summarize» (o el tuyo, claro) aparece en la barra lateral de la pestaña «Entrada» (no confundir con la pestaña «Bloque»)</li>
<li>Marca y desmarca la casilla desde ambas sesiones y comprueba que el cambio se refleja en la otra</li>
</ol>
<h2>Resumen de los cambios para desarrolladores</h2>
<p>Para que quede claro qué archivos se tocan y qué cambia en cada uno:</p>
<p>En <code>includes/class-meta-box.php</code> se hacen cuatro modificaciones: se añade <code>revisions_enabled =&gt; true</code> al <code>register_post_meta()</code>, se condiciona <code>add_meta_box()</code> para que solo se registre en el editor clásico, se añade el gancho <code>enqueue_block_editor_assets</code> en el constructor, y se añade el método <code>ayudawp_enqueue_editor_sidebar()</code> para encolar el script.</p>
<p>Se crea un archivo nuevo, <code>assets/js/editor-sidebar.js</code>, con el panel del sidebar para el editor de bloques.</p>
<p>No se toca nada más. El handler de <code>save_post</code> se mantiene porque sigue siendo necesario para el editor clásico. La función <code>ayudawp_is_post_excluded()</code> también se mantiene porque lee de la misma clave de meta sea cual sea el editor que la haya guardado.</p>
<h2>Resumen de comprobación de compatibilidad de RTC para plugins</h2>
<p>Si mantienes plugins de WordPress y quieres que sean compatibles con la colaboración en tiempo real de WordPress 7.0, repasa estos puntos.</p>
<h3>Cajas meta</h3>
<p>Comprueba si tu plugin registra meta boxes con <code>add_meta_box()</code>. Si lo hace, tienes dos opciones: eliminar la meta box y sustituirla por un panel en el sidebar del editor de bloques, o mantener la meta box solo para el editor clásico y crear el panel en paralelo (como en el ejemplo de arriba). Para cualquiera de las dos opciones, el post meta tiene que estar registrado con <code>register_post_meta()</code> y <code>show_in_rest =&gt; true</code>.</p>
<h3>Componentes JavaScript</h3>
<p>Revisa que todos tus componentes que leen datos compartidos (meta, atributos de bloques) los lean directamente del data store con <code>useSelect</code>. No copies esos valores a <code>useState</code>. Usa inputs controlados (<code>value</code> y <code>checked</code>), no inputs no controlados (<code>defaultValue</code> y <code>defaultChecked</code>).</p>
<h3>Efectos secundarios</h3>
<p>Si alguno de tus bloques ejecuta código automáticamente al insertarse (abrir un modal, hacer una petición HTTP, disparar un evento), ten en cuenta que ese efecto se ejecutará en todas las sesiones conectadas. Convierte esos disparadores automáticos en acciones manuales para que solo afecten al usuario que los inicia.</p>
<h3>Revisiones</h3>
<p>Añade <code>revisions_enabled =&gt; true</code> a los post meta que modifiques desde el editor. Así el historial de revisiones recoge los cambios en el meta y no solo en el contenido de la entrada.</p>
<h2>Cómo desactivar la colaboración desde un plugin</h2>
<p>Puede que tengas un plugin donde la colaboración cause problemas que no puedes resolver de momento, o que quieras desactivarla durante un despliegue gradual. Hay una forma limpia de hacerlo sin tocar nada de WordPress.</p>
<p>El filtro <code>sync.providers</code> controla qué proveedores de sincronización están activos. Si devuelves un array vacío la colaboración se desactiva:</p>
<pre>import { addFilter } from '@wordpress/hooks';

addFilter( 'sync.providers', 'my-plugin/disable-collab', () =&gt; [] );</pre>
<p>Esto es temporal y limpio. No afecta a ninguna otra funcionalidad del editor.</p>
<h2>Documentación y recursos</h2>
<p>Los enlaces a la documentación oficial para profundizar en todo lo que hemos visto:</p>
<ul>
<li><a href="https://make.wordpress.org/core/2026/03/10/real-time-collaboration-in-the-block-editor/" target="_blank" rel="nofollow noopener">Nota oficial de desarrollo de la colaboración en tiempo real</a> – La referencia principal. Cubre las meta boxes, el filtro sync.providers y los problemas comunes para plugins.</li>
<li><a href="https://make.wordpress.org/test/2026/03/11/its-time-to-test-real-time-collaboration/" target="_blank" rel="nofollow noopener">Guía para probar la colaboración en tiempo real</a> – Escenarios de prueba detallados y cómo configurar tu entorno.</li>
<li><a href="https://make.wordpress.org/core/2025/12/16/real-time-collaboration-early-user-feedback/" target="_blank" rel="nofollow noopener">Feedback temprano de usuarios de VIP</a> – Lecciones aprendidas de los primeros usuarios en producción.</li>
<li><a href="https://github.com/Automattic/vip-real-time-collaboration/blob/trunk/docs/COMMON_ISSUES.md" target="_blank" rel="nofollow noopener">COMMON_ISSUES.md del repositorio de VIP</a> – Ejemplos detallados de código con los anti-patrones más frecuentes y sus correcciones.</li>
<li><a href="https://developer.wordpress.org/block-editor/how-to-guides/metabox/" target="_blank" rel="nofollow noopener">Guía de migración de meta boxes</a> en el Block Editor Handbook.</li>
<li><a href="https://github.com/WordPress/gutenberg/issues/52593" target="_blank" rel="nofollow noopener">Issue de seguimiento #52593</a> en el repositorio de Gutenberg.</li>
<li><a href="https://ayudawp.com/wp-content/uploads/2026/04/class-meta-box.php_.zip" rel="nofollow ">Clase meta box</a> de Ai Share &amp; Summarize usada en el ejemplo.</li>
</ul>
<p>Si te ha saltado el aviso de plugins no compatibles y has conseguido identificar cuál era el culpable (o si eres desarrollador y has adaptado tu plugin), cuéntamelo en los comentarios.</p>
<p>Saber qué plugins dan problemas con la colaboración en tiempo real nos viene bien a todos, y si tienes dudas con la migración de cajas meta también te puedo echar una mano por ahí.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/plugins-incompatibles-colaboracion-tiempo-real/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ya puedes crear bloques de WordPress solo con PHP, sin JavaScript, así se hace con la nueva API de WordPress 7.x</title>
		<link>https://ayudawp.com/crear-bloques-wordpress-php/</link>
					<comments>https://ayudawp.com/crear-bloques-wordpress-php/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 06: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[AI Share & Summarize]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Block Bindings]]></category>
		<category><![CDATA[Bloques]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=158712</guid>

					<description><![CDATA[Si llevas años desarrollando con WordPress y en su día dejaste de crear bloques porque lo de montar un entorno con Node.js, React y Webpack te parecía demasiado para lo que necesitabas, tengo una noticia que te va a gustar mucho: WordPress 7.0 permite crear bloques personalizados usando solo PHP. Ni una línea de JavaScript.]]></description>
										<content:encoded><![CDATA[<p>Si llevas años desarrollando con WordPress y en su día dejaste de crear bloques porque lo de montar un entorno con Node.js, React y Webpack te parecía demasiado para lo que necesitabas, tengo una noticia que te va a gustar mucho: <strong>WordPress 7.0 permite crear bloques personalizados usando solo PHP</strong>. Ni una línea de JavaScript. Ni un <code>npm install</code>. Nada de compilar.</p>
<p>La funcionalidad se llama <strong>PHP-only block registration</strong> y llega gracias al flag <code>autoRegister</code> en la función <code>register_block_type()</code>. Registras tu bloque con PHP, defines los atributos, escribes el callback de renderizado y WordPress se encarga del resto: el bloque aparece en el insertador del editor y genera automáticamente los controles en el panel lateral para que el usuario pueda configurarlo.</p>
<p>¿Es un sustituto de los bloques JavaScript completos? Pues no, y tampoco pretende serlo.</p>
<p>Está pensado para <strong>bloques que solo necesitan renderizado del lado del servidor, los típicos que muestran datos dinámicos</strong> (últimas entradas, cajas de autor, alertas, widgets de datos) y que <strong>no requieren edición en tiempo real dentro del editor</strong>.</p>
<p>Para estos casos, que son la mayoría de los que necesita un desarrollador PHP en su día a día, <strong>es una solución limpia y sin complicaciones</strong>.</p>
<p>En esta guía tienes todo lo necesario para <strong>empezar a crear tus propios bloques <code>PHP-only</code></strong>, desde la referencia técnica completa, explicada como yo la he entendido, hasta <strong>tres ejemplos prácticos que van de menos a más</strong>:</p>
<ol>
<li>Un bloque creado desde cero</li>
<li>Migración de un shortcode clásico a bloque</li>
<li>Integración real de un bloque en un plugin ya publicado en WordPress.org.</li>
</ol>
<blockquote><p><strong>Requisitos para seguir este tutorial:</strong> Todos los códigos de esta guía necesitan que tengas instalado ya WordPress 7.0 o superior, disponible desde el 9 de abril de 2026. Si quieres probarlo antes de esa fecha puedes instalar la última beta de WordPress 7.0 con el plugin <a href="https://es.wordpress.org/plugins/wordpress-beta-tester/" target="_blank" rel="nofollow noopener">WordPress Beta Tester</a> o el <a href="https://es.wordpress.org/plugins/gutenberg/" target="_blank" rel="nofollow noopener">plugin Gutenberg</a> en un sitio de pruebas. En versiones anteriores de WordPress el flag <code>autoRegister</code> (a continuación lo explico) se ignora y los bloques no aparecerán en el editor.</p></blockquote>
<h2>Cómo funciona <code>autoRegister</code></h2>
<p>Lo que tienes a continuación <strong>es la referencia técnica que necesitas como desarrollador PHP para trabajar con esta API</strong>. Lo he preparado para que no tengas que ir a buscar en la documentación en inglés cada vez que quieras consultar algo, y por si te sirve mi manera de explicar las cosas.</p>
<h3>La estructura básica</h3>
<p>Un bloque <code>PHP-only</code> se registra con <code>register_block_type()</code> en el hook <code>init</code>, como cualquier otro bloque, pero con dos requisitos obligatorios:</p>
<ul>
<li>El flag <code>autoRegister</code> a <code>true</code> dentro de <code>supports</code></li>
<li>Un <code>render_callback</code> que devuelva el HTML del bloque</li>
</ul>
<p><strong>Demostración</strong>, como diría el Malaguita…</p>
<pre>add_action( 'init', 'ayudawp_register_my_block' );

function ayudawp_register_my_block() {
    register_block_type(
        'mi-plugin/mi-bloque',
        array(
            'title'           =&gt; 'Mi bloque',
            'icon'            =&gt; 'admin-generic',
            'category'        =&gt; 'widgets',
            'description'     =&gt; 'Descripción del bloque.',
            'keywords'        =&gt; array( 'ejemplo', 'php' ),
            'attributes'      =&gt; array(
                // Aquí van los atributos
            ),
            'render_callback' =&gt; 'ayudawp_render_my_block',
            'supports'        =&gt; array(
                'autoRegister' =&gt; true,
            ),
        )
    );
}

function ayudawp_render_my_block( $attributes ) {
    $wrapper = get_block_wrapper_attributes();
    return sprintf( '&lt;div %s&gt;Contenido del bloque&lt;/div&gt;', $wrapper );
}</pre>
<p>Cuando WordPress detecta el flag <code>autoRegister</code> registra automáticamente el bloque en el editor del lado del cliente a través de un global JavaScript (<code>autoRegisterBlocks</code>) y utiliza <code>ServerSideRender</code> para la previsualización.</p>
<p>O sea, cada vez que el usuario cambia un atributo en el panel lateral el editor hace una llamada a la API REST de WordPress, ejecuta tu <code>render_callback</code> en PHP y muestra el resultado. Sencillo, limpio, eficaz, como es PHP.</p>
<h3>Tipos de atributos y controles automáticos</h3>
<p>La gracia de <code>autoRegister</code> es que WordPress genera automáticamente los controles del Inspector (panel lateral del editor) a partir de los atributos que definas. Pero no todos los tipos generan controles, solo los que WordPress sabe representar como campo de formulario.</p>
<p>Estos son los tipos admitidos y el control que genera cada uno:</p>
<table>
<thead>
<tr>
<th>Tipo de atributo</th>
<th>Control generado</th>
<th>Ejemplo de uso</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>string</code></td>
<td><code>TextControl</code> (campo de texto)</td>
<td>Títulos, URLs, textos libres</td>
</tr>
<tr>
<td><code>string</code> con <code>enum</code></td>
<td><code>SelectControl</code> (desplegable)</td>
<td>Elegir entre opciones predefinidas</td>
</tr>
<tr>
<td><code>integer</code></td>
<td><code>NumberControl</code> (campo numérico)</td>
<td>Cantidad de elementos, anchos</td>
</tr>
<tr>
<td><code>boolean</code></td>
<td><code>ToggleControl</code> (interruptor)</td>
<td>Activar/desactivar funcionalidades</td>
</tr>
</tbody>
</table>
<p>Los atributos que no encajen en estos tipos (arrays, objetos) o los que tengan el rol <code>local</code> no generan ningún control en el panel.</p>
<p>Un detalle importante es que <strong>definas siempre un valor <code>default</code> para cada atributo</strong>. Si no lo haces el bloque puede no renderizar nada la primera vez que lo insertes, porque los atributos llegarán vacíos al <code>callback</code>.</p>
<p>Así se definen los atributos en la práctica, cubriendo los cuatro tipos:</p>
<pre>'attributes' =&gt; array(
    // String → TextControl
    'titulo' =&gt; array(
        'type'    =&gt; 'string',
        'default' =&gt; 'Título por defecto',
    ),
    // String con enum → SelectControl
    'tamano' =&gt; array(
        'type'    =&gt; 'string',
        'enum'    =&gt; array( 'pequeno', 'mediano', 'grande' ),
        'default' =&gt; 'mediano',
    ),
    // Integer → NumberControl
    'cantidad' =&gt; array(
        'type'    =&gt; 'integer',
        'default' =&gt; 5,
    ),
    // Boolean → ToggleControl
    'mostrar_fecha' =&gt; array(
        'type'    =&gt; 'boolean',
        'default' =&gt; true,
    ),
),</pre>
<h3>Los <code>supports</code> nativos funcionan igual</h3>
<p>Además de <code>autoRegister</code>, puedes activar los mismos <code>supports</code> que en cualquier bloque (color, espaciado, tipografía, bordes). <strong>WordPress aplicará los estilos heredados del tema activo</strong> sin que tengas que escribir CSS propio.</p>
<pre>'supports' =&gt; array(
    'autoRegister' =&gt; true,
    'color'        =&gt; array(
        'background' =&gt; true,
        'text'       =&gt; true,
    ),
    'spacing'      =&gt; array(
        'margin'  =&gt; true,
        'padding' =&gt; true,
    ),
    'typography'   =&gt; array(
        'fontSize' =&gt; true,
    ),
),</pre>
<p>Cuando activas estos <code>supports</code> WordPress añade los controles correspondientes en el panel lateral (selector de color, controles de márgenes, etc.) y aplica las clases y estilos inline automáticamente. Para que funcionen correctamente en el HTML de salida, usa siempre <code>get_block_wrapper_attributes()</code> en tu <code>callback</code> de renderizado.</p>
<h3>Cargar CSS y JavaScript</h3>
<p>Si tu bloque necesita estilos propios o algún script, lo habitual es registrarlos en el hook <code>init</code> y con <code>enqueue</code> desde el <code>callback</code>. De esta forma solo se cargan en las páginas donde esté disponible el bloque.</p>
<pre>add_action( 'init', 'ayudawp_register_block_assets' );

function ayudawp_register_block_assets() {
    wp_register_style(
        'ayudawp-mi-bloque-style',
        plugins_url( 'assets/css/mi-bloque.css', __FILE__ ),
        array(),
        '1.0.0'
    );
}

function ayudawp_render_my_block( $attributes ) {
    // Solo se encola cuando se renderiza el bloque
    wp_enqueue_style( 'ayudawp-mi-bloque-style' );

    $wrapper = get_block_wrapper_attributes();
    return sprintf( '&lt;div %s&gt;...&lt;/div&gt;', $wrapper );
}</pre>
<h2>Ejemplo 1: Bloque de caja de información autor (desde cero)</h2>
<p>Vamos con el primer ejemplo práctico, que es un bloque muy práctico que muestra la información de un autor de WordPress (avatar, nombre, biografía y enlace a su web). Lo vamos a crear como <a href="https://ayudawp.com/que-son-los-mu-plugins-de-wordpress/" target="_blank" rel="noopener ugc">mu-plugin</a> para que sea fácil de probar.</p>
<p>Este bloque tiene un detalle interesante, y es que el selector de autor se genera dinámicamente a partir de los usuarios de WordPress mediante un <code>enum</code> construido con <code>get_users()</code>. Es un buen ejemplo de <strong>cómo aprovechar toda la potencia de PHP dentro de la definición del bloque</strong>.</p>
<p>Crea el archivo dentro de <code>/wp-content/mu-plugins/ayudawp-author-box-block.php</code> con el siguiente contenido:</p>
<pre>&lt;?php
/**
* Plugin Name: Bloque de caja de autor (PHP)
* Plugin URI: https://servicios.ayudawp.com
* Description: Bloque de caja de autor registrado solo con PHP. Requiere WordPress 7.0 o superior o la última versión del plugin Gutenberg.
* Version: 1.0.0
* Author: Fernando Tellado
* Author URI: https://ayudawp.com
* License: GPL-2.0-or-later
* Requires PHP: 7.4
*/

// Prevent direct file access
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_action( 'init', 'ayudawp_register_author_box_block' );

/**
 * Register the author box PHP-only block.
 *
 * Generates the user list dynamically for the author selector.
 */
function ayudawp_register_author_box_block() {

    // Build the list of users for the selector
    $users    = get_users( array( 'fields' =&gt; array( 'ID', 'display_name' ) ) );
    $user_ids = array();

    foreach ( $users as $user ) {
        $user_ids[] = (string) $user-&gt;ID;
    }

    // If no users, fallback to avoid empty enum
    if ( empty( $user_ids ) ) {
        $user_ids = array( '1' );
    }

    register_block_type(
        'ayudawp/author-box',
        array(
            'title'           =&gt; __( 'Caja de autor', 'ayudawp' ),
            'icon'            =&gt; 'admin-users',
            'category'        =&gt; 'theme',
            'description'     =&gt; __( 'Muestra información del autor: avatar, nombre, biografía y sitio web.', 'ayudawp' ),
            'keywords'        =&gt; array( 'author', 'bio', 'avatar' ),
            'attributes'      =&gt; array(
                'user_id'      =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; $user_ids,
                    'default' =&gt; $user_ids[0],
                ),
                'avatar_size'  =&gt; array(
                    'type'    =&gt; 'integer',
                    'default' =&gt; 96,
                ),
                'show_bio'     =&gt; array(
                    'type'    =&gt; 'boolean',
                    'default' =&gt; true,
                ),
                'show_website' =&gt; array(
                    'type'    =&gt; 'boolean',
                    'default' =&gt; true,
                ),
            ),
            'render_callback' =&gt; 'ayudawp_render_author_box_block',
            'supports'        =&gt; array(
                'autoRegister' =&gt; true,
                'color'        =&gt; array(
                    'background' =&gt; true,
                    'text'       =&gt; true,
                ),
                'spacing'      =&gt; array(
                    'padding' =&gt; true,
                    'margin'  =&gt; true,
                ),
            ),
        )
    );
}

/**
 * Render callback for the author box block.
 *
 * @param array $attributes Block attributes.
 * @return string Block HTML output.
 */
function ayudawp_render_author_box_block( $attributes ) {

    $user_id      = absint( $attributes['user_id'] ?? 1 );
    $avatar_size  = absint( $attributes['avatar_size'] ?? 96 );
    $show_bio     = (bool) ( $attributes['show_bio'] ?? true );
    $show_website = (bool) ( $attributes['show_website'] ?? true );

    $user = get_userdata( $user_id );

    if ( ! $user ) {
        return '';
    }

    $wrapper = get_block_wrapper_attributes(
        array(
            'style' =&gt; 'display:flex;gap:1.5em;align-items:flex-start;',
        )
    );

    $output  = sprintf( '&lt;div %s&gt;', $wrapper );
    $output .= get_avatar( $user_id, $avatar_size );
    $output .= '&lt;div&gt;';
    $output .= sprintf(
        '&lt;strong style="font-size:1.2em;"&gt;%s&lt;/strong&gt;',
        esc_html( $user-&gt;display_name )
    );

    if ( $show_bio &amp;&amp; $user-&gt;description ) {
        $output .= sprintf(
            '&lt;p style="margin-top:0.5em;"&gt;%s&lt;/p&gt;',
            esc_html( $user-&gt;description )
        );
    }

    if ( $show_website &amp;&amp; $user-&gt;user_url ) {
        $output .= sprintf(
            '&lt;p&gt;&lt;a href="%s" target="_blank" rel="noopener noreferrer"&gt;%s&lt;/a&gt;&lt;/p&gt;',
            esc_url( $user-&gt;user_url ),
            esc_html( $user-&gt;user_url )
        );
    }

    $output .= '&lt;/div&gt;&lt;/div&gt;';

    return $output;
}</pre>
<p>Una vez guardado el archivo ve al editor de WordPress, busca «Caja de autor» en el insertador de bloques y deberías tenerlo disponible para insertarlo, hazlo.</p>
<p><a href="https://ayudawp.com/?attachment_id=158719" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158719 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-solo-php-wordpress-7-1200x766.jpg" alt="insertar bloque solo php wordpress 7" width="1200" height="766" srcset="https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-solo-php-wordpress-7-1200x766.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-solo-php-wordpress-7-768x490.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-solo-php-wordpress-7-1536x980.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-solo-php-wordpress-7.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Con el bloque ya insertado y seleccionado, <strong>en el panel lateral verás un desplegable con los IDs de los usuarios, un campo numérico para el tamaño del avatar y dos interruptores para mostrar u ocultar la biografía y el enlace web</strong>.</p>
<p><a href="https://ayudawp.com/?attachment_id=158720" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-158720 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-wordpress-7-1200x766.jpg" alt="bloque solo php wordpress 7" width="1200" height="766" srcset="https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-wordpress-7-1200x766.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-wordpress-7-768x490.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-wordpress-7-1536x980.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-wordpress-7.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Además, si activas los <code>supports</code> de color y espaciado, podrás personalizar los colores de fondo y texto, y los márgenes y relleno directamente desde el editor.</p>
<p><strong>Un apunte importante sobre el selector de usuarios</strong> es que el control <code>SelectControl</code> que genera WordPress muestra los valores del <code>enum</code> tal cual, en este caso los IDs numéricos de los usuarios. No es lo más elegante visualmente (lo ideal sería mostrar el nombre), pero es la limitación actual de la generación automática de controles.</p>
<p>Para un bloque de producción con un selector más refinado ya necesitarías JavaScript, pero para un uso interno o un tema personalizado funciona de sobra, y se ve perfecto.</p>
<p>Si quieres profundizar en otras formas de mostrar una caja de información del autor en WordPress, por si no te termina de convencer el uso del bloque, y te ha entrado la curiosidad y ganas de usar algo así, echa un vistazo a <a href="https://ayudawp.com/informacion-autor-sin-plugins/" target="_blank" rel="noopener ugc">esta guía sobre cómo mostrar la información del autor sin plugins</a>.</p>
<h2>Ejemplo 2: Migrar el shortcode de entradas recientes a bloque</h2>
<p>Ahora empieza la parte más interesante del tutorial, pues para empezar a darle caña a esto <strong>vamos a tomar un shortcode que ya funciona y convertirlo en un bloque <code>PHP-only</code></strong>.</p>
<p>Usaremos como base el <a href="https://ayudawp.com/entradas-recientes-shortcode/" target="_blank" rel="noopener ugc">shortcode de entradas recientes</a> que publiqué hace un tiempo, y <strong>lo vamos a mejorar de paso con un par de atributos nuevos</strong>.</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Pero la mejora real no son los atributos extra, sino dónde puedes usar este bloque.</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Como shortcode estabas limitado a pegarlo dentro del contenido de una entrada o página, como bloque <code>PHP-only</code> puedes insertarlo en cualquier plantilla del editor de sitio (la página de inicio, el pie de página, la plantilla de entradas individuales, la 404, etc.) <strong>sin depender de plugins ni tocar los archivos del tema</strong>.</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">El bloque nativo de últimas entradas de WordPress hace algo parecido, pero no te deja ordenar por número de comentarios, ni mostrar entradas aleatorias, ni activar el extracto con un interruptor, este sí.</p>
<h3>El shortcode original</h3>
<p>El shortcode <code>[entradas_recientes]</code> usa <code>get_posts()</code> para mostrar una lista de entradas filtrable por categoría, con parámetros de orden y cantidad. Así era el código:</p>
<pre>function ayudawp_recent_posts_shortcode( $atts, $content = null ) {
    global $post;
    extract( shortcode_atts( array(
        'cat'     =&gt; '',
        'num'     =&gt; '5',
        'order'   =&gt; 'DESC',
        'orderby' =&gt; 'post_date',
    ), $atts ) );
    $args = array(
        'cat'            =&gt; $cat,
        'posts_per_page' =&gt; $num,
        'order'          =&gt; $order,
        'orderby'        =&gt; $orderby,
    );
    $output = '';
    $posts  = get_posts( $args );
    foreach ( $posts as $post ) {
        setup_postdata( $post );
        $output .= '&lt;li&gt;&lt;a href="' . get_the_permalink() . '"&gt;' . get_the_title() . '&lt;/a&gt;&lt;/li&gt;';
    }
    wp_reset_postdata();
    return '&lt;ul&gt;' . $output . '&lt;/ul&gt;';
}
add_shortcode( 'entradas_recientes', 'ayudawp_recent_posts_shortcode' );</pre>
<h3>Qué cambia al convertirlo en bloque</h3>
<p>Los parámetros del shortcode se convierten en atributos del bloque, y cada uno se mapea al tipo que mejor encaje para generar un control automático en el editor:</p>
<table>
<thead>
<tr>
<th>Parámetro del shortcode</th>
<th>Atributo del bloque</th>
<th>Tipo</th>
<th>Control generado</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>num</code></td>
<td><code>num</code></td>
<td><code>integer</code></td>
<td>Campo numérico</td>
</tr>
<tr>
<td><code>cat</code></td>
<td><code>cat</code></td>
<td><code>string</code></td>
<td>Campo de texto (ID de categoría)</td>
</tr>
<tr>
<td><code>order</code></td>
<td><code>order</code></td>
<td><code>string</code> + <code>enum</code></td>
<td>Desplegable (ASC/DESC)</td>
</tr>
<tr>
<td><code>orderby</code></td>
<td><code>orderby</code></td>
<td><code>string</code> + <code>enum</code></td>
<td>Desplegable</td>
</tr>
<tr>
<td><em>(nuevo)</em></td>
<td><code>show_date</code></td>
<td><code>boolean</code></td>
<td>Interruptor</td>
</tr>
<tr>
<td><em>(nuevo)</em></td>
<td><code>show_excerpt</code></td>
<td><code>boolean</code></td>
<td>Interruptor</td>
</tr>
</tbody>
</table>
<p>Los dos atributos nuevos (<code>show_date</code> y <code>show_excerpt</code>) son de tipo <code>boolean</code>, así que generarán un interruptor cada uno en el panel lateral. De esta forma, en un solo ejemplo ves los cuatro tipos de control que genera <code>autoRegister</code>.</p>
<h3>El bloque completo</h3>
<p>Crea el archivo <code>wp-content/mu-plugins/ayudawp-recent-posts-block.php</code>:</p>
<pre>&lt;?php
/**
* Plugin Name: Bloque de entradas recientes
* Description: Bloque PHP-only de entradas recientes. Migración del shortcode [entradas_recientes]. Requiere WordPress 7.0 o superior, o el plugin Gutenberg 14.0+ en versiones anteriores.
* Plugin URI: https://servicios.ayudawp.com
* Version: 1.0.0
* Author: Fernando Tellado
* Author URI: https://ayudawp.com
* License: GPL-2.0-or-later
* Requires PHP: 7.4
*/

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

add_action( 'init', 'ayudawp_register_recent_posts_block' );

/**
 * Register the recent posts PHP-only block.
 */
function ayudawp_register_recent_posts_block() {
    register_block_type(
        'ayudawp/recent-posts',
        array(
            'title'           =&gt; __( 'Entradas recientes (PHP)', 'ayudawp' ),
            'icon'            =&gt; 'list-view',
            'category'        =&gt; 'theme',
            'description'     =&gt; __( 'Muestra una lista personalizable de entradas recientes.', 'ayudawp' ),
            'keywords'        =&gt; array( 'posts', 'recent', 'latest', 'entries' ),
            'attributes'      =&gt; array(
                'num'          =&gt; array(
                    'type'    =&gt; 'integer',
                    'default' =&gt; 5,
                ),
                'cat'          =&gt; array(
                    'type'    =&gt; 'string',
                    'default' =&gt; '',
                ),
                'order'        =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; array( 'DESC', 'ASC' ),
                    'default' =&gt; 'DESC',
                ),
                'orderby'      =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; array( 'post_date', 'title', 'modified', 'rand', 'comment_count' ),
                    'default' =&gt; 'post_date',
                ),
                'show_date'    =&gt; array(
                    'type'    =&gt; 'boolean',
                    'default' =&gt; false,
                ),
                'show_excerpt' =&gt; array(
                    'type'    =&gt; 'boolean',
                    'default' =&gt; false,
                ),
            ),
            'render_callback' =&gt; 'ayudawp_render_recent_posts_block',
            'supports'        =&gt; array(
                'autoRegister' =&gt; true,
                'color'        =&gt; array(
                    'text' =&gt; true,
                    'link' =&gt; true,
                ),
                'spacing'      =&gt; array(
                    'margin'  =&gt; true,
                    'padding' =&gt; true,
                ),
                'typography'   =&gt; array(
                    'fontSize' =&gt; true,
                ),
            ),
        )
    );
}

/**
 * Render callback for the recent posts block.
 *
 * @param array $attributes Block attributes.
 * @return string Block HTML output.
 */
function ayudawp_render_recent_posts_block( $attributes ) {

    $num          = absint( $attributes['num'] ?? 5 );
    $cat          = sanitize_text_field( $attributes['cat'] ?? '' );
    $order        = in_array( $attributes['order'] ?? 'DESC', array( 'ASC', 'DESC' ), true )
                    ? $attributes['order']
                    : 'DESC';
    $orderby      = sanitize_key( $attributes['orderby'] ?? 'post_date' );
    $show_date    = (bool) ( $attributes['show_date'] ?? false );
    $show_excerpt = (bool) ( $attributes['show_excerpt'] ?? false );

    $args = array(
        'posts_per_page' =&gt; $num,
        'order'          =&gt; $order,
        'orderby'        =&gt; $orderby,
        'post_status'    =&gt; 'publish',
    );

    if ( ! empty( $cat ) ) {
        $args['cat'] = absint( $cat );
    }

    $posts = get_posts( $args );

    if ( empty( $posts ) ) {
        return '';
    }

    $wrapper = get_block_wrapper_attributes();
    $output  = sprintf( '&lt;div %s&gt;&lt;ul style="list-style:none;padding:0;"&gt;', $wrapper );

    foreach ( $posts as $post ) {
        $output .= '&lt;li style="margin-bottom:0.75em;"&gt;';
        $output .= sprintf(
            '&lt;a href="%s"&gt;%s&lt;/a&gt;',
            esc_url( get_permalink( $post ) ),
            esc_html( get_the_title( $post ) )
        );

        if ( $show_date ) {
            $output .= sprintf(
                ' &lt;span style="color:#666;font-size:0.85em;"&gt;— %s&lt;/span&gt;',
                esc_html( get_the_date( '', $post ) )
            );
        }

        if ( $show_excerpt &amp;&amp; $post-&gt;post_excerpt ) {
            $output .= sprintf(
                '&lt;br&gt;&lt;span style="font-size:0.9em;color:#555;"&gt;%s&lt;/span&gt;',
                esc_html( wp_trim_words( $post-&gt;post_excerpt, 20 ) )
            );
        }

        $output .= '&lt;/li&gt;';
    }

    $output .= '&lt;/ul&gt;&lt;/div&gt;';

    return $output;
}

/*
 * Opcional: mantiene funcional el shortcode por retro-compatibilidad.
 * Los usuarios que ya tengan [entradas_recientes] en su contenido
 * pueden seguir usándolo mientras migran al bloque.
 */
add_shortcode( 'entradas_recientes', 'ayudawp_recent_posts_shortcode_compat' );

/**
 * Shortcode compatibility wrapper.
 *
 * @param array  $atts    Shortcode attributes.
 * @param string $content Shortcode content (unused).
 * @return string HTML output.
 */
function ayudawp_recent_posts_shortcode_compat( $atts, $content = null ) {
    $atts = shortcode_atts(
        array(
            'cat'     =&gt; '',
            'num'     =&gt; '5',
            'order'   =&gt; 'DESC',
            'orderby' =&gt; 'post_date',
        ),
        $atts,
        'entradas_recientes'
    );

    return ayudawp_render_recent_posts_block(
        array(
            'num'          =&gt; (int) $atts['num'],
            'cat'          =&gt; $atts['cat'],
            'order'        =&gt; $atts['order'],
            'orderby'      =&gt; $atts['orderby'],
            'show_date'    =&gt; false,
            'show_excerpt' =&gt; false,
        )
    );
}</pre>

<a href="https://ayudawp.com/crear-bloques-wordpress-php/insertar-bloque-php-migrado-de-shortcode-wordpress-7/" rel="nofollow"><img width="1200" height="766" src="https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-migrado-de-shortcode-wordpress-7-1200x766.jpg" class="attachment-medium size-medium" alt="insertar bloque php migrado de shortcode wordpress 7" srcset="https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-migrado-de-shortcode-wordpress-7-1200x766.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-migrado-de-shortcode-wordpress-7-768x490.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-migrado-de-shortcode-wordpress-7-1536x980.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-migrado-de-shortcode-wordpress-7.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/crear-bloques-wordpress-php/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7/" rel="nofollow"><img width="1200" height="835" src="https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7-1200x835.jpg" class="attachment-medium size-medium" alt="bloque solo php de entradas recientes migrado de shortcode en wordpress 7" srcset="https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7-1200x835.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7-768x534.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7-1536x1069.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7-260x180.jpg 260w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-solo-php-de-entradas-recientes-migrado-de-shortcode-en-wordpress-7.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/crear-bloques-wordpress-php/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web/" rel="nofollow"><img width="1200" height="835" src="https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web-1200x835.jpg" class="attachment-medium size-medium" alt="bloque php wordpress 7 entradas relacionadas mostrado en web" srcset="https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web-1200x835.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web-768x534.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web-1536x1069.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web-260x180.jpg 260w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-wordpress-7-entradas-relacionadas-mostrado-en-web.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<h3>Qué hemos ganado con la migración</h3>
<p>Fíjate en lo que ha cambiado, que es mucho:</p>
<ul>
<li>El usuario ya no necesita recordar la sintaxis <code>[entradas_recientes num="5" cat="12"]</code>. Inserta el bloque desde el insertador, configura todo desde el panel lateral con controles visuales y ve una previsualización en tiempo real de las entradas seleccionadas.</li>
<li>El <code>callback</code> de renderizado es prácticamente el mismo que el del shortcode, con las mejoras de seguridad (validación de los parámetros, <code>esc_url()</code>, <code>esc_html()</code>) y los dos atributos nuevos.</li>
</ul>
<p>Al final del archivo hemos incluido además una función de compatibilidad que mantiene el shortcode <code>[entradas_recientes]</code> funcionando, reutilizando el mismo <code>callback</code> del bloque. Así, las entradas o páginas que ya tengan el shortcode insertado seguirán mostrando las entradas recientes sin tener que tocar nada. Puedes ir migrando a tu ritmo.</p>
<p>Este patrón de migración (bloque nuevo + shortcode de compatibilidad que llama al mismo renderizado) es exactamente lo que deberías aplicar siempre que conviertas un shortcode a bloque. <strong>Nunca elimines el shortcode de golpe</strong>, mantenlo como alternativa.</p>
<p>Para saber más sobre shortcodes y cómo crearlos, tienes la <a href="https://ayudawp.com/que-son-los-shortcodes-y-como-crearlos/" target="_blank" rel="noopener ugc">guía completa de shortcodes de WordPress</a>. Y si te has encontrado con el problema de los shortcodes que dejan de funcionar al desactivar un plugin, echa un vistazo a la <a href="https://ayudawp.com/shortcodes-huerfanos/" target="_blank" rel="noopener ugc">guía de shortcodes huérfanos</a>.</p>
<h2>Ejemplo 3: Migrar el shortcode de botones de AI Share &amp; Summarize a bloque</h2>
<p>Para cerrar los ejemplos prácticos vamos con un caso real sobre un plugin publicado en WordPress.org, y no es ni más ni menos que la migración del shortcode <code>[ayudawp_share_buttons]</code> del plugin <a href="https://es.wordpress.org/plugins/ai-share-summarize/" target="_blank" rel="nofollow noopener">AI Share &amp; Summarize</a> a un bloque <code>PHP-only</code>.</p>
<p>Este plugin combina botones de <strong>compartir en redes sociales con botones para generar resúmenes en IA</strong> (Claude, ChatGPT, Perplexity, DeepSeek y muchas más). Tiene inserción automática, pero también un shortcode muy completo con parámetros para el estilo, tamaño, iconos, alineación y selección de botones concretos.</p>
<h3>El shortcode que vamos a migrar</h3>
<p>El shortcode admite estos parámetros principales:</p>
<pre>[ayudawp_share_buttons style="brand" size="normal" show_icons="true" alignment="left" icon_style="circular"]</pre>
<p>Cada uno de estos parámetros se traduce directamente en un atributo del bloque:</p>
<table>
<thead>
<tr>
<th>Parámetro</th>
<th>Tipo de atributo</th>
<th>Valores del enum</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>style</code></td>
<td><code>string</code> + <code>enum</code></td>
<td><code>minimal</code>, <code>brand</code>, <code>outline</code>, <code>dark</code>, <code>custom</code>, <code>icons-only</code></td>
</tr>
<tr>
<td><code>size</code></td>
<td><code>string</code> + <code>enum</code></td>
<td><code>compact</code>, <code>normal</code>, <code>large</code>, <code>fluid</code></td>
</tr>
<tr>
<td><code>show_icons</code></td>
<td><code>boolean</code></td>
<td>—</td>
</tr>
<tr>
<td><code>alignment</code></td>
<td><code>string</code> + <code>enum</code></td>
<td><code>left</code>, <code>center</code></td>
</tr>
<tr>
<td><code>icon_style</code></td>
<td><code>string</code> + <code>enum</code></td>
<td><code>circular</code>, <code>square</code></td>
</tr>
<tr>
<td><code>show_title</code></td>
<td><code>boolean</code></td>
<td>—</td>
</tr>
</tbody>
</table>
<h3>Cómo se integra en el plugin</h3>
<p>A diferencia de los ejemplos anteriores (que son mu-plugins independientes) aquí el bloque se registra <strong>dentro del propio plugin</strong>, en un archivo nuevo de la carpeta <code>/includes</code>.</p>
<p>La clave está en el <code>render_callback</code>: en vez de pasar por <code>do_shortcode()</code>, llama directamente al método estático <code>AyudaWP_AISS_Buttons::ayudawp_generate_buttons_html()</code>, que es la misma función que ya usa internamente el shortcode para generar el HTML de los botones. Es mucho más eficiente y sin duplicar código.</p>
<p>Si miras la clase <code>AyudaWP_AISS_Shortcode</code> del plugin, verás que el shortcode pilla las opciones guardadas con <code>get_option( 'ayudawp_aiss_options' )</code>, sobrescribe las que vengan como parámetro del shortcode y pasa todo a <code>AyudaWP_AISS_Buttons::ayudawp_generate_buttons_html()</code>.</p>
<p>El render <code>callback</code> del bloque hace exactamente lo mismo, pero <strong>recibiendo los valores desde los atributos del bloque en vez de desde los parámetros del shortcode</strong>.</p>
<pre>&lt;?php
/**
 * PHP-only block registration for AI Share &amp; Summarize
 *
 * @package AiShareSummarize
 * @since   2.0.0
 */

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

add_action( 'init', 'ayudawp_aiss_register_share_block' );

/**
 * Register the share buttons as a PHP-only block.
 */
function ayudawp_aiss_register_share_block() {
    register_block_type(
        'ayudawp/share-buttons',
        array(
            'title'           =&gt; __( 'AI Share &amp; Summarize', 'ai-share-summarize' ),
            'icon'            =&gt; 'share',
            'category'        =&gt; 'widgets',
            'description'     =&gt; __( 'Share buttons and AI summary buttons.', 'ai-share-summarize' ),
            'keywords'        =&gt; array( 'share', 'social', 'ai', 'summarize' ),
            'attributes'      =&gt; array(
                'style'      =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; array( 'minimal', 'brand', 'outline', 'dark', 'custom', 'icons-only' ),
                    'default' =&gt; 'minimal',
                ),
                'size'       =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; array( 'compact', 'normal', 'large', 'fluid' ),
                    'default' =&gt; 'normal',
                ),
                'show_icons' =&gt; array(
                    'type'    =&gt; 'boolean',
                    'default' =&gt; true,
                ),
                'alignment'  =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; array( 'left', 'center' ),
                    'default' =&gt; 'left',
                ),
                'icon_style' =&gt; array(
                    'type'    =&gt; 'string',
                    'enum'    =&gt; array( 'circular', 'square' ),
                    'default' =&gt; 'circular',
                ),
                'show_title' =&gt; array(
                    'type'    =&gt; 'boolean',
                    'default' =&gt; true,
                ),
            ),
            'render_callback' =&gt; 'ayudawp_aiss_render_share_block',
            'supports'        =&gt; array(
                'autoRegister' =&gt; true,
                'spacing'      =&gt; array(
                    'margin'  =&gt; true,
                    'padding' =&gt; true,
                ),
            ),
        )
    );
}

/**
 * Render callback for the share buttons block.
 *
 * Replicates the shortcode logic: loads plugin options,
 * overrides with block attributes, and calls the existing
 * AyudaWP_AISS_Buttons renderer directly.
 *
 * @param array $attributes Block attributes.
 * @return string Block HTML output.
 */
function ayudawp_aiss_render_share_block( $attributes ) {

    // Check the rendering class exists (plugin active)
    if ( ! class_exists( 'AyudaWP_AISS_Buttons' ) ) {
        return '';
    }

    // Load the saved plugin options as base
    $options = get_option( 'ayudawp_aiss_options' );

    if ( ! is_array( $options ) ) {
        return '';
    }

    $block_options = $options;

    // Override options with block attributes (same as shortcode does)
    if ( ! empty( $attributes['style'] ) ) {
        $block_options['button_colors'] = sanitize_text_field( $attributes['style'] );
    }

    if ( ! empty( $attributes['size'] ) ) {
        $block_options['button_size'] = sanitize_text_field( $attributes['size'] );
    }

    if ( isset( $attributes['show_icons'] ) ) {
        $block_options['show_icons'] = (bool) $attributes['show_icons'];
    }

    if ( ! empty( $attributes['icon_style'] ) ) {
        $block_options['icon_style'] = sanitize_text_field( $attributes['icon_style'] );
    }

    if ( isset( $attributes['show_title'] ) &amp;&amp; ! $attributes['show_title'] ) {
        $block_options['title_text'] = '';
    }

    // Get the enabled buttons from plugin settings
    $enabled_buttons = isset( $options['enabled_buttons'] ) ? $options['enabled_buttons'] : array();

    if ( empty( $enabled_buttons ) || ! is_array( $enabled_buttons ) ) {
        return '';
    }

    $current_url   = get_permalink();
    $current_title = get_the_title();

    // Call the same renderer the shortcode uses
    $html = AyudaWP_AISS_Buttons::ayudawp_generate_buttons_html(
        $enabled_buttons,
        $block_options,
        $current_url,
        $current_title
    );

    if ( empty( $html ) ) {
        return '';
    }

    $wrapper = get_block_wrapper_attributes();

    return sprintf( '&lt;div %s&gt;%s&lt;/div&gt;', $wrapper, $html );
}</pre>
<p>Fíjate en el render callback, hace exactamente lo mismo que el método <code>ayudawp_shortcode_share_buttons()</code> de la clase <code>AyudaWP_AISS_Shortcode</code>, carga las opciones del plugin, sobrescribe con los valores que vienen del bloque (en vez de los del shortcode), y pasa todo a <code>AyudaWP_AISS_Buttons::ayudawp_generate_buttons_html()</code> junto con la URL y título de la entrada actual.</p>
<p>El resultado es que bloque y shortcode comparten el mismo motor de renderizado, sin duplicar nada de código.</p>
<p>El usuario podrá insertar los botones de compartir y resumir como un bloque nativo del editor, configurando el estilo, tamaño, iconos y alineación desde el panel lateral, con una previsualización que se actualiza con cada cambio.</p>

<a href="https://ayudawp.com/crear-bloques-wordpress-php/insertar-bloque-php-plugin-ai-share-summarize/" rel="nofollow"><img width="1200" height="835" src="https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-plugin-ai-share-summarize-1200x835.jpg" class="attachment-medium size-medium" alt="insertar bloque php plugin ai share summarize" srcset="https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-plugin-ai-share-summarize-1200x835.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-plugin-ai-share-summarize-768x534.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-plugin-ai-share-summarize-1536x1069.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-plugin-ai-share-summarize-260x180.jpg 260w, https://ayudawp.com/wp-content/uploads/2026/03/insertar-bloque-php-plugin-ai-share-summarize.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/crear-bloques-wordpress-php/bloque-php-plugin-ai-share-summarize/" rel="nofollow"><img width="1200" height="835" src="https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-1200x835.jpg" class="attachment-medium size-medium" alt="bloque php plugin ai share summarize" srcset="https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-1200x835.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-768x534.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-1536x1069.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-260x180.jpg 260w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>
<a href="https://ayudawp.com/crear-bloques-wordpress-php/bloque-php-plugin-ai-share-summarize-renderizado/" rel="nofollow"><img width="1200" height="663" src="https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-renderizado-1200x663.jpg" class="attachment-medium size-medium" alt="bloque php plugin ai share summarize renderizado" srcset="https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-renderizado-1200x663.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-renderizado-768x424.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-renderizado-1536x848.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/03/bloque-php-plugin-ai-share-summarize-renderizado.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px" loading="lazy" decoding="async" fetchpriority="low"></a>

<p>El shortcode <code>[ayudawp_share_buttons]</code> seguirá funcionando exactamente igual para todos los que ya lo tengan insertado en su contenido, que la compatibilidad no se toca.</p>
<p>Esta integración estará disponible en una próxima versión del plugin. Aún no está perfecta pero lo estará.</p>
<h2>Cuándo usar bloques PHP-only y cuándo no</h2>
<p>Después de ver los tres ejemplos, conviene tener claro para qué sirve esta herramienta y para qué no. No todo debería ser un bloque <code>PHP-only</code>, igual que no todo debería ser un shortcode.</p>
<h3>Es buena elección cuando…</h3>
<p>Los bloques <code>PHP-only</code> son la opción adecuada para contenido dinámico que se genera en el servidor, sin necesidad de interacción en el editor más allá de configurar unos parámetros.</p>
<p>Hay muchos ejemplos de esto, como listados de entradas, cajas de autor, alertas o avisos personalizables, CTAs, widgets de datos, embeds de herramientas propias, botones de compartir, bloques informativos que <strong>tiran de la base de datos o de APIs</strong> externas, suma y sigue.</p>
<p>Todo lo que antes resolvías con un shortcode o con una función en el <code>functions.php</code> pero con <strong>la ventaja de una interfaz visual en el editor</strong>.</p>
<p>También son ideales para <strong>temas de bloques y FSE</strong>, donde puedes crear componentes específicos para tu tema sin depender de plugins de terceros.</p>
<h3>No es la mejor opción cuando…</h3>
<p><strong>Si necesitas edición en tiempo real dentro del editor</strong>, como por ejemplo, escribir texto directamente en el bloque, arrastrar elementos o manipular contenido inline. En estos casos necesitas un bloque JavaScript completo. Pasa lo mismo si tu bloque debe contener otros bloques dentro (<code>InnerBlocks</code>), que es algo que los bloques <code>PHP-only</code> no admiten de momento.</p>
<p>Ten en cuenta que la previsualización de un bloque <code>PHP-only</code> usa <code>ServerSideRender</code>, por lo que cada vez que cambias un atributo, el editor hace una petición <code>REST</code> al servidor para obtener el HTML actualizado. Para bloques sencillos esto es imperceptible pero si tu callback hace consultas pesadas o llamadas a APIs externas, cada cambio de atributo puede generar un retardo visible en el editor.</p>
<h3>¿Y los shortcodes?</h3>
<p>Los shortcodes <strong>siguen siendo perfectamente válidos</strong> para retro-compatibilidad y para <strong>situaciones o webs donde no puedes usar el editor de bloques</strong> (campos personalizados, widgets clásicos, plantillas PHP). Pero si estás creando algo nuevo los bloques <code>PHP-only</code> son su sucesor natural porque ofrecen la misma facilidad de desarrollo con una experiencia de usuario mucho mejor en el editor.</p>
<h2>Consejos prácticos y errores comunes</h2>
<p>Para terminar unas cuantas cosas que no están en la documentación oficial y que te pueden ahorrar algún dolor de cabeza:</p>
<ul>
<li><strong>Define siempre valores <code>default</code> en los atributos.</strong> Si un atributo llega vacío o sin definir al callback, tu bloque puede renderizar en blanco o dar un error. Un <code>default</code> te garantiza que siempre hay un valor válido con el que trabajar.</li>
<li><strong>Usa siempre <code>get_block_wrapper_attributes()</code>.</strong> Esta función genera los atributos HTML del contenedor del bloque (clases, estilos inline de los supports como color o espaciado). Si no la usas, los supports que actives no tendrán efecto.</li>
<li><strong>El <code>namespace</code> del bloque es obligatorio.</strong> El primer argumento de <code>register_block_type()</code> debe llevar el formato <code>namespace/nombre-bloque</code> (por ejemplo, <code>ayudawp/author-box</code>). Sin el namespace, el registro fallará.</li>
<li><strong>Los enum solo muestran el valor, no una etiqueta legible.</strong> Si tu enum tiene valores como <code>array( 'small', 'medium', 'large' )</code>, el desplegable en el editor mostrará exactamente esos textos. No hay forma (de momento) de mostrar una etiqueta más descriptiva al lado de cada valor sin recurrir a JavaScript.</li>
<li><strong>Las etiquetas de los controles son el nombre del atributo.</strong> Los controles que genera <code>autoRegister</code> en el panel lateral usan directamente el nombre del atributo como etiqueta, en mayúsculas y sin formato. No hay ninguna propiedad para personalizar esa etiqueta desde PHP. Por eso conviene nombrar los atributos de forma legible desde el principio (por ejemplo, <code>autor</code> en vez de <code>user_id</code>, o <code>biografia</code> en vez de <code>show_bio</code>). No es lo ideal pero es lo que hay de momento. Si necesitas etiquetas descriptivas y una interfaz más cuidada en el panel lateral, ya te toca escribir JavaScript con <code>InspectorControls</code>.</li>
<li><strong>Cuidado con las plantillas en el editor de sitio.</strong> Se ha detectado un problema en las betas de WordPress 7.0 donde los bloques <code>PHP-only</code> se renderizan correctamente en las previsualizaciones de plantillas, pero el CSS aplicado globalmente o por bloque no siempre se muestra. Es un tema que el equipo de desarrollo está resolviendo.</li>
<li><strong>InnerBlocks no están soportados.</strong> No puedes crear un bloque <code>PHP-only</code> que acepte otros bloques dentro. Si necesitas esta funcionalidad, toca usar bloques JavaScript.</li>
<li><strong>El rendimiento del editor depende de tu callback.</strong> Como cada cambio de atributo genera una petición REST que ejecuta tu <code>render_callback</code>, intenta que sea lo más ligero posible. Si haces consultas a la base de datos, plantéate usar <a href="https://developer.wordpress.org/apis/transients/" target="_blank" rel="nofollow noopener">transients</a> para cachear los resultados.</li>
<li><strong>No necesitas <code>block.json</code>.</strong> Para bloques <code>PHP-only</code>, toda la definición del bloque (título, icono, categoría, atributos, supports) va directamente en el array que pasas a <code>register_block_type()</code>. No necesitas crear un archivo <code>block.json</code> separado.</li>
</ul>
<h2>Próximos pasos</h2>
<p><strong>WordPress 7.0</strong> está disponible desde el 9 de abril de 2026. Si quieres probar todo esto antes puedes instalarte una versión beta o el <a href="https://es.wordpress.org/plugins/gutenberg/" target="_blank" rel="nofollow noopener">plugin Gutenberg</a> en un sitio de pruebas.</p>
<p>De cara a WordPress 7.1, el equipo de desarrollo ya está trabajando en <strong>Block Fields</strong>, una evolución de esta misma idea que promete ampliar los tipos de controles automáticos disponibles, y en mejorar la compatibilidad con <strong>Block Bindings</strong>, el sistema que conecta los atributos de los bloques con fuentes de datos externas.</p>
<p>Todo apunta a que <strong>la creación de bloques solo con PHP seguirá mejorando en las próximas versiones</strong>.</p>
<p>Si quieres aprender a crear estos bloques usando inteligencia artificial como copiloto, en la <a href="https://ayudawp.com/vibe-agentic-coding/" target="_blank" rel="noopener ugc">guía de vibe coding y agentic coding para WordPress</a> tienes técnicas y prompts concretos para generar código de plugins y bloques con Claude o ChatGPT.</p>
<p>Y si necesitas repasar los fundamentos de PHP antes de meterte con los bloques, la <a href="https://ayudawp.com/php-basico/" target="_blank" rel="noopener ugc">guía de PHP básico para WordPress</a> es un buen punto de partida, y cuando descubras que esta magia del código es lo tuyo, <a href="https://campus.ayudawp.com/curso-avanzado-de-programacion-profesional-para-wordpress/" rel="ugc ">aquí tienes el único curso de programación para WordPress que existe</a>, preparado por mi y muchos de los mejores profesionales que hay.</p>
<p>Para todo lo demás aquí me tienes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/crear-bloques-wordpress-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>