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

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

<image>
	<url>https://ayudawp.com/wp-content/uploads/2026/05/cropped-ayuda-wordpress-32x32.png</url>
	<title>Ayuda WordPress</title>
	<link>https://ayudawp.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
		<title>Impuestos en WooCommerce: guía de cómo YO conseguí configurarlos bien</title>
		<link>https://ayudawp.com/configurar-impuestos-woocommerce/</link>
					<comments>https://ayudawp.com/configurar-impuestos-woocommerce/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 06:28:14 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[IVA]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160068</guid>

					<description><![CDATA[En esta guía sobre cómo configurar impuestos en WooCommerce explico de manera ordenada y sencilla qué hace cada ajuste, qué cambia según lo que elijas y qué puede fallar.]]></description>
										<content:encoded><![CDATA[<p>La pantalla de <strong>impuestos de WooCommerce</strong> da más quebraderos de cabeza de los que debería, y no es por la cantidad de opciones, que tampoco son tantas, sino porque unas dependen de otras y algunas viven en pantallas distintas.</p>
<p>En esta guía he tratado de explicar de manera ordenada y sencilla <strong>qué hace cada ajuste importante, qué cambia según lo que elijas y dónde está el fallo cuando los precios no salen como esperabas</strong>.</p>
<p>Todo lo que tienes en este artículo es configuración de WooCommerce tal cual viene de serie, sin plugins adicionales. Y lo siento, no soy asesor fiscal, esto explica cómo funciona el software, pero no qué tienes que cobrar ni cuándo, así que para las dudas fiscales habla con tu gestoría.</p>
<p>El grueso del artículo cubre lo que necesita cualquier tienda española que venda a consumidor final dentro de España. Luego, al final, hay un bloque de casos especiales (recargo de equivalencia, retenciones de autónomos, Canarias, ventas a la Unión Europea, productos digitales) que solo tienes que leer si te afecta.</p>
<h2>Activa los impuestos ¿a que se te había olvidado?</h2>
<p>Si acabas de instalar WooCommerce puede que ni siquiera veas la pestaña de impuestos, y no es que se haya perdido. Está desactivada por defecto.</p>
<p>Vete a «<strong>WooCommerce &gt; Ajustes &gt; General</strong>», busca la sección de impuestos y marca la casilla «<strong>Activar tasas de impuestos y sus cálculos</strong>». En cuanto guardes te aparece una pestaña nueva llamada «<strong>Impuesto</strong>» arriba, junto al resto.</p>
<p><img fetchpriority="high" decoding="async" class="sombra alignnone wp-image-160207 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/activar-impuestos-woocommerce-1200x274.jpg" alt="" width="1200" height="274" srcset="https://ayudawp.com/wp-content/uploads/2026/09/activar-impuestos-woocommerce-1200x274.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/activar-impuestos-woocommerce-768x175.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/activar-impuestos-woocommerce-1536x350.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/activar-impuestos-woocommerce.jpg 1570w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<p>Parecerá una bobada pero es la duda que más se repite en los foros de soporte y se resuelve en dos clics. ¿Ya?, pues empezamos.</p>
<h2>Precios con impuestos incluidos o sin ellos, la decisión que más cuesta deshacer</h2>
<p>El <strong>primer ajuste de la pestaña de impuestos</strong> es también el que más te va a condicionar, porque <strong>afecta a cómo introduces todos los precios de todos tus productos</strong>.</p>
<p>Tienes dos opciones, o introduces los precios con los impuestos ya incluidos, y WooCommerce calcula hacia atrás cuánto de ese precio es base y cuánto impuesto, o introduces los precios sin impuestos y WooCommerce los suma luego.</p>
<p><a href="https://ayudawp.com/?attachment_id=160214" rel="nofollow"><img decoding="async" class="sombra alignnone wp-image-160214 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-1200x779.jpg" alt="" width="1200" height="779" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-1200x779.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-768x499.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-1536x998.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<p>Con números se ve mejor, lo vemos. Imagina un producto que quieres que le cueste al cliente <strong>9,99 €</strong> con el IVA general del 21 % incluido.</p>
<ul>
<li>Si eliges <strong>precios con impuestos incluidos</strong>, escribes 9,99 € en la ficha del producto y WooCommerce descompone ese importe en 8,26 € de base imponible y 1,73 € de IVA.</li>
<li>Si eliges <strong>precios sin impuestos</strong>, escribes 8,26 € en la ficha del producto y WooCommerce le suma el 21 % hasta llegar a esos mismos 9,99 €.</li>
</ul>
<p>El resultado final es el mismo, pero el número que tú tecleas es distinto, y ahí es donde te puedes liar tú, y liar a tus clientes como te líes ¿vaya lío, no?</p>
<p><strong>Si cambias esta opción cuando ya tienes el catálogo cargado, todos tus precios cambian de golpe</strong> y en la dirección contraria a la que esperas, porque los 9,99 € que habías metido pensando que llevaban IVA pasan a ser una base a la que ahora se le suma un 21 % encima, y el producto se le queda al cliente en 12,09 €.</p>
<p>Para una tienda que vende a consumidor final en España lo habitual es trabajar con precios con impuestos incluidos, porque es lo que el cliente espera ver y porque la ley de consumo obliga a mostrar el precio final. Si vendes a profesionales y tu catálogo va sin IVA, la otra opción tiene más sentido.</p>
<p>Y luego está la comodidad, la otra derivada, porque si te decides por poner en tus productos los precios con impuestos incluidos y un día el gobierno te cambia el IVA (por ejemplo) te toca modificar todos los precios uno a uno, variaciones incluidas, mientras que si elegiste crearlos con el precio antes de impuestos solo tendrías que cambiar el impuesto en los ajustes de impuestos. Valóralo también ¿vale?</p>
<p>Ya te dije que esto es un poco lioso, así que <strong>dale una pensada antes de decidirte, pero sobre todo haz pruebas siempre</strong> tras cualquier cambio, y hazlas como cliente, y completas.</p>
<h2>En base a qué ubicación se calculan los impuestos</h2>
<p>Este es el punto donde se atasca prácticamente todo el mundo, yo incluido, que lo tengo que pensar siempre un par de veces, y es que el síntoma es siempre el mismo, impuestos que no salen, o salen mal o cambian de repente.</p>
<p>La causa <strong>está repartida entre dos pantallas distintas que además no están ni siquiera cerca</strong>. Intuitivo ¿eh?</p>
<h3>Las tres opciones de cálculo</h3>
<p>En la pestaña de ajustes de impuestos (<strong>Impuesto</strong>) tienes un desplegable con tres posibilidades:</p>
<ul>
<li><strong>Dirección de envío del cliente</strong>: es la opción por defecto y aplica el impuesto que corresponda al sitio adonde va el paquete.</li>
<li><strong>Dirección de facturación del cliente</strong>: aplica el impuesto del sitio que el cliente haya puesto como dirección de facturación, aunque el envío vaya a otro lado.</li>
<li><strong>Dirección base de la tienda</strong>: aplica siempre tu impuesto, el de donde tú estás, el de la dirección a la que configuraste tu tienda, sin mirar dónde está el cliente.</li>
</ul>
<p><img decoding="async" class="sombra alignnone wp-image-160209 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-basado-en-1200x349.jpg" alt="" width="1200" height="349" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-basado-en-1200x349.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-basado-en-768x223.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-basado-en.jpg 1384w" sizes="(max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Las dos primeras solo funcionan bien cuando el cliente ha rellenado ese dato</strong>, con lo cual no hacen ningún cálculo mientras el visitante está mirando la tienda sin haber puesto todavía una dirección. Y ahí es donde entra la segunda pantalla de la que te hablaba antes.</p>
<h3>Qué pasa con los impuestos antes de que el cliente diga dónde vive, y la madre que los parió a todos los que diseñan los ajustes de WooCommerce que, por supuesto, no tienen que vivir con ello</h3>
<p>El desplegable anterior decide qué dirección usar <em>una vez que WooCommerce la conoce</em>, pero <strong>mientras el visitante simplemente está curioseando productos WooCommerce no tiene ni idea de dónde está</strong>, ni por supuesto qué impuestos mostrar, así que necesita partir de alguna suposición.</p>
<p><strong>Esa suposición se configura en un sitio completamente distinto</strong>, en «<strong>WooCommerce &gt; Ajustes &gt; General &gt; Ubicación del cliente por defecto</strong>», y es <strong>la causa real de la mayoría de los problemas de impuestos</strong> que la gente atribuye al ajuste anterior.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160210 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-cliente-por-defecto-1200x390.jpg" alt="" width="1200" height="390" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-cliente-por-defecto-1200x390.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-cliente-por-defecto-768x249.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-cliente-por-defecto.jpg 1330w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Las opciones que tienes ahí y qué provoca cada una:</p>
<ul>
<li><strong>Sin ubicación por defecto</strong>: WooCommerce no supone nada, así que hasta que el visitante no dé una dirección es fácil que no se muestre ningún impuesto en la ficha de producto. Este es el famoso «<strong>no me sale el IVA en la tienda</strong>».</li>
<li><strong>País/región de la tienda</strong>: da por hecho que el visitante está donde estás tú hasta que diga lo contrario. Es la que menos sorpresas da si vendes sobre todo en España.</li>
<li><strong>Geolocalizar</strong>: detecta el país del visitante por su IP desde el primer momento. Ojo con esta si tienes caché de página, porque si el servidor está sirviendo la misma página guardada a todo el mundo, la detección puede no reflejarse.</li>
<li><strong>Geolocalizar (compatible con caché de página)</strong>: hace lo mismo pero resolviendo la detección por otra vía para que la caché no se la coma. Es la que hay que usar si quieres geolocalizar y tienes caché, que en un hosting decente la tienes seguro.</li>
</ul>
<p>Con esto ya puedes explicarte el síntoma más desesperante de todos, <strong>que en la ficha de producto veas un precio y al llegar al carrito o al finalizar la compra te salga otro distinto</strong>. Pasa cuando la ubicación que WooCommerce estaba suponiendo no coincide con la dirección real que el cliente acaba metiendo, y entonces recalcula.</p>
<p>Para la mayoría de tiendas españolas <strong>la pareja de ajustes que menos incidencias da</strong> es dejar la ubicación por defecto en <strong>País/región de la tienda</strong> y el cálculo en <strong>Dirección de envío del cliente</strong>. Con esta configuración <strong>el visitante ve desde el primer momento un precio con el IVA español, y si resulta que compra desde otro sitio, se recalcula al meter la dirección</strong>.</p>

<a href="https://ayudawp.com/configurar-impuestos-woocommerce/woocommerce-calcular-impuesto-direccion-envio-cliente/" rel="nofollow"><img width="1344" height="136" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-direccion-envio-cliente.jpg" class="attachment-large size-large" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-direccion-envio-cliente.jpg 1344w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-direccion-envio-cliente-1200x121.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-calcular-impuesto-direccion-envio-cliente-768x78.jpg 768w" sizes="(max-width: 1344px) 100vw, 1344px" decoding="async" fetchpriority="high"></a>
<a href="https://ayudawp.com/configurar-impuestos-woocommerce/woocommerce-ubicacion-defecto-cliente-pais-region-tienda/" rel="nofollow"><img width="1334" height="146" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-defecto-cliente-pais-region-tienda.jpg" class="attachment-large size-large" alt="" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-defecto-cliente-pais-region-tienda.jpg 1334w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-defecto-cliente-pais-region-tienda-1200x131.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ubicacion-defecto-cliente-pais-region-tienda-768x84.jpg 768w" sizes="auto, (max-width: 1334px) 100vw, 1334px" loading="lazy" decoding="async" fetchpriority="low"></a>

<h2>Clases de impuesto, una etiqueta para agrupar productos</h2>
<p>WooCommerce trae tres clases de impuesto de fábrica, que son <strong>Estándar</strong>, <strong>Tasa reducida</strong> y <strong>Tasa cero</strong>. Cada clase tiene su propia tabla de tasas independiente, y cada producto se asigna a una de ellas desde su ficha, en la pestaña general de los datos del producto.</p>
<p><a href="https://ayudawp.com/?attachment_id=160214" rel="nofollow"><img decoding="async" class="sombra alignnone wp-image-160214 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-1200x779.jpg" alt="" width="1200" height="779" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-1200x779.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-768x499.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos-1536x998.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tasas-impuestos.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px"></a></p>
<p>Puedes añadir las clases que necesites escribiéndolas en el campo correspondiente de la pantalla de opciones, una por línea. En cuanto guardes te aparecen como subpestañas nuevas en la parte de arriba, junto a las que ya había, y cada una con su tabla vacía esperando a que le metas tasas.</p>
<p><strong>Para una tienda española normal no necesitas crear ninguna clase adicional</strong>, porque los tres tipos de IVA que existen encajan directamente en las tres que ya vienen. El general va en Estándar, el reducido en Tasa reducida y el superreducido lo puedes meter en Tasa cero renombrándola mentalmente, o crear una clase nueva llamada Superreducido si prefieres tenerlo claro al mirar la ficha de un producto.</p>
<h2>La tabla de tasas de impuestos, columna por columna</h2>
<p>Aquí es donde se define de verdad qué se cobra. Entras en cualquiera de las clases, pulsas en insertar fila y rellenas las columnas.</p>
<p><a href="https://ayudawp.com/?attachment_id=160218" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160218 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tabla-tasas-impuestos-empresa-peninsula-espana-1200x728.jpg" alt="" width="1200" height="728" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tabla-tasas-impuestos-empresa-peninsula-espana-1200x728.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tabla-tasas-impuestos-empresa-peninsula-espana-768x466.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tabla-tasas-impuestos-empresa-peninsula-espana-1536x932.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-tabla-tasas-impuestos-empresa-peninsula-espana.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<h3>Las columnas de siempre</h3>
<ul>
<li><strong>Código de país</strong>: dos letras en mayúsculas, <code>ES</code> para España. Un asterisco significa todos los países.</li>
<li><strong>Código de provincia</strong>: igual, con asterisco para todas. Si solo vendes en península y Baleares, con el asterisco lo tienes resuelto.</li>
<li><strong>Código postal</strong>: admite varios separados por punto y coma, comodines con asterisco al final (<code>07*</code> coge todos los que empiecen por 07) y rangos numéricos con tres puntos (<code>07000...07999</code>). Lo que no puedes es mezclar las dos técnicas, porque <strong>un comodín dentro de un rango numérico no funciona</strong>.</li>
<li><strong>Ciudad</strong>: lista separada por punto y coma y coincidencia exacta, o sea que si el cliente escribe el nombre de otra manera no coincide. Poco fiable, mejor usar códigos postales.</li>
<li><strong>Tasa %</strong>: el número, con punto decimal si lleva decimales. Para el 21 % se escribe <code>21.0000</code>.</li>
<li><strong>Nombre del impuesto</strong>: el texto que verá el cliente si tienes activado el desglose. Aquí pon IVA, o lo que toque.</li>
</ul>
<h3>¿Qué es eso de la prioridad?</h3>
<p>La prioridad <strong>es un número que le pones a cada fila</strong>, y la forma más fácil de entenderla es pensar en <strong>turnos</strong>.</p>
<p>WooCommerce va por turnos empezando por el número más bajo. En cada turno mira todas las filas que llevan ese número, se queda con la primera que encaje con la venta, la cobra y pasa al turno siguiente. Cuando ya no quedan filas, se acabó.</p>
<p>De ahí salen las dos únicas cosas que tienes que recordar:</p>
<ul>
<li><strong>Dos filas con el mismo número</strong>: compiten entre ellas y solo se cobra una.</li>
<li><strong>Dos filas con números distintos</strong>: se cobran las dos, una detrás de otra.</li>
</ul>
<p>Y ahora los dos casos reales donde esto te va a pasar de verdad.</p>
<p><strong>Cuando quieres que solo se aplique una</strong>, que es lo normal. Imagina que tienes una fila para todo el país con el IVA del 21 % y otra para Las Palmas al 0 %, porque a Canarias no le repercutes IVA. Un cliente de Las Palmas encaja con las dos, así que las dos tienen que llevar <strong>la misma prioridad, el 1</strong>. Así solo hay un turno, se cobra una sola fila y en paz.</p>
<p>Si por despiste le pusieras a la fila de Canarias la prioridad 2, pasaría esto: en el turno 1 se le cobra el 21 % de la fila general y en el turno 2 se le cobra el 0 % de la fila canaria, que no suma nada. Resultado, el cliente de Las Palmas paga el 21 % de IVA que precisamente querías ahorrarle, porque <strong>una fila al 0 % no anula a la anterior, simplemente no suma nada</strong>.</p>
<p><strong>Cuando quieres que se apliquen las dos</strong>, que es el caso del recargo de equivalencia. Aquí es justo al revés, porque necesitas cobrar el IVA y encima el recargo. La fila del IVA al 21 % va con prioridad 1 y la del recargo al 5,2 % con prioridad 2. Sobre una base de 100 € se cobran 21 € en el primer turno y 5,20 € en el segundo, así que el cliente paga 126,20 €.</p>
<p>Si les pusieras a las dos la prioridad 1 competirían entre ellas, se cobraría solo la primera y te faltarían esos 5,20 € en cada pedido.</p>
<p><strong>Y si tu tienda no está en ninguno de esos dos casos</strong>, o sea si solo cobras IVA español y punto, pon un 1 en todas las filas y olvídate del asunto.</p>
<h3>¿Compuesto? Ojo con esta casilla, que cambia precios sin avisar</h3>
<p>Esta casilla decide una sola cosa, <strong>si ese impuesto se calcula sobre el precio del producto o sobre el precio del producto con el impuesto anterior ya sumado encima</strong>. Dicho a lo bruto, marcarla es cobrar impuesto del impuesto.</p>
<p>Se ve clarísimo otra vez con el recargo de equivalencia, que es el único caso español en el que vas a tener dos filas conviviendo. Partimos de una base de 100 €, IVA del 21 % y recargo del 5,2 %:</p>
<ul>
<li><strong>Sin compuesto</strong>, que es lo correcto: el recargo se calcula sobre los 100 € de base, o sea 5,20 €. El cliente paga 126,20 €.</li>
<li><strong>Con compuesto</strong>, que es el error: el recargo se calcula sobre 121 €, o sea 6,29 €. El cliente paga 127,29 €.</li>
</ul>
<p>Un euro y pico de diferencia en un pedido de 100 €, que en uno de 1.000 € se convierte en casi 11 € que le estás cobrando de más a tu cliente sin que ni él ni tú os hayáis enterado. <strong>En España esta casilla se queda sin marcar</strong>, porque tanto el IVA como el recargo se calculan sobre la misma base.</p>
<h3>La casilla de envío</h3>
<p>Decide si esa tasa se cobra también sobre los gastos de envío, además de sobre los productos. Con un ejemplo se ve en un segundo, pedido de 100 € con 5 € de gastos de envío e IVA del 21 %:</p>
<ul>
<li><strong>Casilla marcada</strong>: el 21 % se calcula sobre 105 €, o sea 22,05 € de IVA. El cliente paga 127,05 €.</li>
<li><strong>Casilla sin marcar</strong>: el 21 % se calcula solo sobre los 100 € de los productos, o sea 21 €, y el envío se va limpio. El cliente paga 126 €.</li>
</ul>
<p>Lo normal es tenerla marcada en tus filas de IVA, porque el transporte también lleva IVA. Se deja sin marcar en casos concretos, como la fila del recargo de equivalencia, que grava el producto y no el porte.</p>
<p>Y aunque parezca una casilla inofensiva tiene más mala leche de la que aparenta, porque se coordina con otro ajuste que está en otra parte de la pantalla y ahí es donde se puede liar parda. Te lo cuento un poco más abajo, en su propia sección.</p>
<h3>Los tipos de IVA que hay que dar de alta</h3>
<p>Actualmente los tipos de IVA que hay en España son estos:</p>
<ul>
<li><strong>General, 21 %</strong>: todo lo que no esté expresamente en las dos listas siguientes. Si no sabes qué tipo aplicarle a algo, casi seguro que es este.</li>
<li><strong>Reducido, 10 %</strong>: alimentación en general, hostelería, transporte de viajeros y vivienda, entre otros.</li>
<li><strong>Superreducido, 4 %</strong>: pan común, leche, huevos, frutas y verduras naturales, aceite de oliva (que se quedó aquí de forma permanente desde el 1 de enero de 2025), libros, periódicos y medicamentos de uso humano.</li>
</ul>
<p>Hay una cuarta situación que no es un tipo sino una exención, y conviene no confundirla. La enseñanza reglada, la sanidad o algunos servicios financieros no llevan IVA porque están exentos, que no es lo mismo que estar al 0 %, y tiene consecuencias en el derecho a deducir de quien presta el servicio. Si vendes algo de esto, consúltalo con tu asesoría antes de meterlo en la tabla.</p>
<p>Los listados de productos por tipo se retocan de vez en cuando, así que si vendes algo que no tengas clarísimo, échale un vistazo a la <a href="https://sede.agenciatributaria.gob.es/" target="_blank" rel="nofollow noopener">web de la Agencia Tributaria</a> antes de dar por buena una tasa.</p>
<h3>Importar, exportar y borrar tasas</h3>
<p>Al pie de cada tabla de tasas de impuestos tienes botones para importar y exportar en CSV, muy útiles si mantienes un entorno de pruebas y otro de producción, o si gestionas varias tiendas parecidas.</p>
<p>El CSV lleva diez columnas en este orden: país, estado, código postal, ciudad, tasa, nombre del impuesto, prioridad, compuesto, envío y clase de impuesto. En vez de construirlo a mano, <strong>crea una fila cualquiera desde la interfaz y exporta</strong>, así tienes la plantilla exacta y solo tienes que rellenarla.</p>
<p>Para borrar, seleccionas las filas que quieras (con mayúsculas o con la tecla de comando para elegir varias) y pulsas en eliminar. Si lo que quieres es empezar de cero, en <strong>WooCommerce &gt; Estado &gt; Herramientas</strong> tienes una herramienta para eliminar todas las tasas de impuesto de golpe. Eso sí, <strong>esa acción no se puede deshacer</strong>, así que úsala solo si vas a rehacer la configuración entera.</p>
<h2>Los precios que ve el cliente y el aviso que sale cuando algo no cuadra</h2>
<p>Un poco más abajo en la misma pantalla de ajustes de los impuestos hay dos desplegables que deciden qué ve el cliente, y son independientes entre sí.</p>
<ul>
<li><strong>Mostrar los precios en la tienda</strong>: con impuestos incluidos o sin ellos.</li>
<li><strong>Mostrar los precios en el carrito y al finalizar la compra</strong>: lo mismo, pero puede ser distinto del anterior.</li>
</ul>
<p>Que sean independientes tiene sentido en algunos casos, por ejemplo en una tienda para profesionales que muestra el catálogo sin IVA pero luego desglosa en el carrito. Lo que no tiene sentido es que no cuadren sin querer.</p>
<p>Cuando la combinación de estos dos desplegables con el ajuste de precios con impuestos incluidos no es coherente, <strong>WooCommerce te muestra un aviso en la propia pantalla advirtiendo de que esa mezcla puede provocar descuadres de céntimos por redondeo</strong>, con un botón para igualar los tres de golpe.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160220 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-aviso-problemas-redondeo-impuestos-ajustes-impuestos-1200x734.jpg" alt="" width="1200" height="734" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-aviso-problemas-redondeo-impuestos-ajustes-impuestos-1200x734.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-aviso-problemas-redondeo-impuestos-ajustes-impuestos-768x470.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-aviso-problemas-redondeo-impuestos-ajustes-impuestos.jpg 1376w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Si te sale ese aviso hazle caso, porque lo que viene después son clientes preguntándote por qué el total no les sale.</p>
<h2>El impuesto de los gastos de envío, con sus casos especiales</h2>
<p>Los gastos de envío también llevan impuesto, y decidir cuál es más enrevesado de lo que parece porque intervienen dos cosas a la vez.</p>
<h3>El desplegable de clase de impuesto de envío</h3>
<p>En la misma pantalla de opciones tienes un desplegable para la clase de impuesto que se aplica al envío, con estas posibilidades:</p>
<ul>
<li><strong>Basado en los artículos del carrito</strong>: es la opción por defecto y hereda la clase de los productos que lleve el pedido.</li>
<li><strong>Estándar</strong>, <strong>Tasa reducida</strong>, <strong>Tasa cero</strong> o cualquier clase que hayas creado: fuerza siempre esa, pase lo que pase.</li>
</ul>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160221 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ajusets-impuesto-por-envio-1200x429.jpg" alt="" width="1200" height="429" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ajusets-impuesto-por-envio-1200x429.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ajusets-impuesto-por-envio-768x275.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ajusets-impuesto-por-envio-1536x550.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-ajusets-impuesto-por-envio.jpg 1582w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<h3>¿Y qué pasa cuando el carrito mezcla productos de clases distintas?</h3>
<p>Aquí está la regla que hay que saberse de memoria, porque no es intuitiva que se diga. Si dejas la opción por defecto y el pedido lleva productos de varias clases, <strong>manda la clase Estándar en cuanto haya al menos un producto que la use</strong>, sea o no el tipo más alto de los que lleva el carrito. Y <strong>si no hay ningún producto en Estándar se usa la primera clase adicional que aparezca</strong> en tu lista de clases.</p>
<p>Un ejemplo de los que pasan todos los días. Un pedido con un libro al 4 % y una camiseta al 21 %, más 5 € de gastos de envío. Como la camiseta está en la clase Estándar, <strong>el envío tributa al 21 %</strong>, así que el cliente paga 5 € más 1,05 € de IVA por el transporte, y no los 0,20 € que saldrían si se aplicara el tipo del libro.</p>
<p>De esa regla sale un truco útil, y es que <strong>si necesitas que el envío tribute siempre a una clase adicional concreta cuando no haya productos estándar</strong> de por medio, esa clase tiene que ir la primera de la lista, porque es la que WooCommerce coge en ese caso.</p>
<h3>La casilla de envío de cada tasa</h3>
<p>Y ahora la parte que descoloca, y es que el hecho de elegir una clase en ese desplegable no basta, porque <strong>quien decide de verdad si se cobra impuesto por el envío es la casilla de envío de cada fila de la tabla de tasas</strong>.</p>
<p>El error típico es cuando seleccionas <strong>Tasa reducida</strong> en el desplegable pensando que así el envío irá al 10 %, pero resulta que la fila del 10 % en la tabla no tiene marcada la casilla de envío. El resultado no es que el envío vaya al 10 %, es que <strong>el envío no lleva impuesto ninguno</strong>. Las dos cosas tienen que ir coordinadas o el resultado te dará disgustos.</p>
<p>Para el caso normal deja el desplegable en la opción por defecto basada en los artículos del carrito y asegúrate de que la fila del IVA general tiene marcada la casilla de envío. Con eso cubres casi todas las combinaciones sin sustos.</p>
<h2>Redondeo: cuándo es importante y cuándo da igual</h2>
<p>Hay una <strong>casilla para redondear el impuesto a nivel de subtotal en vez de hacerlo línea a línea</strong>. Por defecto viene desmarcada, así que WooCommerce redondea el impuesto de cada línea de producto por separado y luego suma.</p>
<p><strong>La diferencia solo se nota en pedidos con muchas líneas y tasas con decimales</strong>, donde cada redondeo por línea puede arrastrar medio céntimo arriba o abajo y al sumarlos todos aparece un descuadre de uno o dos céntimos frente a calcular el impuesto una sola vez sobre el total ya sumado.</p>
<p>Con tres artículos no vas a notar nada, pero con un pedido mayorista de cuarenta líneas puede que sí, y entonces marcar esta casilla te ahorra la conversación de los céntimos con el cliente y con la asesoría. <strong>Si tu asesoría te pide que los importes cuadren al céntimo con su programa, prueba a marcarla</strong>, porque muchos programas de contabilidad calculan sobre el subtotal.</p>
<h2>El sufijo de precio, para enseñar los dos importes a la vez</h2>
<p>Es un campo de texto libre que se pinta detrás del precio en toda la tienda, y acepta dos comodines que WooCommerce sustituye por el importe correspondiente.</p>
<ul>
<li><code>{price_including_tax}</code>: el precio con impuestos.</li>
<li><code>{price_excluding_tax}</code>: el precio sin impuestos.</li>
</ul>
<p>Con esto puedes montar cosas como <strong>IVA incluido</strong> a secas, o algo más completo tipo <code>{price_excluding_tax} + IVA</code> si tu tienda <strong>muestra precios finales pero quieres que se vea la base</strong>. La utilidad más habitual es al revés, en tiendas para profesionales que enseñan precios sin IVA y necesitan dejar claro cuál es el importe final.</p>
<p>Un detalle que despista, <strong>en los productos variables el sufijo no aparece hasta que el cliente elige una variación</strong>, porque hasta ese momento WooCommerce no sabe qué precio tiene que calcular.</p>
<h2>El total de impuestos: ¿único o detallado?</h2>
<p>El último ajuste de la pantalla decide cómo se ve el impuesto en el carrito y al finalizar la compra.</p>
<ul>
<li><strong>Como un total único</strong>: una sola línea que pone «Impuestos» y suma todo lo que haya.</li>
<li><strong>Detallado</strong>: una línea por cada tasa, con el nombre que le hayas puesto en la columna correspondiente de la tabla.</li>
</ul>
<h3>Qué conviene poner</h3>
<p>Si toda tu tienda va con un único tipo de IVA, el total único queda más limpio y es perfectamente correcto. En cuanto puedes tener dos tipos en el mismo pedido, o dos impuestos a la vez como pasa con el recargo de equivalencia, <strong>el desglosado te ahorra problemas</strong> porque el cliente ve en pantalla lo mismo que se va a encontrar luego en la factura.</p>
<h3>¿Qué es lo obligatorio por ley?</h3>
<p>Aquí conviene no mezclar dos cosas distintas. <strong>Este ajuste afecta a la pantalla de compra, que es experiencia de usuario, y no a la factura</strong>, que es otra historia.</p>
<p>La obligación de verdad está en el Reglamento de facturación, el <a href="https://www.boe.es/buscar/act.php?id=BOE-A-2012-14696" target="_blank" rel="nofollow noopener">Real Decreto 1619/2012</a>, cuyo artículo 6 exige que la factura indique el tipo aplicado y la cuota por separado, y que <strong>cuando una misma factura tenga operaciones a distintos tipos de IVA se desglose también la base imponible que corresponde a cada uno</strong>.</p>
<p>Eso afecta al documento de factura, que WooCommerce por sí solo no genera, así que <strong>activar el desglose en el carrito no equivale a cumplir con Hacienda</strong>. Es una buena práctica de transparencia y evita que la pantalla de compra y la factura se contradigan, pero la factura la tendrás que emitir con tu programa de facturación o con un plugin dedicado.</p>
<h2>Por qué a veces los ajustes de WooCommerce salen en gris, inactivos</h2>
<p>Si abres la pantalla y la ves distinta a lo que te estoy contando, con la mitad de las opciones desactivadas y sin poder tocarlas, probablemente tengas activado el cálculo automático de impuestos.</p>
<p>Cuando ese cálculo automático está activo WooCommerce deja de hacerte caso a la tabla manual porque los tipos los decide un servicio externo según la dirección del cliente. <strong>Para poder seguir los pasos de esta guía tienes que desactivarlo</strong>, y entonces recuperas el control de la tabla de tasas.</p>
<h2>Los informes de impuestos</h2>
<p>En <strong>WooCommerce &gt; Análisis &gt; Impuestos</strong> tienes el resumen de lo recaudado, con filtro por fechas y desglose por cada tasa que tengas configurada.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160224 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-analisis-impuestos-1200x701.jpg" alt="" width="1200" height="701" srcset="https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-analisis-impuestos-1200x701.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-analisis-impuestos-768x448.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-analisis-impuestos-1536x897.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/woocommerce-analisis-impuestos.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Es lo que le vas a pasar a tu gestoría cada trimestre, y de paso es la comprobación más rápida de si la configuración está bien hecha, porque si ves tasas que no esperabas o importes raros, algo has liado en la tabla.</p>
<h2>Repaso rápido para no dejarte nada</h2>
<p>El orden en el que conviene tomar las decisiones, por si quieres ir marcando:</p>
<ol>
<li>Activar los impuestos en los ajustes generales.</li>
<li>Decidir si introduces los precios con impuestos incluidos o sin ellos, antes de cargar el catálogo.</li>
<li>Poner la ubicación del cliente por defecto en Ajustes generales.</li>
<li>Elegir según qué dirección se calculan los impuestos.</li>
<li>Dar de alta las tasas de los tipos que necesites, con su nombre y su prioridad.</li>
<li>Coordinar la clase de impuesto del envío con la casilla de envío de la tasa que corresponda.</li>
<li>Ajustar el redondeo y cómo se muestran precios y totales.</li>
<li>Hacer un pedido de prueba y comprobar que los números salen donde tienen que salir.</li>
</ol>
<p>Y los fallos que más se repiten, para que los tengas fichados:</p>
<ul>
<li>Cambiar lo de precios con impuestos incluidos cuando el catálogo ya está cargado, y no revisar qué le ha pasado al margen.</li>
<li>Dejar la ubicación del cliente por defecto sin poner y volverse loco buscando por qué no sale el IVA en la tienda.</li>
<li>Marcar la casilla de compuesto pensando que sirve para relacionar dos impuestos que en realidad van sobre la misma base.</li>
<li>Elegir una clase de impuesto para el envío sin comprobar que esa tasa tiene marcada la casilla de envío.</li>
<li>Poner la misma prioridad a dos tasas que tenían que aplicarse las dos a la vez.</li>
</ul>
<h2>Los casos especiales: IRPF, recargo de equivalencia, otros impuestos y envíos, productos digitales, etc.</h2>
<p>Hasta aquí lo que necesita una tienda española que vende a consumidor final dentro de España. Lo que viene ahora solo te hace falta si estás en alguno de estos supuestos, así que ve directo al tuyo.</p>
<h3>Vendes a comerciantes minoristas, recargo de equivalencia</h3>
<p>El recargo de equivalencia <strong>es un régimen especial de IVA obligatorio para comerciantes minoristas</strong> que sean personas físicas o comunidades de bienes y que vendan productos sin transformar al consumidor final. Si tus clientes son de ese perfil, tienes que facturarles el IVA más un recargo adicional.</p>
<p>Lo básico:</p>
<ul>
<li>Los tipos vigentes en 2026 son 5,2 % para los productos que van al 21 %, 1,4 % para los que van al 10 % y 0,5 % para los del 4 %.</li>
<li>En la tabla de tasas se monta con dos filas del mismo país y prioridades distintas, una para el IVA y otra para el recargo, como te contaba en la sección de prioridad.</li>
<li>La fila del recargo no se marca como compuesta, porque va sobre la misma base que el IVA.</li>
<li>Tampoco se le suele marcar la casilla de envío, porque el recargo grava el producto y no el transporte.</li>
<li>Con el desglose de totales activado, para que en el pedido se vean el IVA y el recargo como conceptos separados.</li>
</ul>
<p>Y aquí está el límite de lo que WooCommerce hace solo, porque <strong>la tabla de tasas funciona por zonas geográficas y no distingue qué tipo de cliente está comprando</strong>, que es justo lo que necesitas para decidir si aplicas el recargo o no. Esa parte te la conté en su momento con la solución por rol de usuario en <a href="https://ayudawp.com/recargo-equivalencia-woocommerce/" target="_blank" rel="ugc noopener">el artículo dedicado al recargo de equivalencia en WooCommerce</a>.</p>
<h3>Eres autónomo y tienes que retener IRPF</h3>
<p>Si eres autónomo dado de alta en una actividad profesional y le vendes a otros profesionales o a empresas, en esas facturas hay que restar la retención del IRPF.</p>
<p>Lo básico:</p>
<ul>
<li>El tipo general de retención es el 15 %, con un reducido del 7 % para nuevos autónomos durante el año de alta y los dos siguientes.</li>
<li>Solo aplica en actividades profesionales, las de las secciones segunda y tercera del impuesto de actividades económicas, no en las empresariales de la sección primera.</li>
<li>Nunca se le retiene a un particular, solo a empresas y profesionales.</li>
<li>La retención se calcula sobre la base imponible, y el IVA también, así que el IVA no cambia por el hecho de que haya retención.</li>
</ul>
<p><strong>Esto no se puede montar solo con la tabla de tasas de WooCommerce</strong>, porque todas sus columnas son geográficas y ninguna distingue qué tipo de cliente está comprando, que es justo lo que decide si hay retención o no. Lo tienes desarrollado, con los requisitos que debe cumplir cualquier solución y las opciones que hay según tu caso, en <a href="https://ayudawp.com/woocommerce-irpf-autonomos/" target="_blank" rel="ugc noopener">el artículo sobre la retención de IRPF en WooCommerce</a>.</p>
<h3>Envías a Canarias, Ceuta o Melilla desde la península</h3>
<p>Estos territorios están fuera del ámbito de aplicación del IVA español, así que la venta desde la península hacia allí es una <strong>exportación exenta</strong>. Y de ahí sale lo que más confunde, y es que tú no cobras absolutamente ningún impuesto en esa venta.</p>
<p>Ni IVA, que no aplica, ni tampoco el IGIC canario o el IPSI de Ceuta y Melilla, porque esos <strong>los liquida el cliente en destino</strong> cuando el transportista o Correos le entrega el paquete, junto con los gastos de gestión que le cobren por el trámite.</p>
<p>En la tabla de tasas se refleja con cuatro filas al 0 %, una por cada provincia implicada, usando los códigos de provincia que espera WooCommerce:</p>
<ul>
<li><code>ES</code> / <code>GC</code> / <code>0.0000</code> para Las Palmas.</li>
<li><code>ES</code> / <code>TF</code> / <code>0.0000</code> para Santa Cruz de Tenerife.</li>
<li><code>ES</code> / <code>CE</code> / <code>0.0000</code> para Ceuta.</li>
<li><code>ES</code> / <code>ML</code> / <code>0.0000</code> para Melilla.</li>
</ul>
<p>Si prefieres tirar de códigos postales, el equivalente es <code>35*</code> y <code>38*</code> para Canarias, <code>51*</code> para Ceuta y <code>52*</code> para Melilla. Y acuérdate de marcarles la casilla de envío, porque tampoco se repercute impuesto sobre el transporte de una operación exenta.</p>
<p>Hay un detalle que tienes que comprobar tú y no dar por hecho, y es que si tu fila del IVA general lleva un asterisco en la columna de provincia, esa fila también encaja con un cliente de Las Palmas, así que las dos compiten.</p>
<p>Como solo se aplica una tasa por prioridad, coloca las filas específicas por encima de la general arrastrándolas en la tabla y <strong>haz un pedido de prueba con una dirección canaria para ver cuál gana de verdad</strong>. Son cinco minutos y te ahorran facturar mal durante meses.</p>
<p>Y un aviso que va más allá de los impuestos, porque un envío a estos destinos puede llevar trámites de aduana según el producto y su valor. Eso condiciona también cómo montes las zonas de envío, y es de las cosas que conviene consultar con tu gestoría antes de abrir la venta a estos territorios.</p>
<h3>Tu tienda está en Canarias</h3>
<p>Aquí la película es la contraria, porque <strong>sí repercutes IGIC</strong> en tus ventas dentro del archipiélago, y no IVA. La buena noticia es que la mecánica de WooCommerce es exactamente la misma que te he contado en todo el artículo, solo cambian los números que metes en las tasas.</p>
<p>Los tipos vigentes en 2026 son estos:</p>
<ul>
<li><strong>0 %</strong>: pan, leche, huevos, harinas, frutas, verduras, agua, libros, periódicos, medicamentos de uso humano y vivienda de protección oficial.</li>
<li><strong>3 %</strong>: transporte de viajeros, hostelería y reparaciones de vivienda, entre otros.</li>
<li><strong>7 %</strong>: el tipo general, o sea todo lo que no encaje en ningún otro. Es el equivalente al 21 % peninsular.</li>
<li><strong>9,5 %</strong>: perfumería, joyería por debajo de 400 € y embarcaciones de hasta nueve metros.</li>
<li><strong>15 %</strong>: artículos considerados suntuarios, como vehículos de lujo, embarcaciones grandes o joyas por encima de 400 €.</li>
<li><strong>20 %</strong>: labores del tabaco rubio.</li>
</ul>
<p>Desde 2026 hay además un tipo específico del 1 % para el petróleo y sus derivados, así que si vendes algo de eso no lo metas en el general por costumbre.</p>
<p><strong>Un matiz que despista es que el tipo cero del IGIC no es lo mismo que una operación exenta</strong>. A tipo cero repercutes un 0 % pero conservas el derecho a deducir el IGIC que hayas soportado, mientras que en una operación exenta no deduces.</p>
<p>Para WooCommerce da igual porque en los dos casos la fila va a cero, pero para tu modelo 420 la diferencia es grande, así que no las mezcles en la misma clase de impuesto si quieres tener los números claros al cerrar el trimestre.</p>
<p>Si además vendes a la península desde Canarias, esa venta es una exportación igual que en el caso anterior, así que necesitas una fila al 0 % para el resto de provincias españolas. Lo que no puedes hacer es facturarle IGIC a un cliente peninsular, que es el error más típico de quien monta la tienda desde el archipiélago.</p>
<p>Los tipos y qué producto va en cada uno los actualiza la Agencia Tributaria Canaria, así que consúltalo ahí antes de dar por buena ninguna tasa, que estos tipos se retocan más a menudo que los peninsulares.</p>
<h3>Tu tienda está en Ceuta o Melilla</h3>
<p>Aquí <strong>no hay ni IVA ni IGIC sino IPSI</strong>, con tipos que van del 0,5 % al 10 % según la actividad. La particularidad es que <strong>cada ciudad tiene su propia ordenanza fiscal</strong>, así que no existe una tabla común que te sirva para las dos y tienes que mirar la de tu ciudad para saber qué tipo le corresponde a cada cosa que vendes.</p>
<p>El montaje en WooCommerce no tiene misterio una vez sabes los tipos, es dar de alta las tasas en las clases correspondientes igual que en cualquier otro caso.</p>
<h3>Vendes a particulares de otros países de la Unión Europea</h3>
<p>Mientras tus ventas a consumidores de otros países de la Unión Europea no pasen de 10.000 € al año en conjunto (no por país, sumando todos), <strong>sigues aplicando el IVA español y lo declaras en tu modelo 303</strong> de siempre.</p>
<p>Cuando pasas ese umbral cambia la película porque tienes que aplicar el IVA del país de cada cliente. Sería así:</p>
<ul>
<li>Te das de alta en el régimen de ventanilla única con el modelo 035 en la sede de la Agencia Tributaria.</li>
<li>Declaras todas esas ventas juntas con el modelo 369 trimestral, y la Agencia reparte a cada país lo suyo.</li>
<li>Una vez dado de alta, el 369 se presenta cada trimestre aunque no hayas vendido nada en ese periodo.</li>
<li>Hay otro régimen distinto, la ventanilla única de importación, para mercancía que viene de fuera de la Unión Europea por debajo de 150 €. No lo confundas con el anterior.</li>
<li>Si le vendes a una empresa de otro país con número de operador intracomunitario válido, la operación va sin IVA por inversión del sujeto pasivo, que es otro supuesto diferente.</li>
</ul>
<p>Montar los tipos de veintitantos países a mano en la tabla de tasas es posible pero es un suplicio de mantener, porque los tipos cambian y te enteras tarde. Para esto sí merece la pena un plugin que traiga los tipos actualizados y te controle el umbral. La parte de darte de alta y presentar los modelos no te la quita ningún plugin, eso sigue siendo cosa tuya y de tu asesoría.</p>
<h3>Vendes productos digitales</h3>
<p>Descargas, cursos, software y en general cualquier servicio prestado por vía electrónica tienen su propia regla desde 2015, y es que <strong>el IVA se calcula según dónde esté el cliente, no según dónde estés tú</strong>, sin umbral que valga para los consumidores de la Unión Europea.</p>
<p>Cómo se monta en WooCommerce:</p>
<ul>
<li>Creas una clase de impuesto adicional, por ejemplo llamada Bienes digitales.</li>
<li>Le cargas en esa clase los tipos de IVA de cada país miembro.</li>
<li>Asignas esa clase a tus productos digitales desde la ficha de cada uno, o en lote desde el listado de productos con la edición rápida.</li>
<li>Compruebas que el cálculo por dirección está en la del cliente y no en la de la tienda, porque si no, nada de esto sirve.</li>
</ul>
<p>Y hay una obligación que no es de WooCommerce pero que te afecta, y es que tienes que <strong>conservar pruebas de dónde estaba el cliente</strong>, normalmente su dirección de facturación y la dirección IP desde la que compró. Aquí también te viene bien un plugin de los que geolocalizan y guardan esa evidencia, porque hacerlo a mano no es viable.</p>
<h3>Y la factura, que es otra guerra</h3>
<p>Que los impuestos salgan bien en pantalla no significa que la factura salga bien, y esto cada día se pone más serio, más con la entrada en vigor del sistema de facturación verificable, obligatorio desde enero de 2027 para sociedades y desde julio de 2027 para autónomos.</p>
<p>No cambia nada de lo que has configurado aquí, porque afecta a cómo se genera y se conserva la factura, no a cómo se calcula el IVA. Lo tienes explicado en <a href="https://ayudawp.com/verifactu-woocommerce/" target="_blank" rel="ugc noopener">la guía de Verifactu en WooCommerce</a>.</p>
<p>Con los impuestos resueltos, <strong>lo siguiente que toca es configurar los envíos</strong>, que merecen su propia ración de rarezas y tienen guía aparte.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/configurar-impuestos-woocommerce/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SMTP en WordPress «sin plugins»</title>
		<link>https://ayudawp.com/smtp-wordpress-sin-plugins/</link>
					<comments>https://ayudawp.com/smtp-wordpress-sin-plugins/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 15 Sep 2026 06:28:05 +0000</pubDate>
				<category><![CDATA[Programación + WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Functions]]></category>
		<category><![CDATA[SMTP]]></category>
		<category><![CDATA[wp-config.php]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160109</guid>

					<description><![CDATA[¿A que lo has pensado?, reconócelo, ya tengo veinte plugins, ¿en serio necesito otro plugin solo para mandar correos desde WordPress?
La respuesta es que sí se puede…]]></description>
										<content:encoded><![CDATA[<p>¿A que lo has pensado?, reconócelo, <strong>ya tengo veinte plugins, ¿en serio necesito otro plugin solo para mandar correos desde WordPress?</strong></p>
<p>La respuesta es que <strong>sí se puede</strong>, y en realidad no es tan complicado, tiene sus cosas, pero poderse se puede, y te lo explico ya mismo, pero igual la duda esté mal planteada de origen.</p>
<h2>En realidad eso de «sin plugin» no es tan así</h2>
<p>El código que configura el SMTP tiene que <em>vivir</em> en algún sitio, y solo hay tres:</p>
<ul>
<li><strong>El <code>functions.php</code> del tema</strong>, que es la peor opción de las tres, porque el día que cambies de tema tu web deja de mandar correos y nadie va a relacionar una cosa con la otra.</li>
<li><strong>Un plugin propio</strong>, que evidentemente es un plugin.</li>
<li><strong>Un mu-plugin</strong>, en <code>wp-content/mu-plugins/</code>, que también es un plugin, solo que se activa siempre y no aparece con un botón de desactivar en el escritorio.</li>
</ul>
<p>Así que <strong>lo que en realidad estás pensando es si puedes montar el SMTP sin instalar un plugin del directorio</strong>, y eso sí, con un archivo tuyo de veinte líneas.</p>
<p>Que sea un <code>mu-plugin</code> no es un tecnicismo tonto, es precisamente la ventaja, porque no se desactiva por error ni se pierde al tocar el tema.</p>
<h2>Pues no, resulta que no existe eso de configurar SMTP desde wp-config.php</h2>
<p>Meter las credenciales en <code>wp-config.php</code> está muy bien y es lo que vas a ver en el código de un poco más abajo de este artículo, pero por sí solas esas constantes no hacen absolutamente nada, porque <strong>WordPress no las lee, nunca ha tenido ajustes SMTP nativos</strong>.</p>
<p>La propuesta de añadirlos existe, es el <a href="https://core.trac.wordpress.org/ticket/29069" target="_blank" rel="nofollow noopener">ticket 29069 de Trac</a>, abierto en 2014 y cerrado como <code>wontfix</code> en 2019, con dos argumentos:</p>
<ol>
<li>WordPress va de decisiones y no de opciones, y esto es territorio de plugins.</li>
<li>Como <code>wp_mail()</code> es una función reemplazable, si un plugin la sustituye esas constantes dejarían de hacer efecto sin que nadie se enterase, lo que sería un infierno de depurar.</li>
</ol>
<p>Lo que hay que hacer, entonces, es engancharse donde el núcleo de WordPress sí lo permite.</p>
<h2>Esto sí está en WordPress: PHPMailer</h2>
<p>WordPress trae <code>PHPMailer</code> incluido, y esa librería sirve SMTP de serie. Lo único que falta es decirle cómo, y para eso hay cuatro puntos de enganche:</p>
<ul>
<li><code>phpmailer_init</code>: se dispara justo después de crear el objeto PHPMailer y te lo pasa por referencia, así que puedes configurarlo a tu gusto. Existe desde WordPress 2.2.</li>
<li><code>pre_wp_mail</code>: cortocircuita <code>wp_mail()</code> entero, de modo que puedes mandar el correo como te dé la gana y devolver si salió bien. Está desde WordPress 5.7.</li>
<li><code>wp_mail_succeeded</code>: salta cuando el envío se ha procesado sin errores y te entrega destinatario, asunto, mensaje, cabeceras y adjuntos. Desde WordPress 5.9.</li>
<li><code>wp_mail_failed</code>: te entrega el objeto de error cuando el envío falla, que es la única forma de enterarte de lo que pasó.</li>
</ul>
<p><strong>Con el primero montas el envío,  con los dos últimos te haces tu propio registro de correos</strong>, que es lo que la mayoría de plugins te cobra.</p>
<h2>SMTP en WordPress «sin plugins» en 2 pasos</h2>
<p>Empezamos con las credenciales, en <code>wp-config.php</code>, por encima de la línea que dice que dejes de añadir cosas. Ponlas ahí y no en el mu-plugin, que luego los archivos de código acaban en un repositorio o en un correo de soporte y las contraseñas viajan con ellos.</p>
<pre>define( 'AYUDAWP_SMTP_HOST', 'smtp.TUPROVEEDOR.com' );
define( 'AYUDAWP_SMTP_PORT', 587 );
define( 'AYUDAWP_SMTP_SECURE', 'tls' );
define( 'AYUDAWP_SMTP_USER', 'NOMBRE@TUDOMINIO' );
define( 'AYUDAWP_SMTP_PASS', 'PON_AQUI_TU_CLAVE' );
define( 'AYUDAWP_SMTP_FROM', 'NOMBRE@TUDOMINIO.com' );
define( 'AYUDAWP_SMTP_FROM_NAME', 'Nombre del remitente o de tu web' );</pre>
<p><strong>De dónde sale cada uno de esos valores</strong></p>
<p>Lo de <code>clave_ SMTP_</code> significa una cosa distinta según dónde tengas el correo:</p>
<ul>
<li><strong>Correo del dominio en tu propio hosting</strong>: El servidor te lo da el panel de tu alojamiento web, normalmente algo del estilo <code>mail.tudominio.com</code>, el usuario es la dirección completa del buzón y la contraseña es esa misma que pusiste al crear la cuenta de correo.</li>
<li><strong>Gmail o Google Workspace:</strong> El servidor suele ser <code>smtp.gmail.com</code>, el usuario es tu dirección completa y la contraseña es una contraseña de aplicación de Google, normalmente de dieciséis caracteres, que se generan en la sección de seguridad de tu cuenta y que necesitan la verificación en dos pasos activada. La contraseña normal de Google no vale desde hace años.</li>
<li><strong>Un servicio transaccional</strong>: del tipo Brevo, Mailgun o SMTP2GO. Cada uno tiene su pantalla de credenciales SMTP donde te genera un usuario y una clave específicos para esto, que no son los que usas para entrar en el servicio. Ahí también te dan el servidor y el puerto a utilizar.</li>
<li><strong>Microsoft 365 u Outlook</strong>: Aquí no te doy valores porque no te lo recomiendo, que la identificación básica cada vez funciona menos, y en las cuentas personales ya ni está. Esto lo explico en otro momento.</li>
</ul>
<p>Por cierto, importante, <strong>las contraseñas de aplicación de WordPress no sirven para esto</strong>, esas se utilizan para que una aplicación externa se identifique en la REST API o XML-RPC de tu web.</p>
<p>Son cosa de entrada, no de salida, y si las pegas en la constante de la contraseña el servidor de correo te va a rechazar sin contemplaciones. Si te interesa el tema lo explico en <a href="https://ayudawp.com/application-passwords/" target="_blank" rel="ugc noopener">este artículo sobre las contraseñas de aplicación de WordPress</a>.</p>
<p>Por ir terminando con los detalles, el hecho de que Google llame igual a las suyas es una coincidencia desafortunada que confunde a medio mundo, pero son dos cosas que no tienen nada que ver.</p>
<p>No me enrollo más y dicho esto <strong>ya tocaría ponernos con el mu-plugin</strong>. Creas la carpeta <code>wp-content/mu-plugins/</code> si no la tienes, y dentro un archivo llamado, por ejemplo, <code>ayudawp-smtp.php</code>:</p>
<pre>&lt;?php
/**
 * Plugin Name: SMTP para WordPress
 * Plugin URI: https://plugins.ayudawp.com
 * Description: Envía los correos de WordPress usando un servidor SMTP con identificación.
 * Version: 1.0.0
 * Author: Fernando Tellado
 * Author URI: https://tellado.es 
 * License: GPL-2.0-or-later
 */

defined( 'ABSPATH' ) || exit;

/**
 * Configure PHPMailer para usar SMTP.
 * Las credenciales van como constantes en wp-config.php, no las metas aquí.
 */
function ayudawp_smtp_config( $phpmailer ) {

	// Salida silenciosa si el sitio aún no se ha configurado
	if ( ! defined( 'AYUDAWP_SMTP_HOST' ) || ! defined( 'AYUDAWP_SMTP_PASS' ) ) {
		return;
	}

	$phpmailer-&gt;isSMTP();
	$phpmailer-&gt;Host       = AYUDAWP_SMTP_HOST;
	$phpmailer-&gt;Port       = AYUDAWP_SMTP_PORT;
	$phpmailer-&gt;SMTPAuth   = true;
	$phpmailer-&gt;SMTPSecure = AYUDAWP_SMTP_SECURE;
	$phpmailer-&gt;Username   = AYUDAWP_SMTP_USER;
	$phpmailer-&gt;Password   = AYUDAWP_SMTP_PASS;

	// 30 segundos es más que suficiente. Con el valor por defecto la solicitud se quedaría bloqueada durante varios minutos
	$phpmailer-&gt;Timeout = 30;
}
add_action( 'phpmailer_init', 'ayudawp_smtp_config' );

/**
 * La dirección del remitente debe pertenecer al dominio autorizado (coincidencia SPF/DKIM)
 */
function ayudawp_smtp_from( $from ) {
	return defined( 'AYUDAWP_SMTP_FROM' ) ? AYUDAWP_SMTP_FROM : $from;
}
add_filter( 'wp_mail_from', 'ayudawp_smtp_from' );

function ayudawp_smtp_from_name( $name ) {
	return defined( 'AYUDAWP_SMTP_FROM_NAME' ) ? AYUDAWP_SMTP_FROM_NAME : $name;
}
add_filter( 'wp_mail_from_name', 'ayudawp_smtp_from_name' );</pre>
<p>Ya está, eso es todo. En cuanto subes el archivo está activo, los mu-plugins no hace falta activarlos, y si tienes ya añadidos tus datos al <code>wp-config.php</code> como en el primer paso ya lo tienes.</p>
<h3>Valores que podrían darte algo de guerra</h3>
<p>El puerto y el cifrado se confunden constantemente porque van emparejados:</p>
<ul>
<li>El 587 va con <code>tls</code>, que arranca en claro y sube a cifrado con STARTTLS, y es el que deberías usar.</li>
<li>El 465 va con <code>ssl</code>, cifrado desde el primer byte, y sigue funcionando en todas partes.</li>
<li>El 25 no lo uses para esto, está pensado para el tráfico entre servidores y lo tiene bloqueado medio internet.</li>
</ul>
<p>Con el remitente mejor los dos filtros del ejemplo que tocar <code>$phpmailer-&gt;From</code> a pelo, porque así lo respeta cualquier otro plugin que mande correos.</p>
<p>Y si alguna vez tienes que llamar a <code>setFrom()</code>, pásale <code>false</code> como tercer parámetro para que PHPMailer no te pise la cabecera <code>Sender</code>, que hay servidores que rechazan el mensaje por eso.</p>
<h2>Todo en un archivo, si no quieres tocar wp-config.php</h2>
<p>Hay quien no quiere andar tocando <code>wp-config.php</code>, y lo entiendo, que es el archivo donde un despiste te deja la web en blanco. Así que aquí tienes la misma cosa en un solo archivo, con las credenciales dentro y un bloque de ajustes arriba que es lo único que hay que editar.</p>
<p>Eso sí, sustituye a los dos anteriores, no los mezcles, o usas los 2 pasos de antes o este archivo completo.</p>
<pre>&lt;?php
/**
 * Plugin Name: SMTP para WordPress
 * Plugin URI: https://plugins.ayudawp.com
 * Description: Envía los correos de WordPress usando un servidor SMTP con identificación.
 * Version: 1.0.0
 * Author: Fernando Tellado
 * Author URI: https://tellado.es
 * License: GPL-2.0-or-later
 */

defined( 'ABSPATH' ) || exit;

/**
 * Ajustes SMTP. Este es el único bloque que tienes que modificar
 *
 * host      Servidor de correo saliente, te lo da tu proveedor de mail
 * port      587 con 'tls', o 465 con 'ssl'
 * secure    Debe coincidir con el puerto de arriba
 * user      Normalmente la dirección de email
 * pass      La contraseña SMTP de la dirección de email
 * from      Dirección de email del remitente. Debe pertenecer al dominio autorizado
 * from_name Nombre del remitente mostrado en los correos enviados
 */
function ayudawp_smtp_settings() {

	return array(
		'host'      =&gt; 'smtp.TUPROVEEDOR.com',
		'port'      =&gt; 587,
		'secure'    =&gt; 'tls',
		'user'      =&gt; 'NOMBRE@TUDOMINIO.com',
		'pass'      =&gt; 'PON_AQUI_TU_CLAVE',
		'from'      =&gt; 'NOMBRE@TUDOMINIO.com',
		'from_name' =&gt; 'Nombre del remitente o de tu web',
	);
}

/**
 * Configura PHPMailer para que use SMTP
 */
function ayudawp_smtp_config( $phpmailer ) {

	$config = ayudawp_smtp_settings();

	// No hace nada hasta que los ajustes de arriba se hayan completado
	if ( empty( $config['host'] ) || 'PON_AQUI_TU_CLAVE' === $config['pass'] ) {
		return;
	}

	$phpmailer-&gt;isSMTP();
	$phpmailer-&gt;Host       = $config['host'];
	$phpmailer-&gt;Port       = (int) $config['port'];
	$phpmailer-&gt;SMTPAuth   = true;
	$phpmailer-&gt;SMTPSecure = $config['secure'];
	$phpmailer-&gt;Username   = $config['user'];
	$phpmailer-&gt;Password   = $config['pass'];

	// 30 segundos es más que suficiente. Con el valor por defecto la solicitud se quedaría bloqueada durante varios minutos.
	$phpmailer-&gt;Timeout = 30;
}
add_action( 'phpmailer_init', 'ayudawp_smtp_config' );

/**
 * La dirección del remitente debe pertenecer al dominio autorizado (coincidencia SPF/DKIM)
 */
function ayudawp_smtp_from( $from ) {

	$config = ayudawp_smtp_settings();

	return ! empty( $config['from'] ) ? $config['from'] : $from;
}
add_filter( 'wp_mail_from', 'ayudawp_smtp_from' );

function ayudawp_smtp_from_name( $name ) {

	$config = ayudawp_smtp_settings();

	return ! empty( $config['from_name'] ) ? $config['from_name'] : $name;
}
add_filter( 'wp_mail_from_name', 'ayudawp_smtp_from_name' );</pre>
<p>Fíjate en el condicional del principio, que no está de adorno. <strong>Mientras la clave siga siendo el texto de ejemplo, el mu-plugin no hace nada y WordPress manda como siempre</strong>, así que si subes el archivo y se te olvida rellenarlo no rompes el envío, simplemente sigue como estaba.</p>
<p>Y ahora un aviso, o recordatorio, como prefieras, y es que meter la clave aquí es más cómodo pero también menos seguro, por un motivo muy concreto.</p>
<p>Los archivos dentro de <code>mu-plugins</code> están dentro de <code>wp-content</code>, que es una carpeta pública, y <strong>el día que el servidor deje de procesar PHP por lo que sea, este archivo se sirve como texto plano con tu contraseña dentro</strong>.</p>
<p>Con <code>wp-config.php</code> puede pasar lo mismo, pero con la diferencia de que casi todos los hosting traen una regla en el servidor que bloquea ese archivo por su nombre, o incluso la puedes añadir tú usando <a href="https://ayudawp.com/tag/vigilante/" target="_blank" rel="noopener">Vigilante</a>, y para tu mu-plugin no la trae nadie.</p>
<p>Si te vas por este camino dedícale un minuto a poner esa regla tú, si no la añade tu hosting o no usas Vigilante (a quién se le ocurre). Creas un archivo llamado <code>.htaccess</code> dentro de <code>wp-content/mu-plugins/</code> con estas tres líneas:</p>
<pre>&lt;FilesMatch "\.php$"&gt;
Require all denied
&lt;/FilesMatch&gt;</pre>
<p>Con Nginx eso no vale y hay que pedírselo a tu proveedor, o mirar si su panel te deja bloquear el acceso directo a esa carpeta. Y en cualquiera de los dos casos, acuérdate de que la clave viaja en las copias de seguridad, así que si le pasas un respaldo a alguien le estás pasando también la contraseña del correo.</p>
<h2>Tu propio registro de correos, sin base de datos ni plugins de pago</h2>
<p>Esta es la parte que hace que merezca (más) la pena todo lo anterior, porque <strong>el registro de envíos es justo lo que casi todos los plugins de SMTP guardan para la versión de pago, y montarlo son unas pocas líneas más</strong>.</p>
<p>La idea es simple, enganchas <code>wp_mail_succeeded</code> y <code>wp_mail_failed</code>, y escribes una línea por envío en un archivo de texto. Nada de tablas, nada de tipos de contenido personalizados, nada que engorde la base de datos.</p>
<p>Eso sí, lo que te propongo lleva un par de decisiones de diseño que no son caprichos. Por un lado verás que <strong>el archivo empieza por una instrucción de salida de PHP para que nadie pueda leerlo desde el navegador</strong> aunque adivine la ruta, y <strong>no guardo el cuerpo de los mensajes</strong>, solo destinatario, asunto y resultado.</p>
<p>Esto lo he definido así porque un registro de correos completo es un almacén de datos personales con todo lo que eso implica en cuanto al RGPD.</p>
<pre>/**
 * Registro minimalista de registro de correos. Sin base de datos ni pantalla de ajustes
 * Escribe una línea por mensaje a un archivo protegido dentro de wp-content
 */
function ayudawp_mail_log_file() {
	return WP_CONTENT_DIR . '/ayudawp-mail-log.php';
}

/**
 * Añade una entrada al registro, rotando el archivo cuando crezca demasiado
 * Nunca se almacenan los contenidos del mensaje, solo los metadatos
 */
function ayudawp_mail_log_write( $status, $to, $subject, $detail = '' ) {

	$file = ayudawp_mail_log_file();
	// El carácter de salida impide que el archivo se pueda leer a través de HTTP
	$header = "&lt;?php exit; ?&gt;\n";

	if ( ! file_exists( $file ) ) {
		file_put_contents( $file, $header );
	}

	clearstatcache( true, $file );

	// Rota cuando llegue a los 2 MB, manteniendo solo un archivo previo
	if ( filesize( $file ) &gt; 2 * MB_IN_BYTES ) {
		rename( $file, $file . '.old' );
		file_put_contents( $file, $header );
	}

	$line = sprintf(
		"[%s] %s | para: %s | asunto: %s%s\n",
		current_time( 'mysql' ),
		$status,
		is_array( $to ) ? implode( ', ', $to ) : $to,
		$subject,
		'' !== $detail ? ' | ' . $detail : ''
	);

	file_put_contents( $file, $line, FILE_APPEND | LOCK_EX );
}

/**
 * Registra mensajes que PHPMailer procesó sin errores
 */
function ayudawp_mail_log_success( $mail_data ) {
	ayudawp_mail_log_write( 'OK  ', $mail_data['to'], $mail_data['subject'] );
}
add_action( 'wp_mail_succeeded', 'ayudawp_mail_log_success' );

/**
 * Registra juntos los fallos con el motivo que los provocó
 */
function ayudawp_mail_log_failure( $error ) {

	$data = $error-&gt;get_error_data();

	ayudawp_mail_log_write(
		'KO',
		isset( $data['to'] ) ? $data['to'] : 'desconocido',
		isset( $data['subject'] ) ? $data['subject'] : 'desconocido',
		$error-&gt;get_error_message()
	);
}
add_action( 'wp_mail_failed', 'ayudawp_mail_log_failure' );</pre>
<p>El resultado es un archivo que puedes abrir con el gestor de archivos del hosting o un cliente FTP, y que se lee de un vistazo:</p>
<pre>[2026-08-11 09:14:22] OK   | para: cliente@example.com | asunto: Tu pedido #1482
[2026-08-11 09:31:07] KO | para: otro@example.com | asunto: Restablecer contraseña | SMTP connect() failed.</pre>
<p>Un par de avisos sobre este código.</p>
<ul>
<li>El gancho de éxito significa que el mensaje salió sin errores, <strong>no significa que haya llegado a la bandeja de nadie</strong>, eso lo avisa el propio núcleo en su documentación.</li>
<li>Si algún día conviertes esto en un plugin para el directorio oficial, la escritura de archivos hay que hacerla con la API de sistema de archivos de WordPress, que aquí he ido directo para no triplicar el código de un ejemplo.</li>
</ul>
<h2>Cuando el puerto está cerrado el camino es HTTPS</h2>
<p>Bastantes hosting bloquean las conexiones salientes por los puertos de correo, y lo hacen por un buen motivo, para que una web comprometida no acabe convertida en una máquina de spam.</p>
<p>Si te toca uno de esos alojamientos entonces SMTP no es una opción y no lo va a ser por mucho que insistas.</p>
<p>La salida es mandar por la API del proveedor, que viaja por HTTPS y no la bloquea nadie. Y aquí es donde entra <code>pre_wp_mail</code>, que cortocircuita el envío entero:</p>
<pre>/**
 * Envía los correos de WordPress usando un proveedor con API HTTP en vez de SMTP
 * Devolver un valor no nulo frena wp_mail()
 */
function ayudawp_mail_via_api( $short_circuit, $atts ) {

	if ( ! defined( 'AYUDAWP_MAIL_API_KEY' ) ) {
		return $short_circuit; // Deja que WordPress lo gestione como siempre
	}

	$to = is_array( $atts['to'] ) ? $atts['to'] : array( $atts['to'] );

	$response = wp_remote_post(
		'https://api.TUPROVEEDOR.com/v1/send',
		array(
			'timeout' =&gt; 15,
			'headers' =&gt; array(
				'Authorization' =&gt; 'Bearer ' . AYUDAWP_MAIL_API_KEY,
				'Content-Type'  =&gt; 'application/json',
			),
			'body'    =&gt; wp_json_encode(
				array(
					'from'    =&gt; AYUDAWP_SMTP_FROM,
					'to'      =&gt; $to,
					'subject' =&gt; $atts['subject'],
					'html'    =&gt; $atts['message'],
				)
			),
		)
	);

	if ( is_wp_error( $response ) ) {
		ayudawp_mail_log_write( 'KO', $to, $atts['subject'], $response-&gt;get_error_message() );
		return false;
	}

	$sent = ( 200 === wp_remote_retrieve_response_code( $response ) );
	ayudawp_mail_log_write( $sent ? 'OK  ' : 'FALLO', $to, $atts['subject'] );

	return $sent;
}
add_filter( 'pre_wp_mail', 'ayudawp_mail_via_api', 10, 2 );</pre>
<p>Ese código es una base de partida, pues cada proveedor tiene su formato, así que la estructura del cuerpo la sacas de su documentación.</p>
<p>Fíjate en que aquí llamo al registro a mano, porque al cortocircuitar <code>wp_mail()</code> los ganchos de éxito y de fallo del núcleo ya no se disparan.</p>
<p>Y ojo con lo demás, <strong>si cortocircuitas <code>wp_mail()</code> te quedas tú al mando de todo</strong>, incluidos los adjuntos, las cabeceras personalizadas y el juego de caracteres, que en el ejemplo no están contemplados.</p>
<p>Para una web que solo manda avisos de texto va sobrado, para una tienda con facturas adjuntas necesitas bastante más código.</p>
<h2>¿Funciona?</h2>
<p>No te fíes de que no salte ningún error, eso no significa nada. Pide un restablecimiento de contraseña desde la pantalla de acceso con un usuario cuyo correo esté en otro proveedor, y mira la bandeja y el spam.</p>
<p>Si no llega, abre el archivo de registro, que ahí tienes el motivo. Y si quieres además el detalle en el log de PHP, activa la depuración en <code>wp-config.php</code>:</p>
<pre>define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );</pre>
<p>Los mensajes suelen ser explícitos. Si dice que la autorización ha fallado revisa usuario y contraseña. Si dice que no puede conectar o que la conexión se ha rechazado el problema es el puerto, y ahí no hay código que valga.</p>
<h2>Lo que sigues sin tener</h2>
<p>Con lo de arriba tienes envío verificado y registro de correos, que es el 80% de lo que dan los plugins, pero te falta lo siguiente:</p>
<ul>
<li><strong>El botón de prueba</strong>: que parece una tontería hasta que estás cambiando de proveedor un viernes por la tarde.</li>
<li><strong>La conexión de reserva</strong>: para que si el proveedor principal se cae entre el segundo sin que se pierda nada.</li>
<li><strong>Los reintentos y la cola</strong>: que evitan que un pico de envíos te ralentice la web.</li>
<li><strong>La pantalla de consulta</strong>: porque leer un archivo de texto por FTP no es lo mismo que filtrar en una tabla del escritorio.</li>
</ul>
<p>Y hay un caso donde directamente no compensa y es <strong>si tu correo está en Gmail o en Microsoft y quieres usar OAuth, olvídate de hacerlo a mano</strong>, porque necesitas una librería externa, gestionar tokens y renovarlos. Ahí un plugin te lo resuelve con dos clics y tú tardarías muchas horas en tener algo peor.</p>
<h2>Entonces, ¿código o plugin?</h2>
<p>Mi criterio después de bastantes webs de cliente es que si la web la mantienes tú, va por control de versiones y el correo es de dominio propio contra un servidor que controlas, el mu-plugin es perfecto y además no te añade tablas ni panel de ajustes.</p>
<p>Si la web la va a tocar otra persona, si el correo va por Gmail o Microsoft, o si es una tienda donde perder un aviso de pedido cuesta dinero, instala un plugin con registro incluido en la versión gratuita. Los tienes comparados en <a href="https://ayudawp.com/wordpress-no-manda-emails/" target="_blank" rel="ugc noopener">WordPress no manda emails, y casi nunca es culpa de WordPress</a>, que además cubre la parte de SPF, DKIM y DMARC, sin la cual todo esto sirve de poco.</p>
<p>Si le das una vuelta al código y lo mejoras, cuéntamelo en los comentarios, que estas cosas se afinan entre todos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/smtp-wordpress-sin-plugins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Passkeys en WordPress</title>
		<link>https://ayudawp.com/passkeys/</link>
					<comments>https://ayudawp.com/passkeys/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 14 Sep 2026 06:28:16 +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[passkey]]></category>
		<category><![CDATA[Vigilante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160117</guid>

					<description><![CDATA[Vaya, por fin un artículo que te cuenta todo sobre las passkeys, y además explicado en detalle y con una guía sencilla para usuarios de WordPress.]]></description>
										<content:encoded><![CDATA[<p>Cuando entras en una web con una <code>passkey</code>, tu navegador mete el dominio dentro de lo que firma. Eso significa que <strong>una web falsa montada en otro dominio no puede reproducir esa firma</strong> ni poniéndose en medio de la conversación, y <strong>ahí se acaba el <em>phishing</em></strong>, que llevamos veinte años intentando parchear con avisos, con formación a los usuarios y con esconder la pantalla de acceso.</p>
<p>¿Suena bien, a que sí?, porque es lo único que importa de verdad de este asunto, y porque casi todo lo demás sobre passkeys se queda en lo bonito de entrar con la huella, y <strong>lo de la huella es la parte cómoda, no la parte importante.</strong></p>
<p>Pero hay una segunda mitad de la historia que es la de verdad importante, que es la que <strong>te puede dejar fuera de tu propia web o darte una falsa sensación de seguridad</strong>. ¿Te animas?, es una historia apasionante, y de rabiosa actualidad.</p>
<h2>Qué es una passkey, y sobre todo qué no es</h2>
<p>Una passkey es <strong>un par de claves criptográficas</strong>. La privada se queda en tu dispositivo o en tu gestor de contraseñas y no sale de ahí nunca, y la pública se guarda en la web donde te identificas.</p>
<p>Cuando entras, la web te manda un desafío, tu dispositivo lo firma con la clave privada después de comprobar que eres tú (huella, cara o PIN), y la web verifica la firma con la clave pública que ya tenía.</p>
<p><strong>Lo que se guarda en tu servidor son claves públicas, o sea, información que no sirve para entrar en ningún sitio.</strong></p>
<p>Si mañana te roban la base de datos entera el atacante se lleva un puñado de claves públicas y un rato de trabajo perdido. Compara eso con lo que pasa cuando se filtra una tabla de contraseñas.</p>
<p>Y aquí viene la parte más confusa, donde a veces nos liamos, porque «<strong>acceso sin contraseña</strong>» se ha convertido en un cajón donde cabe cualquier cosa.</p>
<p>Estos son los 4 métodos de acceso sin contraseña que solemos confundir, para tenerlo claro antes de empezar:</p>
<table>
<tbody>
<tr>
<th style="text-align: left;">Método</th>
<th style="text-align: left;">Qué puede robarse</th>
<th style="text-align: left;">Si te clonan el dominio</th>
<th style="text-align: left;">De qué depende</th>
</tr>
<tr>
<td>Contraseña</td>
<td>La contraseña entera, y sirve en cualquier sitio donde la repitas</td>
<td>Caes</td>
<td>De tu memoria y de tu gestor</td>
</tr>
<tr>
<td>Enlace o código por email</td>
<td>El enlace o el código, mientras no caduque</td>
<td>Caes</td>
<td>De tu correo, entero</td>
</tr>
<tr>
<td>Código con aplicación (TOTP)</td>
<td>El código del momento, y también el secreto inicial</td>
<td>Caes, si te lo piden en la web falsa</td>
<td>De tu móvil y de tus códigos de respaldo</td>
</tr>
<tr>
<td>Passkey</td>
<td>Nada utilizable</td>
<td>No caes</td>
<td>De tu dispositivo o de tu cuenta de sincronización</td>
</tr>
</tbody>
</table>
<p>Fíjate en <strong>la columna del dominio clonado</strong>, porque es la única en la que la <code>passkey</code> juega en otra liga.</p>
<p>El código de seis dígitos de tu aplicación de autorización es un secreto compartido que tú tecleas, así que si te lo tecleas en la web del malo, se lo has dado.</p>
<p><strong>La passkey no la tecleas, la firma tu dispositivo, y tu dispositivo comprueba el dominio antes de firmar</strong>.</p>
<p>Si quieres repasar los otros dos métodos con calma, tengo escrito sobre <a href="https://ayudawp.com/2fa-wordpress/" target="_blank" rel="ugc noopener">la identificación de dos factores en WordPress</a> y sobre <a href="https://ayudawp.com/acceder-wordpress-sin-contrasena/" target="_blank" rel="ugc noopener">el acceso mediante enlace mágico</a>, que sigue teniendo sentido para lo que tiene es, para la comodidad.</p>
<h2>El phishing se acabó</h2>
<p>Ya te he dicho lo bueno, así que toca la letra pequeña, porque <strong>la passkey blinda la puerta, no toda la casa.</strong> Estas cosas te siguen pudiendo pasar exactamente igual:</p>
<ul>
<li>Que te roben la cookie de sesión una vez has entrado, con malware o con un <code>cross-site scripting</code>: La passkey se usa en el momento de identificarte, y a partir de ahí eres una sesión abierta como cualquier otra. Si sospechas que ha pasado, lo que echa a todo el mundo fuera de golpe es renovar las claves de seguridad del <code>wp-config.php</code>, tal como cuento en la guía para <a href="https://ayudawp.com/limpiar-wordpress-hackeado-infectado/" target="_blank" rel="ugc noopener">limpiar y recuperar un WordPress hackeado</a>.</li>
<li>Que tengas el equipo comprometido: Si el malo está dentro de tu ordenador, ya has perdido y da igual cómo entres.</li>
<li>Que te ataquen por el método de respaldo: Si dejas la contraseña activa, y vas a dejarla, el phishing simplemente irá a por la contraseña, que es lo que hacen los atacantes desde siempre, ir por donde menos cuesta.</li>
<li>Que te secuestren el correo y usen el «¿Has olvidado tu contraseña?», que sigue ahí, funcionando como el primer día.</li>
</ul>
<p>Nada de esto es un argumento contra las passkeys, ojo, es un argumento contra venderlas como si fueran un campo de fuerza. Sirven para lo que sirven, y lo que hacen lo hacen mejor que ninguna otra cosa que tengamos.</p>
<h2>Quién las usa ya, y quién ha ido más lejos</h2>
<p>Google, Apple y Microsoft las ofrecen por defecto en sus cuentas personales, y ahí es donde la mayoría de la gente tiene ya una passkey sin haberse dado cuenta.</p>
<p>La FIDO Alliance, que es quien está detrás del estándar, publicó en mayo su informe anual y calcula unos <strong>5.000 millones de passkeys en uso en el mundo, con un 75 % de personas que tienen al menos una activada y un 49 % que las usa habitualmente</strong> cuando la web se lo permite.</p>
<p>Un aviso de rigor sobre esas cifras es que la muestra es de diez países, y España no está entre ellos, así que sirven para ver la tendencia, no para calcular cuántos de tus clientes van a saber qué hacer cuando les salga el aviso.</p>
<p>El caso que mejor muestra hasta dónde llega esto es el de OpenAI, que ha sacado un modo de seguridad reforzada para las cuentas de ChatGPT en el que la contraseña se desactiva, hay que registrar dos credenciales entre passkeys y llaves físicas, y se elimina la recuperación por correo y por SMS.</p>
<p>La frase que hay que subrayar de su documentación es que <strong>una vez lo activas, ni siquiera su soporte puede devolverte la cuenta</strong>. No todo iba a ser bonito, las IAs, ya sabes.</p>
<p>Ahí tienes la ventaja y el peligro en la misma frase, y por eso este artículo dedica más espacio a la recuperación que al registro.</p>
<p>Y por si te queda lejos, dos ejemplos que te tocan de cerca. Tu cuenta de WordPress.org admite llaves de seguridad desde la pestaña de cuenta y seguridad de tu perfil, y WordPress.com también las admite como verificación de acceso.</p>
<p>O sea que el proyecto usa passkeys para proteger a la gente que hace WordPress, mientras que <strong>el núcleo de WordPress sigue sin traer nada de esto para tu web</strong>. Ni en la versión actual ni en las siguientes, que no mencionan <code>WebAuthn</code> por ningún lado.</p>
<h2>Los dos modelos de Passkey ¿cuál es el que nos interesa?</h2>
<p>Esto es quizás lo que más te va a seguir de todo lo que llevo escrito, así que céntrate un poquito, que te toca decidir.</p>
<h3>Passkey como sistema de acceso en dos pasos</h3>
<p>Metes usuario y contraseña como siempre, y en la pantalla siguiente, en vez del código de seis dígitos, firmas con la huella o con la llave. La contraseña sigue funcionando como red de seguridad.</p>
<p>Es el modo conservador, es el que menos soporte genera y es donde vas a acabar tú, casi seguro. Ganas el fin del phishing y te quitas de encima el baile del código de seis dígitos, que es lo que odia todo el mundo de la verificación en dos pasos.</p>
<h3>Passkey como acceso completo</h3>
<p>No hay contraseña. Pones el nombre de usuario, o ni eso, firmas y estás dentro. Es el modo que cambia de verdad el modelo de amenaza, y también el que te obliga a tener un plan de recuperación de adulto.</p>
<h3>La mezcla perfecta</h3>
<p>Y luego está esto, que es donde casi todo la mayoría nos equivocamos, incluido yo, por supuesto, cuando empecé a darle vueltas al asunto.</p>
<p>El phishing se acabó el primer día con el modo de doble verificación, pero el tener que completar credenciales no se acaba hasta que apagas la contraseña. Y esto no es porque la passkey no sea buena, sino porque mientras la contraseña siga siendo una credencial válida el atacante sigue pudiendo probar pares de usuario y contraseña contra tu web.</p>
<p>Aunque no se complete el acceso porque falta la passkey, obtiene lo que de verdad busca, que es confirmar que ese par funciona para ir luego a probarlo al correo de esa persona, o a su banco, o a los otros quince sitios donde repite contraseña.</p>
<p>Esto significa que <strong>en el modo de doble verificación en dos pasos tu web deja de ser la puerta por la que entran, pero sigue siendo quién les dice si la llave que tienen es buena o no</strong>.</p>
<p>Por eso la secuencia sensata es esta, y por eso el modo sin contraseña tiene que ir siempre acompañado de dos credenciales registradas y de códigos de respaldo guardados fuera del ordenador.</p>
<p>No es prudencia histérica, es que el día que quitas la contraseña te quedas sin alternativa.</p>
<h3>Un paso o dos, y por qué no hace falta pedir también el código</h3>
<p><strong>Una passkey que exige verificación</strong> de usuario (huella, cara o PIN antes de firmar) ya <strong>son dos pasos por sí sola</strong>: algo que tienes, que es el dispositivo o la credencial, y algo que eres o que sabes, que es lo que desbloquea la firma.</p>
<p><strong>Pedir además el código de seis dígitos es pedir dos veces lo mismo.</strong> Si la credencial no lleva verificación de usuario entonces sí es un solo factor y no debería contar como doble verificación.</p>
<p>Y ahora otro matiz que tiene consecuencias prácticas gordas.</p>
<h3>¿Passkey sincronizada o atada al dispositivo?</h3>
<p>Hay dos tipos de passkey:</p>
<ul>
<li><strong>Sincronizada</strong>: está en tu llavero de iCloud, en el gestor de Google o en el gestor que uses, y aparece sola en todos tus dispositivos.</li>
<li><strong>Atada al dispositivo</strong>: esta nace y muere en el dispositivo donde la creaste, y ese es el caso de una llave física tipo YubiKey o de Windows Hello.</li>
</ul>
<p>La diferencia es relevante por dos motivos. El primero es de seguridad, porque en una passkey sincronizada, el «algo que tienes» ya no es el móvil, es la cuenta que sincroniza. Quien te comprometa esa cuenta tiene tus passkeys en todas partes.</p>
<p>Esto tiene matices, porque las passkeys de iCloud van cifradas de extremo a extremo y sacarlas de ahí exige la cuenta más el código del dispositivo, así que el listón está bastante más alto que robar una contraseña. Pero el factor de posesión se ha desplazado del cacharro a la cuenta, y eso es un cambio de verdad.</p>
<p>El segundo motivo es de recuperación, y de ese hablamos más abajo porque cambia por completo el consejo que te tengo que dar.</p>
<p>El detalle práctico es que <strong>ni el navegador ni el sistema operativo te dicen qué tipo de passkey estás creando.</strong> La propia credencial lo declara en la ceremonia mediante dos indicadores técnicos, y esa es la única forma fiable de saberlo.</p>
<p>Fíjate hasta qué punto está la cosa revuelta, que a día de hoy, Windows Hello genera credenciales atadas al dispositivo mientras que la sincronización en Windows llega por el gestor del navegador, por encima del sistema de autorización del sistema.</p>
<p>Y hasta Chrome en Windows puede guardarte la passkey en Windows Hello aunque tú creyeras estar creando una passkey sincronizada de Google.</p>
<p>O sea que el usuario ni lo elige ni lo sabe. Guarda esta idea para el final del artículo, que lo vamos a repasar.</p>
<h2>Las puertas que la passkey no cierra en WordPress</h2>
<p>WordPress no tiene una puerta de entrada, tiene varias, y la passkey protege la pantalla de acceso, nada más. Mientras la contraseña siga siendo válida, hay dos caminos que autorizan sin pasar por esa pantalla y se saltan tu passkey del todo:</p>
<ul>
<li><strong>XML-RPC:</strong> Si lo tienes activo, acepta usuario y contraseña directamente. Es la puerta que llevan años usando para los ataques de fuerza bruta masivos, precisamente porque no pasa por el formulario.</li>
<li><strong>Las contraseñas de aplicación:</strong> Son una funcionalidad del propio WordPress, muy útil, que permite autenticarse contra la API REST con una credencial que el usuario genera desde su perfil. No pasa por la pantalla de acceso, no pasa por la doble verificación y no pasa por tu passkey.</li>
</ul>
<p>Y quedan dos caminos más que no son un fallo de nadie pero que hay que tener en la cabeza, que son el restablecimiento de contraseña por correo, que sigue siendo una vía de vuelta perfectamente válida para quien controle el buzón, y los accesos del hosting, que con el gestor de archivos o con phpMyAdmin entran sin preguntarle nada a WordPress.</p>
<p>La conclusión práctica, y perdona que sea pesado, es que <strong>el modo de verificación en dos pasos solo es tan fuerte como esos dos interruptores.</strong></p>
<p>Si activas passkeys y dejas XML-RPC abierto y las contraseñas de aplicación campando a sus anchas, has puesto una puerta blindada en una casa con la ventana del patio abierta.</p>
<p>Lo bueno es que cerrarlas es fácil, porque casi todos los plugins de seguridad decentes lo traen. <a href="https://wordpress.org/plugins/wordfence/" target="_blank" rel="nofollow noopener">Wordfence</a> tiene control de XML-RPC, y en el mío, <a href="https://es.wordpress.org/plugins/vigilante/" target="_blank" rel="nofollow noopener">Vigilante</a>, tienes el bloqueo de XML-RPC y la restricción de la API REST en tres modos, además del modo bajo ataque para cuando la cosa se pone fea.</p>
<p>Si no usas ninguno de estos plugins de seguridad, al menos comprueba que el tuyo tanga ambas cosas antes de ponerte con las passkeys, porque el orden importa.</p>
<h2>Sin plugin no hay passkeys, y no es por pereza</h2>
<p>Te lo digo claro para que no pierdas la tarde buscando: no hay forma razonable de tener passkeys en WordPress sin un plugin.</p>
<p>Hace falta JavaScript en la pantalla de acceso para lanzar la ceremonia del navegador, dos rutas nuevas en el servidor para el registro y para la firma, una tabla donde guardar las claves públicas y sus indicadores, y la verificación criptográfica de cada firma. Todo eso junto es un plugin, lo llames como lo llames y lo pongas donde lo pongas.</p>
<p>Las dos alternativas que puede que encuentres por ahí o te cuente tu IA favorita no valen.</p>
<ul>
<li>Meterlo en el <code>functions.php</code> del tema es la peor idea posible, porque el día que cambies de tema te quedas fuera de tu propia web con la ceremonia a medias.</li>
<li>Delegar la identificación en un proveedor externo te ata a un servicio de pago que se queda con tus usuarios, que es justo lo contrario de lo que buscas si has llegado hasta aquí.</li>
</ul>
<p>Lo que sí puedes exigirle a un plugin es que la verificación se haga en tu servidor, sin librerías externas ni llamadas a terceros. Eso es perfectamente posible, y es lo que separa un plugin honesto de un intermediario disfrazado de plugin.</p>
<h2>Qué plugin WordPress usar según lo que necesites</h2>
<p>No pongo versiones ni fechas a propósito, porque esto se mueve rápido y un artículo con números concretos nace caducado. Comprueba siempre el estado actual en la ficha de cada uno.</p>
<h3>Wordfence</h3>
<p>Es la opción por volumen, con varios millones de instalaciones, y ha incorporado passkeys tanto en la versión gratuita como en la de pago, para cualquier perfil de usuario y con integración de WooCommerce para las pantallas de cuenta de cliente.</p>
<p>Su propia documentación avisa de que la compatibilidad para multisitio es limitado por ahora, y más abajo te explico por qué eso no es dejadez suya.</p>
<p>Si ya usas Wordfence no busques más y quédate donde ahí. Si te lo estás planteando por las passkeys, ten en cuenta que te llevas el cortafuegos y el escáner en el mismo paquete, para bien y para mal. Te reconozco que no es santo de mi devoción, y creé Vigilante precisamente por ello, pero es de justicia reconocer sus virtudes (por pocas que sean).</p>
<h3>WP 2FA, de Melapress</h3>
<p>Trae passkeys en la versión gratuita, con lo que a mí me parece su mejor baza, que son las políticas por perfil de usuario con periodo de gracia.</p>
<p>Si tienes que sacar adelante una web con quince editores y no puedes ir uno por uno pidiéndoles por favor que se configuren el acceso, esto es lo que quieres. El asistente de configuración está bien pensado para gente que no es técnica.</p>
<h3>El plugin oficial Two Factor, y su extensión</h3>
<p><a href="https://wordpress.org/plugins/two-factor/" target="_blank" rel="nofollow noopener">Two Factor</a> es el plugin de doble factor de WordPress.org, lo mantiene gente del núcleo, tiene cien mil instalaciones y es una maravilla para TOTP, correo y códigos de respaldo.</p>
<p><strong>Pero no trae passkeys</strong>, es más, la compatibilidad con las llaves de seguridad antiguas la ha quitado porque los navegadores dejaron de admitir aquel estándar, así que ahora mismo va menos servido que antes en ese apartado.</p>
<p>Para tener passkeys necesitas instalar además <a href="https://wordpress.org/plugins/two-factor-provider-webauthn/" target="_blank" rel="nofollow noopener">el complemento WebAuthn</a>, que es de un desarrollador externo, tiene mil instalaciones y exige una versión de PHP más alta que la que pide el propio WordPress. Funciona bien, que conste, y quien lo mantiene sabe lo que hace.</p>
<p>Pero que la solución oficial para passkeys en WordPress sea «instálate estos dos y cruza los dedos» dice bastante de por dónde va la prioridad del proyecto en este asunto. La propuesta de código para meter WebAuthn dentro del plugin oficial lleva años abierta.</p>
<p>Mi consejo es que si ya tienes Two Factor montado y funcionando, añadir el complemento es el camino menos lioso, pero si empiezas de cero hay opciones más completas y mejor resueltas.</p>
<h3>Secure Passkeys y WP-WebAuthn</h3>
<p>Los dos son plugins dedicados solo a esto, sin cortafuegos ni escáner ni nada más, y ahí está su gracia.</p>
<p>Secure Passkeys tiene el autorrelleno, que es el detalle que de verdad hace que la experiencia sea buena, porque la passkey te aparece sola al pinchar en el campo de usuario sin tener que darle a ningún botón.</p>
<p>WP-WebAuthn permite el acceso sin escribir siquiera el nombre de usuario, aunque su soporte para multisitio sigue estando en pruebas y necesita extensiones de PHP que no todos los alojamientos compartidos traen puestas.</p>
<p>Si tu web ya tiene una suite de seguridad, no metas un segundo plugin que toque el acceso.</p>
<h3>Vigilante (próximamente)</h3>
<p>Y ahora el mío, con el aviso por delante para que nadie se lleve un chasco, porque <strong>Vigilante (aún) no ofrece passkeys.</strong></p>
<p>Ofrece verificación en dos pasos con aplicación de autenticación y con códigos por correo, con dispositivos de confianza y con obligación por perfil de usuario, así que si lo instalas ahora mismo buscando passkeys te vas a quedar con las ganas. Están apuntadas en la lista de tareas, eso sí.</p>
<p>Te cuento lo que va a llevar, y sobre todo por qué, porque el criterio te sirve para juzgar a los otros cuatro aunque al final acabes con cualquiera de ellos:</p>
<ul>
<li><strong>En dos tiempos:</strong> Primero la passkey como segundo factor, aprovechando entero el andamiaje del doble factor que ya está montado (pantalla intermedia, gestión en el perfil, dispositivos de confianza, perfiles obligados y periodo de gracia). Después el acceso sin contraseña, que es donde está todo lo caro y lo delicado.</li>
<li><strong>Una passkey con verificación de usuario cuenta como doble factor, y no se pide el código encima:</strong> Si la credencial no lleva verificación de usuario, entonces no cuenta y sigue haciendo falta el segundo paso.</li>
<li><strong>Aviso en la propia pantalla al activar el método:</strong> Te dirá si tienes XML-RPC o las contraseñas de aplicación abiertos, que es exactamente el agujero del que hemos hablado más arriba. De poco sirve que el plugin traiga los interruptores si no te avisa de que los tienes en la posición equivocada justo cuando importa.</li>
<li><strong>Cada credencial, etiquetada como sincronizada o atada al dispositivo</strong> en la lista del perfil: Esa información viene ya en la propia ceremonia, así que enseñarla no cuesta nada y te deja decidir a ti en lugar de decidir por ti.</li>
<li><strong>La contraseña sigue activa por defecto</strong>, y el modo solo passkey es opcional: Exigiendo tener dos credenciales registradas y reutiliza los códigos de respaldo que ya conoces. El administrador único no se queda fuera, por diseño.</li>
<li><strong>Nada de servicios externos ni de cuentas de terceros:</strong> La firma se verifica en tu propio servidor, sin librerías externas ni llamadas a nadie, y lo que se guarda en tu base de datos son claves públicas.</li>
</ul>
<p>Esto último no es un adorno, y por eso lo pongo aquí y no en la ficha del plugin. Tu verás, yo solo te aviso, si un plugin de passkeys te pide crear una cuenta en algún sitio, lo que te está vendiendo no es una passkey, es un intermediario.</p>
<h2>Qué necesita tu web para poder usar passkeys</h2>
<p>Seguro que cumples, pero esta es la lista, para que no te lleves decepciones.</p>
<ul>
<li><strong>HTTPS, obligatorio:</strong> Y no es una recomendación mía, es que el navegador no ejecuta la ceremonia en una web sin certificado. La única excepción es <code>localhost</code>, para que los que desarrollamos podamos hacer pruebas.</li>
<li><strong>Un dominio estable:</strong> Las credenciales se atan al dominio, así que el día que cambies de dominio todas las passkeys registradas dejan de valer y todo el mundo tiene que registrarlas otra vez. Si tienes una migración de dominio a medio plazo, haz la migración primero y las passkeys después.</li>
<li><strong>Extensiones de PHP, según el plugin:</strong> Algunos piden extensiones concretas para la parte criptográfica, y en alojamiento compartido de gama baja no siempre están activadas. Si el plugin te da error al registrar la primera credencial, mira eso antes de volverte loco.</li>
<li><strong>Multisitio, el punto flojo:</strong> Como la credencial se ata al dominio, en una red de subdominios una passkey registrada en una web de la red no sirve en las demás. La forma de arreglarlo pasa por atar la identidad de la red al dominio padre en lugar de al de cada web, y hay plugins que ya lo hacen usando la constante <code>COOKIE_DOMAIN</code> si la tienes definida. En una red de subdirectorios el problema no existe porque el dominio es el mismo para todas. Si administras multisitio, prueba esto en un clon antes de tocar la red buena.</li>
</ul>
<p><strong>Los entornos de pruebas se comportan distinto</strong>, porque el dominio es otro. Las passkeys que registres en el clon no te valen en producción, y al revés tampoco.</p>
<h2>Cómo añadir passkeys en WordPress de manera segura y paso a paso</h2>
<p>El orden de estos pasos no es decorativo, cada uno depende del anterior:</p>
<ol>
<li>Cierra XML-RPC y revisa las contraseñas de aplicación existentes antes de tocar nada del acceso. Si no haces esto lo demás no sirve de nada.</li>
<li>Empieza por ti y por el resto de administradores, nunca por los usuarios. Y hazlo un día laborable por la mañana, no un viernes a las ocho de la tarde.</li>
<li>Registra dos credenciales por persona desde el primer momento, no una. La segunda es la que te salva.</li>
<li>Genera los códigos de respaldo y guárdalos fuera del ordenador, en el gestor de contraseñas o en papel dentro de un cajón, que sigue siendo un sitio estupendo.</li>
<li>Prueba la recuperación de verdad, con una cuenta de prueba a la que le quites el acceso a propósito. Un plan de recuperación sin probar no es un plan, es una intención.</li>
<li>Solo entonces amplía al resto del equipo, con periodo de gracia si tu plugin lo permite.</li>
<li>Y el modo sin contraseña, al final del todo, cuando lleves semanas con lo anterior rodado y sepas que todo el mundo tiene sus dos credenciales.</li>
</ol>
<p>Sobre las políticas más estrictas, tipo obligar a los administradores a usar solo credenciales atadas al dispositivo, mi consejo es que no lo hagas salvo que sepas muy bien lo que estás montando.</p>
<p>El coste de esa política no es igual para todos: quien administre desde Windows la cumple gratis con Windows Hello, y quien administre desde un Mac o un iPhone se ve obligado a comprar una llave física.</p>
<p><strong>Un mismo requisito que trata distinto a dos personas del mismo equipo es un generador de tickets de soporte, no una medida de seguridad.</strong> Y como decíamos antes, una política que depende de algo que la persona no elige conscientemente genera soporte, no seguridad.</p>
<p>Añade que todo esto depende del comportamiento del autenticador del sistema operativo, que puede cambiar con una actualización que ni has pedido ni controlas. Atar tu política de acceso a eso es construir sobre arena.</p>
<h2>¿Y si algo sale mal?</h2>
<p>Y aquí es donde el tipo de passkey que tenga cada uno lo cambia todo. Hay dos planes de recuperación distintos, no uno.</p>
<ul>
<li><strong>Si la passkey es sincronizada</strong>, la pérdida del móvil no es una catástrofe, porque la credencial sigue en el llavero de tu cuenta y aparecerá sola en el aparato nuevo en cuanto inicies sesión. Tu riesgo real no es perder el trasto, es perder el acceso a la cuenta que sincroniza. O sea que lo que hay que proteger con uñas y dientes es esa cuenta, no el teléfono.</li>
<li><strong>Si la passkey está atada al dispositivo</strong>, y hablo de llaves físicas o de Windows Hello, el día que se rompe el portátil o se pierde la llave esa credencial ha muerto y no vuelve. Por eso lo de registrar dos, y por eso lo de que la segunda esté en otro trasto distinto y no en el mismo.</li>
</ul>
<p>Los tres escenarios que te puedes encontrar:</p>
<ul>
<li><strong>Cambio de ecosistema</strong>, del iPhone al Android o al revés: Las passkeys sincronizadas no cruzan de un llavero a otro con la alegría que a uno le gustaría, así que planifica el cambio antes de venderte el móvil viejo.</li>
<li><strong>El editor que se marcha:</strong> Sus passkeys viven en sus dispositivos, así que tú no puedes borrárselas del bolsillo. Lo que sí puedes es eliminar las credenciales registradas desde el perfil de usuario en tu web, que es lo que corta el acceso de verdad. Ponlo en tu proceso de baja de personal, junto a lo de siempre.</li>
<li><strong>El administrador único:</strong> Si eres el único administrador de tu web, no actives nunca el modo sin contraseña sin tener dos credenciales y los códigos de respaldo comprobados. Y si aun así te quedas fuera, siempre queda desactivar el plugin renombrando su carpeta desde el gestor de archivos de tu hosting, que es la salida de emergencia de toda la vida.</li>
</ul>
<h2>Preguntas rápidas</h2>
<ul>
<li><strong>¿Las passkeys sustituyen al doble factor?</strong> Si llevan verificación de usuario, sí, porque ya son dos pasos por sí solas. No hace falta pedir además el código de la aplicación.</li>
<li><strong>¿Puedo usar passkeys y seguir teniendo contraseña?</strong> Sí, y es lo normal y lo recomendable mientras te acostumbras. Ten claro que así el relleno de credenciales contra tu web sigue siendo posible.</li>
<li><strong>¿Funcionan en el móvil?</strong> Sí, y de hecho es donde mejor van, porque la huella o la cara están ahí mismo.</li>
<li><strong>¿Y si mis usuarios no tienen lector de huella?</strong> Sirve el PIN del dispositivo, y sirve una llave física por USB. Nadie se queda fuera por no tener biometría.</li>
<li><strong>¿Sirven para los clientes de mi tienda?</strong> Sí, hay plugins que las llevan a las pantallas de cuenta de WooCommerce. Piensa antes en el coste de soporte, porque tus clientes no son tu equipo y la mitad no sabe qué es un llavero de iCloud.</li>
<li><strong>¿Y si tengo la web en un alojamiento compartido normalito?</strong> Casi seguro que funciona. Comprueba que tienes HTTPS y mira los requisitos de extensiones del plugin que elijas.</li>
<li><strong>¿Puedo obligar a que todos los administradores usen passkeys?</strong> Sí, los plugins con políticas por perfil lo permiten. Da un periodo de gracia y avisa antes, que si no te llueven los correos.</li>
</ul>
<h2>Por dónde empezar desde ya</h2>
<p>Antes de tocar tu web, haz el ensayo con red entrando en tu perfil de <a href="https://make.wordpress.org/meta/handbook/tutorials-guides/configuring-two-factor-authentication/" target="_blank" rel="nofollow noopener">WordPress.org</a>, ahí ve a la pestaña de cuenta y seguridad, y registra una llave de seguridad. Se tarda medio minuto, es gratis y vas a entender en la práctica todo lo que te he contado aquí mucho mejor que leyéndolo otra vez.</p>
<p>Después, y ya en tu web, el primer paso no es instalar nada, es ir a comprobar si tienes XML-RPC abierto y qué contraseñas de aplicación hay creadas por ahí. Eso es lo que decide si tus passkeys van a servir para algo o van a ser un adorno caro.</p>
<p>Y si te has quedado con ganas de más sobre cómo se defiende el acceso a tu WordPress, tengo el <a href="https://ayudawp.com/fuerza-bruta/" target="_blank" rel="ugc noopener">plan de batalla contra los ataques de fuerza bruta</a>, que es la capa de debajo de todo esto.</p>
<p>Ahora te toca a ti decidir en qué modo te quedas, si en el cómodo o en el valiente. Y si te lanzas al segundo, cuéntamelo en los comentarios, que me interesa mucho saber cuánta gente se atreve a apagar la contraseña de verdad.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/passkeys/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vulnerabilidades que asustan, la IA comiéndose a Google y mis trucos favoritos del editor de bloques – #CrónicasWordPress #TrucosWordPress</title>
		<link>https://ayudawp.com/vulnerabilidades-que-asustan-la-ia-comiendose-a-google-y-mis-trucos-favoritos-del-editor-de-bloques-cronicaswordpress-trucoswordpress/</link>
					<comments>https://ayudawp.com/vulnerabilidades-que-asustan-la-ia-comiendose-a-google-y-mis-trucos-favoritos-del-editor-de-bloques-cronicaswordpress-trucoswordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Fri, 11 Sep 2026 21:15:55 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[#CrónicasWordPress]]></category>
		<category><![CDATA[#DoctorWordPress]]></category>
		<category><![CDATA[#TrucosWordPress]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160318</guid>

					<description><![CDATA[Ya está aquí el repaso de la semana, que entre el lunes y el miércoles ha dado para rato. El lunes toca #CrónicasWordPress, para ponernos al día de la actualidad y mojarme un poco, y el miércoles le llegó el turno al consultorio, que esta vez fue más de trucos que de dudas. Si te perdiste alguno de los dos directos, aquí te lo dejo masticado y con el enlace al vídeo entero al final de cada bloque.]]></description>
										<content:encoded><![CDATA[<p><!-- TÍTULO SUGERIDO (va en el campo Título del editor, no en el cuerpo): Vulnerabilidades que asustan, la IA comiéndose a Google y mis trucos favoritos del editor de bloques – #CrónicasWordPress #TrucosWordPress --></p>
<p>Ya está aquí el repaso de la semana, que entre el lunes y el miércoles ha dado para rato. El lunes toca <strong>#CrónicasWordPress</strong>, para ponernos al día de la actualidad y mojarme un poco, y el miércoles le llegó el turno al consultorio, que esta vez fue más de trucos que de dudas. Si te perdiste alguno de los dos directos, aquí te lo dejo masticado y con el enlace al vídeo entero al final de cada bloque.</p>
<h2>Crónicas del lunes: seguridad para echarse a temblar y la IA a lo suyo</h2>
<p>Empecé por seguridad, como casi siempre últimamente, porque la cosa no da tregua. Salieron a relucir varias vulnerabilidades en plugins muy instalados, de esos que tienes tú y tiene medio WordPress del planeta, así que ya sabes lo que toca, actualizar cuanto antes y no dejarlo para mañana.</p>
<p>Comenté el caso de un plugin de migración y copias de seguridad con un agujero de los serios, y los intentos de ataque que se están frenando estos días contra webs con Elementor. <strong>Si usas cualquiera de estos, para un momento y comprueba que estás en la última versión.</strong></p>
<p>Y hubo un tema que me tocó la moral, y es que un plugin bastante conocido se dedicaba a generar contraseñas de aplicación por su cuenta, sin pedirte permiso, para mandarlas a sus servidores. Lo acabaron retirando, pero el susto queda. <strong>Eso no es un despiste, es meterte la mano en el bolsillo mientras miras para otro lado.</strong></p>
<p>Después nos fuimos a las novedades, que también las hay. WordPress 7 sigue su camino con nuevas versiones a la vista y mejoras que van cayendo en el editor de bloques. No te suelto aquí cada número de versión porque para eso está el vídeo, pero la idea es que el proyecto se mueve y conviene tenerlo controlado.</p>
<p>Y llegamos al asunto del que no me canso de avisar, y es que la IA se está comiendo el tráfico de Google. Cada vez más búsquedas se resuelven con el resumen que sale arriba del todo y el usuario ni llega a pinchar en tu web. No es que Google se vaya a acabar mañana, seamos serios, pero <strong>si vives de las visitas de las búsquedas, esto va contigo y toca espabilar</strong>.</p>
<p>Lo comento con calma en el directo, con lo que yo estoy haciendo al respecto. También repasé alguna cosa más de la comunidad y un par de eventos que vienen, pero para no hacer esto eterno te remito al vídeo.</p>
<p>Aquí tienes la crónica completa, con todos los detalles, los enlaces y mi opinión sin filtro.</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="#CrónicasWordPress - Noticias, opinión sobre WordPress con Fernando Tellado" width="1600" height="900" src="https://www.youtube.com/embed/4hAOuJFf6Rc?feature=oembed&amp;enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p><a href="https://www.youtube.com/watch?v=4hAOuJFf6Rc" target="_blank" rel="noopener">Ver las #CrónicasWordPress del lunes en YouTube</a></p>
<h2>Doctor WordPress del miércoles: mis trucos favoritos del editor de bloques</h2>
<p>El miércoles me lié la manta a la cabeza y, en lugar del consultorio de siempre, monté una sesión con los trucos del editor de bloques que más uso yo en el día a día. Nada de teoría rara, cosas que te ahorran tiempo desde el minuto uno. Estos fueron los que enseñé:</p>
<ul>
<li><strong>El resumen del documento:</strong> el panel que te muestra el esquema con la lista de bloques, el número de palabras y el tiempo de lectura de un vistazo.</li>
<li><strong>La barra y el Markdown:</strong> escribes «/» para insertar cualquier bloque al vuelo, y trucos de Markdown como «##» para un encabezado o «&gt;» para una cita, sin soltar el teclado.</li>
<li><strong>La vista de lista:</strong> tenerla abierta para moverte entre bloques anidados y reordenarlos sin volverte loco ni romper nada.</li>
<li><strong>La visibilidad por dispositivo:</strong> mostrar u ocultar un bloque en móvil, tablet o escritorio según te interese.</li>
<li><strong>Buscar y reemplazar dentro de los bloques:</strong> para cambiar un texto en toda la entrada de una vez, sin ir bloque por bloque a mano.</li>
</ul>
<p>Y ya puestos, enseñé un par de plugins que uso para rizar el rizo, uno para controlar dónde se ve cada contenido y otro para alternar entre el editor clásico y el de bloques cuando la ocasión lo pide. Esta vez cayeron menos preguntas del público que otras semanas, así que quedó una sesión bien cargadita de práctica.</p>
<p>Tienes el directo entero, con las demostraciones paso a paso, aquí:</p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="Mis mejores trucos para el editor de bloques de WordPress #TrucosWordPress" width="1600" height="900" src="https://www.youtube.com/embed/_v236NfXUEk?feature=oembed&amp;enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p><a href="https://www.youtube.com/watch?v=_v236NfXUEk" target="_blank" rel="noopener">Ver el #DoctorWordPress del miércoles en YouTube</a></p>
<h2>Nos vemos en el próximo directo</h2>
<p>Y hasta aquí la semana. Te recuerdo que los directos son en abierto, los lunes las crónicas y los miércoles el consultorio, así que si tienes cualquier duda de WordPress, SEO, IA o casi de lo que sea, te vienes y preguntas sin cortarte. Nos leemos en los comentarios, aquí abajo, y no te pierdas ningún directo <a href="https://www.youtube.com/@AyudaWPes" target="_blank" rel="nofollow noopener">suscribiéndote al canal oficial de Ayuda WordPress en YouTube</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/vulnerabilidades-que-asustan-la-ia-comiendose-a-google-y-mis-trucos-favoritos-del-editor-de-bloques-cronicaswordpress-trucoswordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿Qué plugin de SEO es más ligero y que consume menos recursos?</title>
		<link>https://ayudawp.com/plugin-seo-ligero/</link>
					<comments>https://ayudawp.com/plugin-seo-ligero/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 10 Sep 2026 06:28:00 +0000</pubDate>
				<category><![CDATA[SEO / AEO / GEO / AIO]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[WPO - Optimizar WordPress]]></category>
		<category><![CDATA[AIOSEO]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Rank Math]]></category>
		<category><![CDATA[SEOPress]]></category>
		<category><![CDATA[Slim SEO]]></category>
		<category><![CDATA[SureRank]]></category>
		<category><![CDATA[The SEO Framework]]></category>
		<category><![CDATA[Visibility]]></category>
		<category><![CDATA[Yoast]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160055</guid>

					<description><![CDATA[He medido memoria, consultas a la base de datos, tiempo de generación y peso de archivos de los principales plugins de SEO y estos son los resultados…]]></description>
										<content:encoded><![CDATA[<p>Vengo recomendando plugins de SEO para WordPress desde hace casi 20 años, y hace poco me lancé a publicar el mío propio, <a href="https://visibility.quest/es/" target="_blank" rel="noopener">Visibility</a>. Así que cuando un lector que lo usa, y hasta dice que le gusta, me preguntó <strong>cuánto pesaba de verdad frente a los plugins de SEO más instalados</strong>, no me pareció justo responderle ahí, a lo loco, como padre enamorado de su bebé.</p>
<p>Así que me recogí la coleta, pillé ocho plugins, <strong>The SEO Framework, Visibility, SureRank, Slim SEO, SEOPress, Yoast SEO, AIOSEO y Rank Math, además de Visibility</strong>, los instalé uno por uno en la misma instalación de WordPress y <strong>medí memoria, consultas a la base de datos, tiempo de generación y peso de archivos, siempre con el mismo contenido exacto</strong>.</p>
<p>Si quieres el detalle completo de cómo lo hice, lo tienes al final del artículo, primero <strong>vamos a ver los números, tabla por tabla</strong>, luego me cuentas…</p>
<h2>Lo que le cuesta a tu web servir una sola entrada</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160136 size-full" src="https://ayudawp.com/wp-content/uploads/2026/09/laboratorio-plugins-seo.jpg" alt="" width="1200" height="805" srcset="https://ayudawp.com/wp-content/uploads/2026/09/laboratorio-plugins-seo.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/laboratorio-plugins-seo-768x515.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/laboratorio-plugins-seo-240x160.jpg 240w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Esto es <strong>lo que añade cada plugin sobre una instalación sin ningún ajuste SEO activo</strong>, que en una entrada suelta se queda en 10,83 MB de memoria, 58 consultas y 25,6 ms. Cada fila es la diferencia contra esa base.</p>
<table>
<thead>
<tr>
<th>Plugin</th>
<th>Memoria</th>
<th>Consultas</th>
<th>Tiempo</th>
<th>PHP cargado</th>
</tr>
</thead>
<tbody>
<tr>
<td>The SEO Framework</td>
<td><span style="color: #008000;">+0,13 MB</span></td>
<td><span style="color: #008000;">−8</span></td>
<td><span style="color: #008000;">+1,2 ms</span></td>
<td>590 KB / 74 archivos</td>
</tr>
<tr>
<td><strong>Visibility</strong></td>
<td>+0,29 MB</td>
<td>−6</td>
<td>+2,3 ms</td>
<td><span style="color: #008000;">245 KB / 21 archivos</span></td>
</tr>
<tr>
<td>SureRank</td>
<td>+0,31 MB</td>
<td>+15</td>
<td>+12,7 ms</td>
<td>921 KB / 114 archivos</td>
</tr>
<tr>
<td>Slim SEO</td>
<td>+0,38 MB</td>
<td>+3</td>
<td>+4,7 ms</td>
<td>257 KB / 105 archivos</td>
</tr>
<tr>
<td>SEOPress</td>
<td>+0,40 MB</td>
<td>+1</td>
<td>+5,2 ms</td>
<td>1,5 MB / 242 archivos</td>
</tr>
<tr>
<td>Yoast SEO</td>
<td>+0,85 MB</td>
<td>+16</td>
<td>+4,3 ms</td>
<td><span style="color: #ff0000;">3,0 MB / 547 archivos</span></td>
</tr>
<tr>
<td>AIOSEO</td>
<td>+2,02 MB</td>
<td><span style="color: #ff0000;">+32</span></td>
<td><span style="color: #ff0000;">+22,5 ms</span></td>
<td>2,5 MB / 296 archivos</td>
</tr>
<tr>
<td>Rank Math</td>
<td><span style="color: #ff0000;">+3,85 MB</span></td>
<td>+7</td>
<td>+15,1 ms</td>
<td>1,5 MB / 241 archivos</td>
</tr>
</tbody>
</table>
<p>Cuando ves la tabla entera pasan <strong>dos cosas que no esperaba</strong>…</p>
<ol>
<li>Hay dos plugins, Visibility y The SEO Framework, con los que <strong>WordPress hace menos consultas a la base de datos que si no tuvieras ningún plugin de SEO instalado, consultas negativas de verdad, no es un error de la tabla</strong>. Lo que pasa es que ambos desactivan consultas que WordPress lanza por defecto y que ninguno de los dos necesita, eso ya es hilar fino.</li>
<li>Y luego está la sorpresa para muchos, porque resulta que <strong style="font-size: 16px;">Rank Math añade trece veces más memoria que los más ligeros para servir exactamente la misma página</strong><span style="font-size: 16px;">, con el mismo contenido y el mismo tema. En un hosting compartido con la memoria justa, o en una web con tráfico importante, esa diferencia se multiplica por cada visita simultánea, no es un número que se quede solo en la tabla, y me parece <strong>una burrada</strong>.</span></li>
</ol>
<p>Si te fijas en el orden de la tabla no es aleatorio. <strong>Los tres plugins que menos añaden, The SEO Framework, Visibility y Slim SEO</strong>, son también los tres que menos hacen por su cuenta, sin asistente de configuración, sin paneles de análisis en tiempo real, sin llamadas a servicios externos.</p>
<p><strong>Los que más consumen, Rank Math y AIOSEO</strong>, son también los que más funciones traen activadas por defecto. <strong>Pesar más no sale gratis</strong>, y tampoco es casualidad.</p>
<h2>El editor de bloques también se resiente, y bastante</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160134 size-full" src="https://ayudawp.com/wp-content/uploads/2026/09/carrera-rendimiento-plugins-seo.jpg" alt="" width="1200" height="805" srcset="https://ayudawp.com/wp-content/uploads/2026/09/carrera-rendimiento-plugins-seo.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/carrera-rendimiento-plugins-seo-768x515.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/carrera-rendimiento-plugins-seo-240x160.jpg 240w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p><strong>Publicar y editar también es rendimiento</strong>, aunque solo lo note quien escribe. Con esa misma entrada abierta en el editor de bloques, esto es lo que añade cada plugin:</p>
<table>
<thead>
<tr>
<th>Plugin</th>
<th>Memoria</th>
<th>Consultas</th>
<th>Tiempo</th>
<th>CSS + JS</th>
</tr>
</thead>
<tbody>
<tr>
<td>The SEO Framework</td>
<td><span style="color: #008000;">+0,09 MB</span></td>
<td><span style="color: #008000;">−10</span></td>
<td><span style="color: #000000;">−3,4 ms</span></td>
<td>82 KB</td>
</tr>
<tr>
<td><strong>Visibility</strong></td>
<td>+0,47 MB</td>
<td><span style="color: #000000;">−6</span></td>
<td>−0,8 ms</td>
<td><span style="color: #008000;">68 KB</span></td>
</tr>
<tr>
<td>Slim SEO</td>
<td>+0,39 MB</td>
<td>+1</td>
<td><span style="color: #008000;">−4,0 ms</span></td>
<td>187 KB</td>
</tr>
<tr>
<td>SureRank</td>
<td>+0,98 MB</td>
<td>+19</td>
<td>+17,2 ms</td>
<td>2,1 MB</td>
</tr>
<tr>
<td>SEOPress</td>
<td>+1,03 MB</td>
<td>+11</td>
<td>+6,7 ms</td>
<td>289 KB</td>
</tr>
<tr>
<td>Yoast SEO</td>
<td>+1,92 MB</td>
<td>+32</td>
<td>+42,9 ms</td>
<td><span style="color: #ff0000;">4,1 MB</span></td>
</tr>
<tr>
<td>AIOSEO</td>
<td>+5,23 MB</td>
<td><span style="color: #ff0000;">+85</span></td>
<td>+44,0 ms</td>
<td>1,2 MB</td>
</tr>
<tr>
<td>Rank Math</td>
<td><span style="color: #ff0000;">+7,21 MB</span></td>
<td>+32</td>
<td><span style="color: #ff0000;">+59,5 ms</span></td>
<td>1,8 MB</td>
</tr>
</tbody>
</table>
<p>Fíjate en <strong>AIOSEO, 85 consultas más solo por tener la entrada abierta en el editor</strong>, y en <strong>Rank Math, que suma 7,21 MB y casi 60 milisegundos por carga</strong>.</p>
<p>Los dos comparten algo, un panel lateral que analiza el contenido mientras escribes y recalcula una puntuación con cada pulsación. <strong>Ese análisis en directo es justo lo que más memoria y consultas consume</strong>, y es opcional lo mires como lo mires.</p>
<p>Si publicas cuatro entradas al año no lo vas a notar nunca. Ahora bien, si en tu web escriben varios autores a diario, o <strong>si ya te has preguntado alguna vez por qué el editor va lento</strong> cada vez que pulsas una tecla, esta tabla es la respuesta más clara que vas a encontrar.</p>
<p><strong>Visibility y The SEO Framework</strong> son los dos únicos que además <strong>cargan el editor más rápido que sin ningún plugin de SEO activo</strong>, y eso solo tiene una explicación, que ninguno de los dos monta ese panel de análisis en directo. Si lo echas de menos, esto no es para ti, y si nunca lo has usado <strong>acabas de ahorrarte varios megas por sesión de escritura</strong> sin perder nada.</p>
<h2>Lo que se queda instalado en tu WordPress … para siempre</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160137 size-full" src="https://ayudawp.com/wp-content/uploads/2026/09/peso-plugins-seo-grua.jpg" alt="" width="1200" height="805" srcset="https://ayudawp.com/wp-content/uploads/2026/09/peso-plugins-seo-grua.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/peso-plugins-seo-grua-768x515.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/peso-plugins-seo-grua-240x160.jpg 240w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Lo que un plugin deja en tu instalación en cuanto lo activas, <strong>tablas propias, eventos de cron, opciones que se leen en cada petición aunque no tengan nada que ver con el SEO</strong>, es otra letra pequeña que casi nadie mira antes de instalar.</p>
<table>
<thead>
<tr>
<th>Plugin</th>
<th>En disco</th>
<th>Tablas propias</th>
<th>Cron propio</th>
<th>Opciones autocargadas</th>
</tr>
</thead>
<tbody>
<tr>
<td>Slim SEO</td>
<td><span style="color: #008000;">892 KB</span></td>
<td>0</td>
<td>0</td>
<td>2 (7 B)</td>
</tr>
<tr>
<td><strong>Visibility</strong></td>
<td>971 KB</td>
<td>0</td>
<td>0</td>
<td><span style="color: #008000;">2 (3,3 KB)</span></td>
</tr>
<tr>
<td>The SEO Framework</td>
<td>2,2 MB</td>
<td>0</td>
<td>0</td>
<td>3 (4,9 KB)</td>
</tr>
<tr>
<td>SEOPress</td>
<td>8,3 MB</td>
<td>1 (16 KB)</td>
<td>0</td>
<td>7 (4,2 KB)</td>
</tr>
<tr>
<td>Rank Math</td>
<td>11,1 MB</td>
<td>2 (64 KB)</td>
<td><span style="color: #ff0000;">3</span></td>
<td><span style="color: #ff0000;">15 (10,4 KB)</span></td>
</tr>
<tr>
<td>Yoast SEO</td>
<td>16,0 MB</td>
<td>6 (304 KB)</td>
<td>2</td>
<td>7 (13,8 KB)</td>
</tr>
<tr>
<td>AIOSEO</td>
<td>16,4 MB</td>
<td><span style="color: #ff0000;">9 (448 KB)</span></td>
<td>0</td>
<td><span style="color: #ff0000;">6 (17,1 KB)</span></td>
</tr>
<tr>
<td>SureRank</td>
<td><span style="color: #ff0000;">19,8 MB</span></td>
<td>0</td>
<td>1</td>
<td>2 (54 B)</td>
</tr>
</tbody>
</table>
<p><strong>Slim SEO y Visibility son los dos plugins más ligeros en disco</strong> de los ocho, y comparten algo más importante todavía, que ni uno ni otro crea una tabla ni un evento de cron.</p>
<p><strong>La diferencia, y la razón por la que Visibility puede decir que es el único de los ocho sin ninguna llamada a un servidor externo</strong>, no sale en esta tabla, sale al mirar el código, que también he publicado para quien quiera comprobarlo por su cuenta.</p>
<p>Las opciones con <code>autoload</code> son la columna que menos se mira y la que más pesa de verdad, porque WordPress las lee enteras en cada petición a tu web, tenga que ver con el SEO o no.</p>
<p><strong>Rank Math pone en carga automática 10,4 KB repartidos en 15 opciones distintas</strong>, y eso se lee igual en tu portada, en tu tienda o en la página de contacto, aunque ninguna tenga una palabra clave que analizar.</p>
<p>Y luego está el cron. Cada evento programado depende de que alguien visite la web para dispararse, lo que en una web con poco tráfico puede acumular tareas pendientes sin que nadie se entere.</p>
<p><strong>Rank Math programa 3 eventos propios, Yoast 2 y SureRank 1</strong>. Los otros cinco, Visibility incluido, no programan ninguno.</p>
<p>Pesar menos solo vale la pena si haces lo mismo o casi. Sobre esa misma entrada que generé para las pruebas, los ocho emiten etiquetas Open Graph, marcado JSON-LD, url canonical y meta description, aunque con dos excepciones que merece la pena anotar.</p>
<p>SEOPress no publica <a href="https://ayudawp.com/json-ld/" target="_blank" rel="noopener">JSON-LD</a> con los ajustes por defecto (este ha sido una de mis mayores decepciones recientes), y Yoast no escribe <code>meta description</code> si no se la escribes tú a mano o lo configuras la plantilla de extracto automático.</p>
<p>El resto va prácticamente empatado en lo que entrega, así que en esta tabla <strong>no hay nada que justifique tanta diferencia de peso</strong> entre unos y otros. Lo que hace cada uno es casi lo mismo, lo que cuesta hacerlo no.</p>
<h2>Dónde no gana Visibility (cachislamar) y me lo apunto como tareas de mejora</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160132 size-full" src="https://ayudawp.com/wp-content/uploads/2026/09/analisis-bascula-rayos-plugins-seo.jpg" alt="" width="1200" height="805" srcset="https://ayudawp.com/wp-content/uploads/2026/09/analisis-bascula-rayos-plugins-seo.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/analisis-bascula-rayos-plugins-seo-768x515.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/analisis-bascula-rayos-plugins-seo-240x160.jpg 240w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Me toca reconocerlo, qué le vamos a hacer, que los datos son para eso, y aquí no hay maquillaje ni <em>cocina</em>. <strong>En memoria de portada y de entrada individual, The SEO Framework queda por debajo de Visibility.</strong> Slim SEO ocupa algo menos en disco (892 KB frente a 971 KB) y autocarga muchísimo menos (7 bytes frente a 3,3 KB).</p>
<p>Pero vamos, que ya me conoces, ya le estoy <strong>pasando la lija, poniendo a dieta y en nada esas tablas van a cambiar y mucho</strong>. Lo que más me gusta de ponerme a prueba es precisamente eso, que son retos, y <strong>me encanta aprender para mejorar</strong>.</p>
<h2>¿Y con esto qué hago si voy a instalar un plugin de SEO? ¿me fío? ¿sirve de algo?</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160135 size-full" src="https://ayudawp.com/wp-content/uploads/2026/09/escaner-rendimiento-plugins-seo.jpg" alt="" width="1200" height="805" srcset="https://ayudawp.com/wp-content/uploads/2026/09/escaner-rendimiento-plugins-seo.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/escaner-rendimiento-plugins-seo-768x515.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/escaner-rendimiento-plugins-seo-240x160.jpg 240w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Aquí no te voy a decir que instales Visibility porque lo haya desarrollado yo, para eso ya tienes el enlace de descarga un poco más abajo si te apetece probarlo.</p>
<p>Te digo lo de siempre, lo que llevo defendiendo más de 20 años, que <strong>el problema nunca es cuántos plugins metes en tu WordPress, el problema es meter código que no vas a usar</strong>.</p>
<p>Si tu plugin actual te resuelve lo que necesitas y no te está comiendo media instalación no tienes ningún motivo para cambiar. Si en cambio llevas tiempo notando que el editor va a pedales o que tu hosting anda canino de memoria, ya sabes en qué tabla mirar antes de decidir.</p>
<p>Y luego está <em><strong>ese otro debate del que usted me habla</strong></em>, el de que <a href="https://ayudawp.com/sirven-actualmente-plugins-seo/">si sirven de algo actualmente los plugins de SEO</a>, por si te apetece seguir con la juerga.</p>
<h2>Metodología de la comparativa de rendimiento de plugins SEO</h2>
<p>Todo esto sale de un plugin propio que solo se instala para hacer las mediciones, nunca en una web real, y que expone varios pasos protegidos por una clave para que nadie más pueda tocarlo.</p>
<p>Antes de cada tanda genera la entrada de prueba siempre igual (1.169 palabras, extracto escrito a mano, imagen destacada, encabezados, una lista y un bloque de detalles), para que el contenido nunca sea la variable que cambia entre un plugin y otro.</p>
<p>Después cambia el plugin activo, desactiva los otros siete y activa solo el que toca, dejando que sus rutinas de instalación se ejecuten como en cualquier instalación nueva, con sus tablas, sus opciones y su configuración de fábrica. Nada de activaciones silenciosas que se salten esos pasos, porque eso habría falseado buena parte de lo que has leído más arriba.</p>
<p>Es todo un bicho, y actúa prácticamente sin intervención humana (tienes las instrucciones en el zip que te he puesto abajo), más o menos, por resumirte, funciona así:</p>
<ul>
<li>Con el plugin activo pide la portada, la entrada y el editor las veces que corresponda, y en cada carga anota <code>memory_get_peak_usage()</code> para la memoria, <code>get_num_queries()</code> para las consultas y un cronómetro para el tiempo.</li>
<li>Para saber qué código PHP entra a ejecutarse de verdad, compara <code>get_included_files()</code> antes y después de cada petición, así que la cifra de PHP cargado no es lo que el plugin ocupa en el disco, es lo que tu servidor ha tenido que leer para servir esa página en concreto.</li>
<li>Para la huella que deja instalado mira <code>SHOW TABLES</code> para las tablas propias de cada plugin, <code>_get_cron_array()</code> para sus eventos de cron y las opciones autocargadas con su peso en bytes.</li>
<li>Para el peso del editor y de la portada, suma lo que cada plugin encola con <code>wp_scripts()</code> y <code>wp_styles()</code>. Cada petición queda anotada en un registro en bruto, y de ahí sale la mediana que ves en las tablas, no la mejor marca ni una media que un solo pico podría desviar.</li>
</ul>
<h3>Entorno y procedimiento</h3>
<ul>
<li>WordPress 7.0.2, PHP 8.5.3, MySQL 8.4, tema GeneratePress, límite de memoria de 256 MB y sin caché de objetos externa. Instalación local, con WooCommerce activo y cuatro plugins pequeños más, los mismos en los ocho escenarios, para que ningún plugin de SEO compitiera contra una instalación desnuda que no representa una web real. Medido el 29 de julio de 2026.</li>
<li>Portada y entrada individual pedidas 10 veces como visitante anónimo, mediante peticiones que el propio servidor se hace a sí mismo, descartando antes una carga de calentamiento. El editor de bloques, que solo se puede abrir con sesión de administrador, se abrió 4 veces con esa entrada cargada.</li>
</ul>
<p>Dos plugins necesitaron un empujón antes de arrancar, todo hay que decirlo, y es que Rank Math y SEOPress no publican nada hasta completar sus rutinas de instalación, y Rank Math ni siquiera pinta una etiqueta hasta que terminas su asistente. Lo completé aceptando todos los valores que traía por defecto, sin conectar ninguna cuenta ni importar nada de otro plugin.</p>
<h3>El contraste con Query Monitor, y el susto de AIOSEO</h3>
<p>Todo lo anterior está medido sin Query Monitor, porque este plugin, por otra parte encantador, tiene una pega, y es que guarda cada consulta que registra y eso también consume memoria.</p>
<p>Con sesión de administrador y Query Monitor activo los números suben para todos por igual, y la instalación sin ningún plugin de SEO pasa de 10,83 MB y 58 consultas a 13,7 MB y 72. El orden entre plugins no cambia, así que las cifras de las tablas anteriores se tomaron sin él.</p>
<p>Uso Query Monitor aquí a propósito, porque no es mío ni de nadie del sector. Es la herramienta que cualquier desarrollador de WordPress usa para diagnosticar estos mismos números, así que si desconfías del medidor propio, tienes el mismo resultado visto con otro instrumento.</p>
<blockquote><p>Con Query Monitor activo, Visibility genera la página en 0,05 segundos, más rápido que la instalación sin ningún plugin de SEO, que tarda 0,08 s</p></blockquote>
<p>Y el contraste tiene su propio susto, porque en esa misma situación <strong>AIOSEO tarda 0,31 segundos, seis veces más que Visibility y casi cuatro veces más que no tener ningún plugin de SEO instalado</strong>.</p>
<h2>Compruébalo por tu cuenta: datos abiertos ¿se decía así no?</h2>
<p>Todo lo que has leído sale de <strong>216 mediciones</strong> concretas, no de una sensación. Puedes descargar el medidor que las ha tomado, con el registro completo y el CSV agregado de mis pruebas, lo tienes en <a href="https://visibility.quest/assets/bench/ayudawp-bench.zip" target="_blank" rel="nofollow noopener">visibility.quest/assets/bench/ayudawp-bench.zip</a>, para no tener que fiarte de mi palabra ni de la de nadie.</p>
<p>La comparativa completa, con las cuatro tablas y el contraste con Query Monitor, está en <a href="https://visibility.quest/es/comparison.html#performance" target="_blank" rel="noopener">visibility.quest/es/comparison.html</a>.</p>
<p>Si usas alguno de los otros ocho plugins, ya tienes tus números ahí, para bien o para mal. Y si te apetece debatirlo, o contarme cuál usas tú y por qué, me tienes ahí abajo, en la sección de comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/plugin-seo-ligero/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Tienda WooCommerce «Visible» o «Próximamente» ¿se puede cambiar o personalizar eso?</title>
		<link>https://ayudawp.com/woocommerce-proximamente/</link>
					<comments>https://ayudawp.com/woocommerce-proximamente/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Wed, 09 Sep 2026 06:28:52 +0000</pubDate>
				<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Principiante]]></category>
		<category><![CDATA[Próximamente]]></category>
		<category><![CDATA[WooCommerce]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160093</guid>

					<description><![CDATA[Estás montando una tienda con WooCommerce, quieres que el cliente vaya viendo cómo queda, que tú puedas trastear con las plantillas a plena luz del día.]]></description>
										<content:encoded><![CDATA[<p>Estás <strong>montando una tienda</strong> con WooCommerce, quieres que <strong>el cliente vaya viendo cómo queda</strong>, que tú puedas trastear con las plantillas a plena luz del día.</p>
<p>Pero, eso sí, que mientras tanto el que llegue de Google se encuentre una página de espera decente, y <strong>no una tienda a medias con tres productos de prueba</strong> con <a href="https://ayudawp.com/generador-chiquito-lorem-ipsum/" target="_blank" rel="noopener">textos Lorem Ipsum</a>.</p>
<p>Pues no necesitas ningún plugin para eso, <strong>WooCommerce lo trae de serie desde hace tiempo y casi nadie sabe que está ahí</strong>.</p>
<p>Y lo que menos gente sabe todavía es que <strong>la página de espera que te enseña por defecto puedes cambiarla</strong> entera por la tuya.</p>
<p>Vamos a verlo, que se hace en un par de minutos.</p>
<h2>Dónde cambiar la visibilidad de WooCommerce</h2>
<p>En el escritorio, «<strong>WooCommerce → Ajustes → Visibilidad del sitio</strong>». Es una pestaña más, al lado de las de siempre, y tiene dos opciones:</p>
<ul>
<li><strong>Visible</strong>: la tienda está abierta, lo habitual.</li>
<li><strong>Próximamente</strong>: quien no tenga permisos ve una página de espera.</li>
</ul>
<p>Debajo hay <strong>una casilla para restringirlo solo a las páginas de la tienda</strong>, y un interruptor para <strong>generar un enlace con clave y poder enseñar el sitio</strong> a quien tú quieras, ahora vemos las dos cosas.</p>
<p><a href="https://ayudawp.com/?attachment_id=160157" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160157 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/ajustes-visibilidad-woocommerce-1200x678.jpg" alt="" width="1200" height="678" srcset="https://ayudawp.com/wp-content/uploads/2026/09/ajustes-visibilidad-woocommerce-1200x678.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/ajustes-visibilidad-woocommerce-768x434.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/ajustes-visibilidad-woocommerce-1536x867.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/ajustes-visibilidad-woocommerce.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Por cierto, si acabas de instalar WooCommerce y te está pasando que en la parte visible enseña una página de «próximamente» aunque tu tema esté perfecto, no te vuelvas loco revisando plantillas, <strong>las tiendas nuevas vienen con esto activado por defecto</strong>.</p>
<p>Es esa pantalla, no tu tema, y es de esas cosas que te hacen perder una tarde buscando el fallo donde no está.</p>
<h2>Quién ve la tienda y quién ve el cartel de próximamente</h2>
<p>La regla es simple, <strong>ve la tienda quien tenga la capacidad <code>manage_woocommerce</code></strong>, o sea, administradores y gestores de tienda. Todos los demás ven la página de espera, incluidos tus suscriptores y tus clientes registrados.</p>
<p>Eso es útil para que tú y el cliente entréis con vuestro usuario y veáis la web como va quedando, sin trucos ni URLs raras.</p>
<p>¿Y si quieres enseñársela a alguien que no tiene usuario? Pues para eso está el enlace para compartir de esa misma pantalla.</p>
<p>Genera una URL con una clave al final, del tipo <code>tudominio.com/page_id=8804&amp;woo-share=laclave</code>, y <strong>quien la abra deja de ver la página de espera durante noventa días</strong>, porque WooCommerce le pone una cookie.</p>
<p>Muy práctico para el diseñador, el fotógrafo o tu socio, que no tienen por qué tener cuenta en la tienda.</p>
<p>Si la clave se te va de las manos y acaba circulando por ahí, la cambias en esa misma pantalla y las cookies antiguas dejan de valer.</p>
<h3>Toda la web o solo la tienda</h3>
<p>La casilla de restringir a las páginas de la tienda hace exactamente lo que dice, y la diferencia importa más de lo que parece:</p>
<ul>
<li><strong>Sin marcar</strong>: se tapa el sitio entero, portada incluida. Es lo que quieres cuando estás montando la web desde cero.</li>
<li><strong>Marcada</strong>: el blog, el «quiénes somos» y el resto de páginas siguen visibles, y solo se tapan la tienda, las fichas de producto, el carrito y el pago. Es lo que quieres cuando ya tienes una web viva y le estás añadiendo la parte de tienda, o cuando cierras la venta unos días por vacaciones y no te apetece apagar la web.</li>
</ul>
<h2>Cómo cambiar la pantalla de próximamente de WooCommerce</h2>
<p>Aquí viene lo bueno, porque resulta que la página que enseña WooCommerce por defecto está bien para salir del paso, pero es genérica. ¿Y eso es bueno? … esperaaaa, que ahora viene…</p>
<p>Por dentro, WooCommerce no genera nada inamovible, simplemente <strong>carga la plantilla <code>coming-soon</code> con la función de WordPress <code>get_query_template()</code>,</strong> y eso lo genera tu tema.</p>
<p>Si usas un <strong>tema de bloques</strong> creas el archivo <code>templates/coming-soon.html</code> dentro de la carpeta del tema (o del tema hijo). Con eso ya lo tienes, aparece en «<strong>Apariencia → Editor → Plantillas</strong>» y se edita con bloques, como cualquier otra.</p>
<p>Ahí <strong>puedes poner tu logotipo, tu tipografía, tus colores, la foto de tu local, el mapa, el formulario de avisos, lo que quieras</strong>.</p>
<p>Si usas un <strong>tema clásico</strong> el archivo es <code>coming-soon.php</code> en la raíz del tema, y ahí mandas tú con PHP.</p>
<p>Por cierto, <strong>los archivos <code>.html</code> de las plantillas de un tema de bloques no ejecutan PHP</strong>.</p>
<p>Si tu página de espera necesita PHP (sacar el logotipo de los ajustes, pintar iconos SVG, leer una opción), el contenido va en un patrón, dentro de <code>patterns/</code>, y la plantilla se limita a llamarlo:</p>
<pre>&lt;!-- wp:pattern {"slug":"tutema/proximamente"} /--&gt;</pre>
<p>Los patrones sí son PHP y sí se ejecutan. La plantilla queda en una línea y el contenido se puede editar igual desde el editor.</p>
<h2>Dónde se almacenan los ajustes de visibilidad de la tienda de WooCommerce</h2>
<p>Para quien mire la base de datos o tenga que migrar la tienda de sitio, esto son cuatro opciones en la tabla de opciones:</p>
<ul>
<li><code>woocommerce_coming_soon</code>: <code>yes</code> o <code>no</code>, el interruptor principal.</li>
<li><code>woocommerce_store_pages_only</code>: la casilla de restringir a la tienda.</li>
<li><code>woocommerce_private_link</code>: si el enlace para compartir está activo.</li>
<li><code>woocommerce_share_key</code>: la clave de ese enlace.</li>
</ul>
<p>Te lo cuento sobre todo porque <strong>si migras una tienda y de repente el sitio nuevo aparece cerrado, mira esas opciones antes de ponerte a revisar el tema</strong>.</p>
<h2>Otros ajustes a vigilar con la tienda en estado de próximamente</h2>
<p><strong>No es un 503, es un 200.</strong> La página de espera se sirve como una respuesta normal, con una cabecera de caché corta de un minuto.</p>
<p>Eso está bien pensado para una tienda que va a abrir (no quieres que Google entienda que tu web se ha caído), pero significa que <strong>si dejas la web en «próximamente» meses, Google puede indexar esa página de espera</strong>.</p>
<p>Mientras estés montando la tienda deja también marcado el «Pedir a los motores de búsqueda que no indexen este sitio» de «Ajustes → Lectura», y lo quitas también el día de la apertura.</p>
<p>Y si tienes caché de página en el hosting, tu plugin de optimizaciones, o un CDN por delante, puede darse el caso de que un visitante reciba la versión cacheada de la tienda, o que tú, con tu sesión abierta, sigas viendo la página de espera.</p>
<p>Cada vez que enciendas o apagues esto, vacía la caché y compruébalo en una ventana de incógnito. Es la única forma de ver lo que ve un visitante de verdad.</p>
<p><strong>Los correos y los pedidos siguen funcionando</strong>, porque estos ajustes de visibilidad tapan el escaparate, no apagan la tienda. Así que si tienes pedidos antiguos, suscripciones o tareas programadas, siguen funcionando de fondo. No es un cierre técnico, es una cortina.</p>
<h2>Para qué NO sirven los ajustes de visibilidad de WooCommerce</h2>
<p>Si lo que necesitas no es tapar el escaparate sino <strong>cerrar de verdad</strong> (una migración, restaurar una copia, un cambio de dominio, esas dos horas en las que no quieres que nadie compre ni te mande un formulario), esto no es lo tuyo, porque la web sigue funcionando entera por detrás.</p>
<p>Para eso está el archivo <code>.maintenance</code> de WordPress, que corta la ejecución antes de cargar nada y devuelve un <code>503</code> honesto. Lo tengo contado con las mejoras que le faltan al método clásico en <a href="https://ayudawp.com/activar-modo-mantenimiento-en-wordpress-con-archivo-maintenance-sin-plugins/">este otro artículo</a>.</p>
<h2>Para recordar…</h2>
<ol>
<li>WooCommerce → Ajustes → Visibilidad del sitio, marcas «Próximamente» y guardas.</li>
<li>Decides si tapas el sitio entero o solo la tienda con la casilla de debajo.</li>
<li>Si alguien de fuera tiene que verlo, activas el enlace para compartir y le pasas esa URL.</li>
<li>Creas <code>templates/coming-soon.html</code> en tu tema (o <code>coming-soon.php</code> si es clásico) y montas la página de espera que quieras.</li>
<li>Marcas «Pedir a los motores de búsqueda que no indexen este sitio» en Ajustes → Lectura mientras dure la tarea.</li>
<li>Vacía cachés y lo miras en incógnito.</li>
</ol>
<p>El día que abras, deshaces los pasos 1 y 5 en ese orden, compruebas que la tienda responde y a correr.</p>
<p>Si lo has montado de otra forma, o has hecho algo curioso con la plantilla <code>coming-soon</code> de tu tema, cuéntamelo en los comentarios, que estas páginas de espera dan mucho juego y casi siempre se despachan con un logotipo centrado y poco más.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/woocommerce-proximamente/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>¿SÍ Gutenberg?</title>
		<link>https://ayudawp.com/si-gutenberg/</link>
					<comments>https://ayudawp.com/si-gutenberg/#comments</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Tue, 08 Sep 2026 06:28:41 +0000</pubDate>
				<category><![CDATA[Plugins WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Bloques]]></category>
		<category><![CDATA[Gutenberg]]></category>
		<category><![CDATA[Principiante]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160089</guid>

					<description><![CDATA[¿Quieres poder elegir entre el editor clásico de WordPress o el de bloques Gutenberg? Te lo pongo fácil…]]></description>
										<content:encoded><![CDATA[<p>Seguramente conoces ya <strong>mi plugin No Gutenberg</strong>, que lleva en el repositorio de WordPress.org desde 2018, y que durante casi todo ese tiempo ha hecho una sola cosa: <strong>hacer desaparecer el editor de bloques</strong>, sin ajustes, sin preguntas, sin miramientos. Tiene miles de instalaciones activas que confían ahora mismo en ese comportamiento mientras escribo esto.</p>
<p>Pues bien, he publicado <strong>una actualización que cambia ese comportamiento</strong> por completo, incluso la filosofía. Y voy a ser sincero contigo, <strong>el cambio no es solo del plugin, es mío</strong>.</p>
<h2>Qué (me) ha cambiado, con fechas y todo</h2>
<p>El plugin, desde la versión 2.2.0, añade una pantalla de ajustes completa en «<strong>Ajustes &gt; No Gutenberg</strong>», con un interruptor maestro para quien quiera el comportamiento de siempre.</p>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160146 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/desactivar-gutenberg-bloques-no-gutenberg-1200x445.jpg" alt="" width="1200" height="445" srcset="https://ayudawp.com/wp-content/uploads/2026/09/desactivar-gutenberg-bloques-no-gutenberg-1200x445.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/desactivar-gutenberg-bloques-no-gutenberg-768x285.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/desactivar-gutenberg-bloques-no-gutenberg-1536x569.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/desactivar-gutenberg-bloques-no-gutenberg.jpg 1668w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Pero hay novedades, porque si desactivas el interruptor principal, debajo asoman reglas independientes por tipo de contenido, por perfil de usuario, por plantilla de página y por entradas concretas.</p>
<p><a href="https://ayudawp.com/?attachment_id=160148" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160148 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-por-tipo-de-contenido-perfiles-plantillas-1200x1088.jpg" alt="" width="1200" height="1088" srcset="https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-por-tipo-de-contenido-perfiles-plantillas-1200x1088.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-por-tipo-de-contenido-perfiles-plantillas-768x696.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-por-tipo-de-contenido-perfiles-plantillas-1536x1392.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-por-tipo-de-contenido-perfiles-plantillas.jpg 1690w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>También añade el cambio de editor entrada por entrada, un panel de estado que resume qué está pasando de verdad en tu sitio, y tres constantes de wp-config para fijar toda la configuración por código, algo que ya te conté con detalle en <a href="https://ayudawp.com/editor-clasico-en-multisitio/" target="_blank" rel="noopener ugc">la guía del editor clásico en multisitio</a> que publico junto a este artículo.</p>
<p><a href="https://ayudawp.com/?attachment_id=160147" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160147 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-ajustes-todo-el-sitio-y-widgets-1200x719.jpg" alt="" width="1200" height="719" srcset="https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-ajustes-todo-el-sitio-y-widgets-1200x719.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-ajustes-todo-el-sitio-y-widgets-768x460.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-ajustes-todo-el-sitio-y-widgets-1536x920.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/No-gutenberg-ajustes-todo-el-sitio-y-widgets.jpg 1730w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Ahí también hay algo más pequeño pero, para mí, más importante: <strong>protección automática del contenido que ya está construido con bloques</strong>. Una entrada que ya tiene bloques conserva el editor de bloques pase lo que pase con tus reglas, salvo que marques explícitamente lo contrario.</p>
<p>De paso, la lista de entradas del escritorio ahora indica qué editor usa cada una, con un enlace para ver solo las que ya están construidas con bloques. Ah, también te permite (re)activar los widgets clásicos, por si te quieres ahorrar otro plugin, y tal.</p>
<p><a href="https://ayudawp.com/?attachment_id=160149" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160149 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/No-Gutenberg-aviso-contenido-con-bloques-1200x398.jpg" alt="" width="1200" height="398" srcset="https://ayudawp.com/wp-content/uploads/2026/09/No-Gutenberg-aviso-contenido-con-bloques-1200x398.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/No-Gutenberg-aviso-contenido-con-bloques-768x255.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/No-Gutenberg-aviso-contenido-con-bloques-1536x510.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/No-Gutenberg-aviso-contenido-con-bloques.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Y si te preguntas si esto te va a romper algo al actualizar, la respuesta es que no, los ajustes por defecto reproducen el comportamiento de siempre, así que ninguna instalación existente cambia de comportamiento sin que tú lo decidas.</p>
<h2>Lo que de verdad me hizo cambiar de idea</h2>
<p>Aquí viene la parte que no sale en el registro. Si activabas No Gutenberg antes de la 2.3.0 en un sitio que ya tenía entradas montadas con bloques, <strong>esas entradas se mandaban igualmente, a la brava, al editor clásico</strong>.</p>
<p>Con el puñetero código de los bloques a la vista, sin maquetación, hecho un desastre. <strong>El plugin no distinguía</strong> entre «esta entrada nunca ha visto un bloque» y «esta entrada es un bloque detrás de otro con cuidado», y las trataba igual.</p>
<p>Ahí es donde caí en la cuenta de que <strong>llevaba años resolviendo mi propio problema y dando por hecho que era también el tuyo</strong>.</p>
<p>Mi problema era que no quería ver el editor de bloques. El tuyo, si tenías contenido ya creado con blouqes, era no perder ese trabajo por instalar mi plugin.</p>
<p>Son dos problemas distintos, y durante ocho años los traté como si fueran el mismo, total nada, desde 2018.</p>
<h2>Mi queja nunca fue Gutenberg o los bloques, era no poder elegir</h2>
<p>Y aquí toca hacer autocrítica, más o menos.</p>
<p>Llevo años criticando el editor de bloques con dureza, y sigo pensando que buena parte de esa crítica está justificada. Pero en realidad, si me conoces ya sabrás que <strong>mi queja de fondo nunca fue que el editor de bloques existiera, sino que no había forma sencilla de decidir dónde sí y dónde no</strong>.</p>
<p>Te lo digo yo, que también llevo defendiendo años el <strong>uso el editor de bloques como maquetador siempre que puedo</strong>, a pesar de que todavía le faltan cosas para estar a la altura de un Divi o un Elementor.</p>
<p>Y lo uso a propósito, no a pesar de mi postura sobre Gutenberg, sino precisamente por ella. Es la pieza más cercana que tiene WordPress hoy a ese maquetador nativo que llevo años pidiendo, para no depender de un plugin de terceros solo para maquetar una portada o una landing.</p>
<p><strong>Lo que nunca he defendido es que ese mismo maquetador sea la herramienta obligatoria</strong> para escribir una entrada de blog. Ahí no hace falta maquetar nada, hace falta escribir, y son dos trabajos distintos que llevan mal metidos en la misma pantalla desde 2018.</p>
<p>No Gutenberg, durante un montón de años ha resuelto eso a su manera, cerrando la cocina entera del restaurante porque había un plato del menú que no me convencía. Lo lógico siempre fue quitar ese plato, no echar el cierre a todo el local.</p>
<p>También aplica exactamente esta misma lógica a WooCommerce, que hasta ahora era otro interruptor de todo o nada dentro del propio plugin.</p>
<h2>Páginas y sitio sí, entradas no, o mejor dicho, que cada cual elija</h2>
<p>Esta distinción no es solo una manía mía. Está en la propia arquitectura de WordPress. Las plantillas de un tema de bloques, las que usa el editor del sitio para maquetar toda la web, ni siquiera pasan por la pantalla clásica de editar entradas, tienen su propia aplicación, separada, pensada de raíz para maquetar.</p>
<p>WordPress ya sabe que <strong>maquetar un sitio y escribir una entrada son tareas distintas</strong>. Lo que nunca ha ofrecido es una forma cómoda de aplicar ese criterio también a las entradas y páginas normales sin tocar código.</p>
<p>Eso es exactamente lo que hace ahora No Gutenberg: bloques para páginas y para el sitio, si quieres, y editor clásico para entradas, si es lo que prefieres, sin que sea una decisión de todo o nada para todo el contenido a la vez.</p>
<h2>Por qué esto es importante sobre todo a agencias y redacciones</h2>
<p>Si trabajas solo esta discusión es casi filosófica, activas lo que te apetezca y ya está, pero si gestionas una web con varios redactores, o llevas clientes desde una agencia, la falta de elección deja de ser una molestia personal y se convierte en un problema real de flujo de trabajo.</p>
<p>Un redactor que solo quiere escribir y publicar no necesita ver patrones, columnas ni estilos globales, necesita un cuadro de texto que no se interponga.</p>
<p>Y un diseñador o un administrador maquetando la home sí necesita todo eso. Antes tenías que elegir un único comportamiento para todo el mundo y todo el contenido.</p>
<p>Ahora puedes decir si <strong>editor clásico para el perfil de redactor, bloques disponibles para administrador y editor, y bloques siempre en páginas</strong>, con las reglas por perfil y por tipo de contenido.</p>
<p>Es la <strong>diferencia entre imponer una preferencia y ofrecer una herramienta</strong>.</p>
<h2>Qué no cambia si ya usas el plugin</h2>
<p>Si ya tenías No Gutenberg activo actualizar no te va a cambiar nada lo que ya tenías. El interruptor maestro sigue ahí, y <strong>con la configuración por defecto el plugin se comporta exactamente igual que antes de la 2.2.0</strong>.</p>
<p>Lo único nuevo es que, <strong>si quieres, ahora puedes afinar</strong>. No hay letra pequeña ni cambio de comportamiento silencioso, y si algo he defendido siempre es que las novedades se cuenten así de claras, sin meterte prisa ni miedo para que actualices.</p>
<h2>Para quién es este cambio, y para quién no</h2>
<p>Si administras un solo sitio para ti, para tu propio uso, y tienes clarísimo que no quieres ver un bloque en tu vida, el interruptor maestro sigue a un clic de distancia, exactamente igual que en la versión anterior (no, no te va a caer ninguna notificación insistiendo para que cambies nada). <strong>Este cambio no te obliga a nada</strong>.</p>
<p>Es para quien administra contenido de otros, para clientes, redactores, equipos completos, y necesitaba desde hace tiempo algo más fino que un único interruptor para todo el sitio.</p>
<p>Si esa eres tú, la pantalla de ajustes nueva es motivo suficiente para actualizar hoy mismo.</p>
<h2>Y ahora, la parte que te toca a ti</h2>
<p>Si administras un solo sitio y quieres perfilar quién ve qué editor, la nueva pantalla de ajustes de <a href="https://wordpress.org/plugins/no-gutenberg/" target="_blank" rel="nofollow noopener">No Gutenberg?</a> es el sitio por el que empezar. Si administras una red completa, tienes <a href="https://ayudawp.com/editor-clasico-en-multisitio/" target="_blank" rel="noopener ugc">un tutorial de cómo usar el editor clásico en multisitio</a> con las tres formas que funcionan de verdad, plugin, código y constantes de wp-config incluidas.</p>
<p>Y si después de leer esto sigues pensando que lo mío es una excusa para no reconocer que el editor de bloques está bien como está, para todo y para todos, no estamos de acuerdo, y ahora ya sabes por qué. Pero vamos, que lo debatimos por ahí abajo, en los comentarios.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/si-gutenberg/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>¿Te llegó un email diciendo que tu web WordPress tiene una vulnerabilidad grave? ¿es un Beg Bounty bueno o un timo?</title>
		<link>https://ayudawp.com/beg-bounty/</link>
					<comments>https://ayudawp.com/beg-bounty/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Mon, 07 Sep 2026 06:28:54 +0000</pubDate>
				<category><![CDATA[Seguridad WordPress]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[beg bounty]]></category>
		<category><![CDATA[bug bounty]]></category>
		<category><![CDATA[Cloudflare]]></category>
		<category><![CDATA[CSP]]></category>
		<category><![CDATA[DMARC]]></category>
		<category><![CDATA[Heartbleed]]></category>
		<category><![CDATA[HSTS]]></category>
		<category><![CDATA[Logjam]]></category>
		<category><![CDATA[SPF]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[TLS]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160039</guid>

					<description><![CDATA[Si te ha llegado un email diciendo que tu web WordPress tiene una vulnerabilidad grave, la respuesta corta es que puede ser cierto y un timo al mismo tiempo.]]></description>
										<content:encoded><![CDATA[<p>Si te ha llegado un <strong>email diciendo que tu web WordPress tiene una vulnerabilidad grave</strong>, la respuesta corta es que <strong>puede ser cierto y un timo al mismo tiempo</strong>.</p>
<p>A mí me llegó hace unos días, haciendo referencia a <a href="https://mantenimiento.ayudawp.com/">mantenimiento.ayudawp.com</a>, y mi primera reacción fue la típica, pensar que era <strong>publicidad de servicios de seguridad disfrazada de aviso técnico</strong>.</p>
<p>Y el caso es que no vendía nada, y venía de un Gmail corriente, sin firma de empresa ni nada que oliera a comercial.</p>
<p>Llevo como 20 años metido en seguridad de WordPress, y aun así el correo me hizo dudar un segundo.</p>
<p>Vamos a ver qué me encontré, porque la cosa tiene su miga, y es que el aviso tenía razón en lo técnico y aun así era una encerrona.</p>
<h2>Esto es lo que decía el correo</h2>
<p>El asunto decía, tal cual, «<strong>Security Advisory: Deprecated TLS Protocol &amp; Weak Ciphers Enabled on …</strong>». Si te ha llegado uno con ese mismo patrón, con tu dominio en vez del mío, es la misma plantilla.</p>
<p>Va dirigido a un altisonante «<strong>Security Team</strong>», lo firma un no menos rimbombante «<strong>Security Research Team</strong>» (que suena a mucho y no tiene porqué ser nada), y apunta directo a <code>mantenimiento.ayudawp.com:443</code>. Esto es, resumido y sin la parafernalia de separadores que traía de verdad, lo que contaba:</p>
<blockquote><p>Finding: <code>weak-cipher-suites:tls-1.0</code>, severidad <em>low</em> según su propia herramienta.</p>
<p>Impacto según ellos: ataques de hombre en el medio con caída de protocolo (citaban POODLE y BEAST), robo de cookies de sesión por los cifrados CBC, e incumplimiento de PCI-DSS 3.2.1.<br>
Cómo comprobarlo: <code>openssl s_client -connect mantenimiento.ayudawp.com:443 -tls1</code><br>
Solución que proponían: bloques de configuración para Nginx y Apache forzando TLS 1.2 y 1.3.<br>
Firmado, cómo no, «Security Research Team».</p></blockquote>
<p>Ni una empresa detrás, ni un nombre, ni una vía de contacto que no fuera ese mismo Gmail.</p>
<p><a href="https://ayudawp.com/?attachment_id=160140" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160140 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/security-advvisory-email-1200x1439.jpg" alt="" width="1200" height="1439" srcset="https://ayudawp.com/wp-content/uploads/2026/09/security-advvisory-email-1200x1439.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/security-advvisory-email-768x921.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/security-advvisory-email-1281x1536.jpg 1281w, https://ayudawp.com/wp-content/uploads/2026/09/security-advvisory-email-1707x2048.jpg 1707w, https://ayudawp.com/wp-content/uploads/2026/09/security-advvisory-email.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Con esto ya tenía motivos de sobra para desconfiar, pero antes de mandarlo a la papelera quise comprobar si lo técnico se sostenía.</p>
<h2>Cómo comprobarlo sin fiarte de nadie</h2>
<p>Lo primero que hice fue lo que proponía el propio email, lanzar el comando que te copio arriba, y me dio un error de <code>No protocols available</code>, como si el servidor hubiera colgado la llamada.</p>
<p>Aquí viene la primera trampa, y le puede pasar a cualquiera que use OpenSSL 3, que es la versión que trae cualquier Linux o Mac reciente.</p>
<p>Por defecto OpenSSL bloquea TLS 1.0 antes de intentar siquiera la conexión. Ese error solo dice que tu OpenSSL ha decidido no probarlo, y no aporta ningún dato real sobre el servidor.</p>
<p>Para forzar la prueba real hay que añadir <code>-cipher 'ALL:@SECLEVEL=0'</code>, que baja el nivel de seguridad exigido por la librería, solo entonces la respuesta viene de verdad del otro lado.</p>
<p>Y hay una segunda trampa, más traicionera todavía si le pides el favor a una IA. Muchos entornos con salida a internet, ya sea un proxy corporativo o el <em>sandbox</em> de un asistente, interceptan el TLS y sirven su propio certificado en vez del tuyo, si la comprobación te sale limpia a la primera, <strong>desconfía</strong>, porque puede que estés midiendo ese proxy y no tu web de verdad.</p>
<p>La forma fiable de comprobarlo sin estos líos es un escáner externo, y el de referencia es el de Qualys, <a href="https://www.ssllabs.com/ssltest/" target="_blank" rel="nofollow noopener">SSL Labs</a>. Y ahí el resultado fue claro, nota <strong>B</strong>, con TLS 1.0 y 1.1 activos de la mano de 1.2 y 1.3, y el cifrado exacto que citaba el correo, <code>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</code>, en eso no mentían.</p>
<h2>Lo real y lo inflado</h2>
<p>El remitente, por muy oportunista que sea, en lo técnico del correo todo era cierto. Tu web puede tener TLS 1.0 abierto ahora mismo y tú sin enterarte, así que no lo despaches solo por venir de un Gmail sin firma. Pero el resto del correo estaba inflado a base de bien.</p>
<p><strong>No hay riesgo real de POODLE</strong> (el ataque de 2014 que explota los cifrados en bloque antiguos), ni en su variante clásica ni en la variante para TLS, porque el escáner lo marca expresamente como no vulnerable en ambos casos.</p>
<p>Tampoco hay <em>downgrade</em> posible, porque el servidor tenía activo <code>TLS_FALLBACK_SCSV</code>, que es justo el mecanismo pensado para impedir que un atacante fuerce la caída a un protocolo antiguo. <strong>El correo describía un ataque que su propio hallazgo desmentía</strong>.</p>
<p><strong>BEAST sale marcado, sí, pero es un ataque de 2011 contra el navegador, no contra el servidor</strong>, y todos los navegadores actuales lo mitigan desde hace más de una década. Ningún visitante con Chrome, Firefox, Safari o Edge de este siglo lo va a sufrir.</p>
<p>Y la referencia a PCI-DSS 3.2.1 es, directamente, una plantilla vieja. esa versión se retiró el 31 de marzo de 2024, y el estándar vigente desde entonces es la <a href="https://blog.pcisecuritystandards.org/now-is-the-time-for-organizations-to-adopt-the-future-dated-requirements-of-pci-dss-v4-x" target="_blank" rel="nofollow noopener">4.0.1</a>.</p>
<p>Nada de RC4, nada de <a href="https://ayudawp.com/heartbleed/" target="_blank" rel="noopener"><strong>Heartbleed</strong></a>, nada de <strong>Logjam</strong>, y <strong>forward secrecy</strong> completa. El único motivo real de la nota B era tener TLS 1.0 y 1.1 abiertos, y punto.</p>
<h2>Qué es un Beg Bounty (y por qué WordPress es el blanco favorito)</h2>
<p><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160141 size-full" src="https://ayudawp.com/wp-content/uploads/2026/09/beg-bounty.jpg" alt="" width="1200" height="900" srcset="https://ayudawp.com/wp-content/uploads/2026/09/beg-bounty.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/beg-bounty-768x576.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></p>
<p>Esto tiene nombre y lleva ya varios años documentado en el sector, pues es un fenómeno que le pasa hasta a las webs más pequeñas. Se llama <strong><em>Beg Bounty</em></strong>, algo así como <strong><em>pedir recompensa</em></strong>.</p>
<p>El término lo acuñaron Michael Argast y Chester Wisniewski, de Sophos, después de toparse con un aluvión de correos parecidos.</p>
<p>Quien más lo popularizó fue <a href="https://www.troyhunt.com/beg-bounties/" target="_blank" rel="nofollow noopener">Troy Hunt</a>, el creador de Have I Been Pwned, que describe el método como seleccionar tu dominio, pasarlo por herramientas gratuitas de apuntar y disparar como SSL Labs, dmarcian o Security Headers, y pegar lo que sueltan en <strong>una plantilla de aviso «grave»</strong>.</p>
<p>Todo hay que decirlo, el término se puede usar en sentido peyorativo, como te acabo de comentar, o como estrategia buscada, pues <strong>hay empresas que incluso promueven esto del Be</strong><strong>g Bounty, pero al estilo de recompensas a hackers éticos por informar (responsablemente y sin alarmismo) de problemas de seguridad reales</strong>, y en realidad se le llama <strong>Bug Bounty</strong>, casi lo mismo.</p>
<p>¿Y por qué le toca precisamente a WordPress? Pues porque es uno de los CMS más escaneados del planeta, gracias a su cuota de mercado.</p>
<p>Cualquier bot que rastree direcciones IP se topa antes o después con un <code>wp-login.php</code> o un <code>wp-json</code>, y eso ya delata el CMS y activa el aviso automático.</p>
<p>Y aquí llega el detalle que más rabia me dio, todo hay que decirlo, y es que las IP que contestaban en el escaneo eran de Cloudflare.</p>
<p>El TLS se corta en su servicio, no en mi hosting, que es tanto como decir que quien te abre el portal del edificio no es quien vive en el piso, así que los bloques de configuración para Nginx y Apache que me mandaban de regalo no servían para nada, porque ahí no hay ningún puñetero Nginx mío que tocar.</p>
<p>Y hay una ironía todavía mayor, y es que <a href="https://developers.cloudflare.com/ssl/reference/protocols/" target="_blank" rel="nofollow noopener">Cloudflare fija TLS 1.0 como mínimo por defecto</a> para todos sus clientes con cifrado por certificado. Este descubrimiento, sin saberlo, lo cumplen millones de webs que usan Cloudflare y nunca han tocado ese ajuste.</p>
<h2>Lo que te van a encontrar sí o sí</h2>
<p>Si mantienes webs WordPress esto te va a sonar, es casi siempre el mismo puñado de hallazgos, y vale una misma plantilla:</p>
<table>
<thead>
<tr>
<th>Qué te van a reportar</th>
<th>¿Puede ser verdad?</th>
<th>¿Debería quitarte el sueño?</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>wp-json/wp/v2/users</code> lista tus usuarios</td>
<td>Casi siempre</td>
<td>Poco por sí solo, aunque facilita la fuerza bruta si además usas contraseñas flojas</td>
</tr>
<tr>
<td><code>xmlrpc.php</code> accesible</td>
<td>Sí, viene así por defecto</td>
<td>Depende de si lo usas de verdad (Jetpack, apps móviles). Si no, bloquéalo y listo</td>
</tr>
<tr>
<td><code>?author=1</code> revela el usuario del admin</td>
<td>Sí</td>
<td>Lo mismo que el anterior, es la puerta trasera al mismo dato</td>
</tr>
<tr>
<td>Versión de WordPress visible en el código</td>
<td>Sí</td>
<td>Poco, es informativo y no un ataque en sí mismo</td>
</tr>
<tr>
<td><code>readme.html</code> accesible</td>
<td>Sí</td>
<td>Poco, es la misma información con otro nombre</td>
</tr>
<tr>
<td>Faltan cabeceras de seguridad (CSP, X-Frame-Options)</td>
<td>Casi siempre</td>
<td>Real pero menor, ayuda a mitigar otros ataques y no es una vulnerabilidad por sí sola</td>
</tr>
<tr>
<td>SPF o DMARC flojos</td>
<td>Muy a menudo</td>
<td>El más serio de la lista, de largo</td>
</tr>
</tbody>
</table>
<p>Fíjate en la última fila, un DMARC flojo (el registro que evita que cualquiera pueda enviar correos fingiendo ser tu dominio) sí permite que alguien mande phishing haciéndose pasar por ti, con tu reputación de por medio.</p>
<p>Todo lo demás de la tabla es <strong>ruido de fondo que cualquier escáner automático encuentra en la inmensa mayoría de las webs con WordPress, tengan la seguridad que tengan</strong>.</p>
<p>Y si quieres una <strong>prueba de que ni el propio proyecto WordPress se toma en serio media lista</strong>, tienes el <a href="https://hackerone.com/wordpress" target="_blank" rel="nofollow noopener">programa de recompensas de WordPress en HackerOne</a>.</p>
<p>Descarta de entrada cualquier fallo con una puntuación CVSS (la escala que mide la gravedad de una vulnerabilidad, de 0 a 10) por debajo de 4, y rechaza de forma explícita los avisos sobre disponibilidad de XML-RPC que no vengan acompañados de una prueba de impacto real.</p>
<h2>Cómo distinguir un aviso real de un intento de sablazo</h2>
<p>La mayoría de estos correos son escaneos que alguien pega tal cual en una plantilla, sin más ánimo que cobrarte por algo que podrías haber mirado tú mismo con las mismas herramientas gratuitas. La mala fe empieza cuando de por medio hay presión de pago sin pruebas, o urgencia prefabricada.</p>
<p>Señales de que <strong>el aviso va en serio</strong>:</p>
<ul>
<li>Viene de una empresa identificable, no de un correo personal random.</li>
<li>Incluye una prueba que demuestra impacto real, no solo la salida en bruto de una herramienta.</li>
<li>No pide dinero por adelantado ni condiciona los detalles a que pagues antes.</li>
<li>Ofrece coordinar la publicación con calma, sin plazos inventados.</li>
</ul>
<p>Señales de que <strong>van a por tu cartera</strong>:</p>
<ul>
<li>Gmail u Outlook personal, sin dominio propio ni nombre real detrás.</li>
<li>Saludo genérico tipo «Dear Security Team», firmado por un remitente igual de genérico.</li>
<li>El hallazgo es justo el que su propia herramienta etiqueta como <code>low</code>, mientras el texto habla de robo de sesiones y normativas incumplidas.</li>
<li>Meten prisa con plazos de 24 o 48 horas, o piden pasar por caja antes de contarte nada más.</li>
</ul>
<p>El mío pecaba en tres de las cuatro señales malas, y no tenía ni una de las buenas.</p>
<h2>¿Tienes que hacer algo ya mismo?</h2>
<p>Aunque el correo sea un sablazo disfrazado, el ajuste de fondo conviene hacerlo, y si usas Cloudflare te lleva literalmente medio minuto:</p>
<ol>
<li>Entra en el panel de Cloudflare, en tu dominio.</li>
<li>Ve a <code>SSL/TLS → Edge Certificates → Minimum TLS Version</code>.</li>
<li>Súbelo a <strong>TLS 1.2</strong>. La propia documentación de Cloudflare desaconseja ir más allá, porque a partir de ahí empiezan los problemas con rastreadores y navegadores viejos.</li>
</ol>
<p>Además conviene activar el <strong>HSTS</strong> en ese mismo panel, que obliga al navegador a usar siempre HTTPS y protege contra un ataque bastante más real que el <strong>BEAST</strong> que te van a citar, el <strong>SSL stripping</strong>.</p>
<p>Y <strong>si lo que te llega es más extorsión que aviso, la respuesta correcta es ninguna respuesta</strong>. Contestar solo confirma que la dirección está viva, y lo normal es que el segundo correo ya venga con la tarifa por delante.</p>
<h2>Que esto lo vigile un plugin, no un Gmail cualquiera</h2>
<p>Todo lo que hemos repasado (TLS al día, HSTS activo, cabeceras de seguridad, certificado sin caducar) se puede vigilar antes de que a nadie se le ocurra escanearte y venderte el hallazgo por correo.</p>
<p>Para eso tienes gratis <a href="https://vigilante.works/es/" target="_blank" rel="noopener"><strong>Vigilante</strong></a>, ¿te suena?, es un maravilloso plugin de seguridad para WordPress, que te deja activar HTTPS y HSTS desde el propio panel de administración, y trae un análisis que <strong>avisa si el certificado está a punto de caducar o si faltan cabeceras de seguridad</strong> importantes.</p>
<p>No es la única forma de hacerlo, hay otros plugins de seguridad que cubren parte de esto. Pero si prefieres tenerlo controlado desde dentro de WordPress, en vez de depender de acordarte de entrar en el panel de Cloudflare de vez en cuando, <strong>ahí tienes una forma de que te avise tu propia web antes que un desconocido</strong>.</p>
<p>La decisión de qué hacer con el próximo correo de este tipo que te llegue es tuya. Si mantienes webs de clientes, guárdate esta tabla, porque te va a servir más de una vez.</p>
<p>Para todo lo demás, incluida tu propia colección de correos de este estilo, me tienes ahí abajo, en la sección de comentarios.</p>
<p>Ojalá al próximo «Security Research Team» que te escriba se le note el chasco.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/beg-bounty/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Parches urgentes, Elementor y WP Rocket en apuros, y dónde va tu código en WordPress – #CrónicasWordPress #DoctorWordPress</title>
		<link>https://ayudawp.com/parches-urgentes-elementor-y-wp-rocket-en-apuros-y-donde-va-tu-codigo-en-wordpress-cronicaswordpress-doctorwordpress/</link>
					<comments>https://ayudawp.com/parches-urgentes-elementor-y-wp-rocket-en-apuros-y-donde-va-tu-codigo-en-wordpress-cronicaswordpress-doctorwordpress/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Fri, 04 Sep 2026 18:54:32 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[#CrónicasWordPress]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160306</guid>

					<description><![CDATA[Esta semana han sido dos sesiones muy distintas, el lunes, actualidad a saco con las #CrónicasWordPress, y el miércoles, truco práctico en el #DoctorWordPress.]]></description>
										<content:encoded><![CDATA[<p>Ya estamos de vuelta, y después del parón de verano retomamos los directos, y te aviso desde ya de que WordPress no ha descansado ni un día en agosto (ojalá, oye).</p>
<p>Esta semana han sido dos sesiones muy distintas, el lunes, actualidad a saco con las <strong>#CrónicasWordPress</strong>, y el miércoles, truco práctico en el <strong>#DoctorWordPress</strong>.</p>
<p>Te resumo lo que dimos en cada una y te dejo el vídeo al final por si te lo quieres ver enterito.</p>
<h2>#CrónicasWordPress del lunes: volvemos y con un agosto de infarto en seguridad</h2>
<p>Si tuviera que ponerle título al mes de agosto sería «el mes negro de la seguridad en WordPress», y no exagero. No ha habido semana tranquila, así que arrancamos la crónica por ahí.</p>
<h3>Seguridad: parches, sustos y agujeros por todas partes</h3>
<p>Lo que se movió en agosto en materia de seguridad da para no dormir tranquilo:</p>
<ul>
<li><strong>Dos parches de seguridad del núcleo en menos de una semana:</strong> WordPress lanzó la 7.0.3 y, casi seguida, la 7.0.4. Cuando el core saca dos correcciones tan pegadas, mala señal.</li>
<li><strong>Ataque a la cadena de suministro de BdThemes:</strong> les envenenaron la API, con lo que eso implica para todas las webs que confían en sus productos.</li>
<li><strong>Forminator, subida de archivos arbitraria:</strong> un fallo que dejó expuestos más de 600.000 sitios. Casi nada.</li>
<li><strong>Elementor Pro, fallo crítico:</strong> con riesgo de ejecución remota de código (RCE, que es lo peor que le puede pasar a tu web) en más de 10 millones de instalaciones.</li>
<li><strong>Cierre de mes por todo lo alto:</strong> cinco fallos críticos de golpe en WPMU DEV, Avada, TranslatePress, Pods y GiveWP.</li>
<li><strong>El mes negro de WP Rocket:</strong> alerta de seguridad y, de propina, el post-mortem de la caída relacionada con WordPress 7.1.</li>
</ul>
<p>Y como el propio proyecto ha visto que esto se le va de las manos, WordPress.org ha puesto en marcha la <a href="https://make.wordpress.org/security/2026/08/28/the-core-security-initiative/" target="_blank" rel="noopener">«core security initiative»</a> para ordenar el aluvión de reportes de seguridad que le están llegando, muchos de ellos impulsados por IA.</p>
<p>La lectura práctica de todo esto no es asustarse, que el marketing del miedo ya vende bastante sin mi ayuda. <strong>Lo suyo es tener la seguridad en piloto automático</strong>, con actualizaciones al día, copias de seguridad de verdad y algo que vigile por ti, y de eso justamente hablé en <a href="https://ayudawp.com/seguridad-wordpress-piloto-automatico/" target="_blank" rel="noopener">este artículo sobre poner tu seguridad WordPress en piloto automático</a>.</p>
<h3>Proyecto y comunidad: Mullenweg, otra vez en el centro</h3>
<p>En el frente del proyecto y la comunidad tuvimos tema para rato:</p>
<ul>
<li><strong>WordPress 7.1 «Mary Lou» ya es oficial</strong>, con los llamados «Piplets» y el resumen de la <a href="https://es.wordpress.org/2026/08/20/wordpress-7-1-mary-lou/" target="_blank" rel="noopener">WordCamp US 2026</a> de fondo.</li>
<li><strong>La extensión oficial de WordPress para el navegador</strong> ya está disponible, así que puedes <a href="https://es.wordpress.org/2026/08/15/aqui-tienes-la-extension-oficial-de-wordpress-para-tu-navegador/" target="_blank" rel="noopener">instalártela y cacharrear</a>.</li>
<li><strong>Matt Mullenweg volvió a dar que hablar, y por partida doble.</strong> Por un lado con el equipo de accesibilidad, al que le dice que se ha extralimitado en sus funciones y le deja la iniciativa aparcada (aunque el equipo no se rinde y sigue con la documentación y con el plugin Accessibility Lab). Y por otro, <a href="https://ma.tt/2026/08/our-core-division/" target="_blank" rel="noopener">dividiendo a la comunidad entre «blogueros» y «constructores»</a> en un artículo suyo que no dejó a nadie indiferente.</li>
<li><strong>Automattic responde a WP Engine</strong> con un escueto «Wrong again», que la novela por entregas sigue.</li>
<li><strong>Nuevo panel de WordPress Credits</strong> para ver quién contribuye de verdad al proyecto.</li>
<li><strong>WP Agency Forum, segunda edición el 7 de octubre</strong>, apúntatelo si te dedicas a esto de las webs de clientes: <a href="https://wpagencyforum.com/" target="_blank" rel="noopener">wpagencyforum.com</a>.</li>
</ul>
<h3>Desarrollo: novedades, una Secrets API y transparencia con la IA</h3>
<p>Para quien programa (o programa <em>cosas</em>, como yo), agosto también dejó cosillas:</p>
<ul>
<li>El repaso de <strong>novedades para desarrolladores de agosto</strong>.</li>
<li>La <strong>propuesta de una Secrets API para WordPress 7.2</strong>, para dejar de tener claves y contraseñas donde no deberían estar.</li>
<li>El <strong>plugin oficial de IA de WordPress llega a la versión 1.3.0</strong>.</li>
<li>El <strong>equipo de Hosting aprueba una política de transparencia obligatoria sobre el uso de IA</strong>, que ya iba tocando saber qué te instalan y qué hace la IA en tu hosting.</li>
<li>La <strong>auditoría de instalaciones activas</strong> del directorio de WordPress.org y el resumen del chat de rendimiento, para los más cacharreros.</li>
</ul>
<h3>IA y SEO: Google agita el árbol otra vez</h3>
<p>Y cerramos con el bloque que más quebraderos de cabeza da últimamente:</p>
<ul>
<li>La <strong>actualización de spam de Google de agosto</strong> ha pegado más fuerte de lo habitual en los rankings, así que si has notado un bajón, no eres el único.</li>
<li>Las <strong>citas de Reddit en las búsquedas de ChatGPT se han desplomado un 86%</strong>, para que veas lo rápido que cambian las reglas del juego.</li>
<li>Google estrena el <strong>botón de «fuentes preferidas»</strong> para echar un cable a los editores frente a la pérdida de tráfico por la IA, y te conté cómo aprovecharlo en <a href="https://ayudawp.com/fuentes-preferidas-google/" target="_blank" rel="noopener">esta guía sobre las fuentes preferidas de Google</a>.</li>
<li>Y los <strong>AI Overviews cambian de comportamiento</strong>, con interfaz generativa y expansión automática, que esto no para.</li>
</ul>
<p>Un apunte personal fuera de WordPress, que también lo comenté: se despide «Un billete a Chattanooga» después de siete años. Una pena, la verdad.</p>
<p>Tienes toda la crónica, con opinión y comentarios en directo, en el vídeo completo:</p>
<p><a href="https://www.youtube.com/watch?v=fAJ7QDjEQWQ" target="_blank" rel="noopener">Ver las #CrónicasWordPress del lunes en YouTube</a></p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="#CrónicasWordPress - Noticias, opinión sobre WordPress con Fernando Tellado" width="1600" height="900" src="https://www.youtube.com/embed/fAJ7QDjEQWQ?feature=oembed&amp;enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<h2>#DoctorWordPress del miércoles: ¿cuál es la mejor forma de añadir código o snippets en WordPress?</h2>
<p>Seguro que te ha pasado: lees un tutorial (a lo mejor uno mío) que te dice «añade este código a tu WordPress» y te quedas con la misma cara de siempre, ¿pero dónde lo meto yo esto? Pues de eso fue el directo del miércoles. Vimos <strong>cuatro maneras distintas de añadir fragmentos o snippets de código</strong>, cada una con sus pros y sus contras.</p>
<ul>
<li><strong>Plugin MU (must-use):</strong> se cargan siempre y no se pueden desactivar desde el escritorio, así que van de perlas para código que no quieres que nadie toque por error.</li>
<li><strong>Plugin personalizado:</strong> tu propio plugin de snippets, que activas y desactivas cuando quieras y te llevas de una web a otra sin despeinarte.</li>
<li><strong>Archivo functions.php del tema activo:</strong> lo más rápido y lo que todo el mundo usa al principio, pero ojo, que el código queda atado al tema. El día que cambies de tema o te llegue una actualización, adiós a tus apaños. Es como escribir la lista de la compra en la pizarra de la cocina y luego cambiar la cocina entera.</li>
<li><strong>Plugin de fragmentos tipo Code Snippets:</strong> con su interfaz y sin tocar ni un archivo, ideal si no te manejas con el FTP ni con el editor de código.</li>
</ul>
<p>¿Que cuál es el mejor? Pues, como casi todo en WordPress, <strong>depende de para qué y de lo mañoso que seas</strong>. Para la mayoría, un plugin de snippets o un mu-plugin te quitan más de un susto; el functions.php déjalo para cuando sepas bien lo que haces y el tema sea tuyo de verdad. Y como cada miércoles, después me quedé respondiendo en directo vuestras dudas sobre WordPress, SEO, IA y casi de todo.</p>
<p>Tienes el truco completo, paso a paso, en el vídeo:</p>
<p><a href="https://www.youtube.com/watch?v=PevsmUIU0Gk" target="_blank" rel="noopener">Ver el #DoctorWordPress del miércoles en YouTube</a></p>
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="¿Cuál es el mejor método para añadir códigos o snippets en WordPress? ¿mu plugin, functions…?" width="1600" height="900" src="https://www.youtube.com/embed/PevsmUIU0Gk?feature=oembed&amp;enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<h2>Nos vemos en el próximo directo</h2>
<p>Y hasta aquí la semana. Te recuerdo que hago directo dos veces por semana, los <strong>lunes las #CrónicasWordPress</strong> con la actualidad, la opinión y el debate, y los <strong>miércoles el #DoctorWordPress</strong> con un truco y vuestras preguntas, a partir de las 19:30, en el <a href="https://www.youtube.com/@AyudaWPes">canal de Ayuda WordPress</a>. Si te suscribes y le das a la campanita, no se te escapará ninguno. Si te pasas cuando estoy en directo puedes preguntar lo que quieras, que para eso está.</p>
<p>¿Te ha tocado de cerca alguno de estos líos de seguridad? ¿tienes tema para la próxima crónica o una duda para el doctor? Me tienes ahí abajo, en los comentarios. Nos vemos en el próximo directo.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/parches-urgentes-elementor-y-wp-rocket-en-apuros-y-donde-va-tu-codigo-en-wordpress-cronicaswordpress-doctorwordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Error 404 en el sitemap XML nativo de WordPress</title>
		<link>https://ayudawp.com/404-wp-sitemap-xml/</link>
					<comments>https://ayudawp.com/404-wp-sitemap-xml/#respond</comments>
		
		<dc:creator><![CDATA[Fernando Tellado]]></dc:creator>
		<pubDate>Thu, 03 Sep 2026 06:28:04 +0000</pubDate>
				<category><![CDATA[SEO / AEO / GEO / AIO]]></category>
		<category><![CDATA[Tutoriales - Trucos]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[WordPress.org]]></category>
		<category><![CDATA[Avanzado]]></category>
		<category><![CDATA[Experto]]></category>
		<category><![CDATA[Sitemap]]></category>
		<category><![CDATA[Visibility]]></category>
		<guid isPermaLink="false">https://ayudawp.com/?p=160177</guid>

					<description><![CDATA[Si tu web no tiene ninguna entrada publicada y usas el mapa nativo de WordPress le está contestando a Google y cualquier bot con un error 404.]]></description>
										<content:encoded><![CDATA[<p>Si tu web no tiene ninguna una entrada publicada y <strong>usas el mapa nativo de WordPress</strong> (<code>wp-sitemap.xml</code>), deberías saber que le <strong>está contestando a Google y cualquier bot con un error 404</strong> aunque veas el XML y, aparentemente, salga entero y perfecto.</p>
<pre>curl -I https://ejemplo.com/wp-sitemap.xml<code></code></pre>
<p>Si en la primera línea sale un <code>404</code> y el <code>content-type</code> dice <code>application/xml</code>, bienvenido al club, y si te sale un 403 no cantes victoria, que te ha contestado tu cortafuegos y no WordPress, un par de secciones más abajo te cuento cómo salir de esa.</p>
<p><strong>Le pasa a tiendas, campus, webs de servicios, porfolios y a cualquier web sin blog</strong>, que son muchísimas y son justo las que menos lo van a notar, porque no hay ni un síntoma a la vista.</p>
<p>La web funciona igual de bien, el mapa del sitio se ve de maravilla en el navegador y <strong>los únicos avisos los tienes si añades el mapa del sitio a la Google Search Console o lo revisas</strong> un día por yo que sé, que te mostrará el error, y también <strong>lo verías si te da por mirar en la consola del navegador para buscar errores</strong>, eso que nunca haces salvo que aparezca rota la web.</p>
<p>Y esto no venía de serie, <strong>es nuevo desde WordPress 7.1, publicada el 19 de agosto de 2026</strong>, o sea que si actualizaste esta semana y tu web no tiene blog te lo has llevado puesto sin enterarte. En las versiones anteriores el mismo mapa del sitio se entregaba con código de estado normal, o sea, 200.</p>
<p>Además, <strong>el problema es más gordo</strong>, porque wwwwwwno se queda solo en el índice de mapas, <strong>los submapas de páginas, de productos, de categorías y de usuarios salen con código de estado de error 404 también</strong>, cada uno con todas sus URLs dentro, así que a esa web no le queda ni un mapa del sitio aprovechable.</p>
<p>Vamos a verlo deeespacito, primero si te toca y cómo salir del paso, y luego, para el que quiera, analizaremos la chicha, veremos qué se rompió en las tripas de WordPress.</p>
<h2>Si usas plugins SEO que generan sus propios mapas del sitio XML no hace falta que sigas leyendo (salvo para aprender)</h2>
<p><strong>Los plugins de SEO grandes sirven un mapa del sitio propio, con su propia ruta distinta de la del mapa nativo, y mandan su cabecera 200 forzada </strong>, así que este asunto no les afecta.</p>
<p>Yoast y Rank Math (casualidad) usan <code>sitemap_index.xml</code>, AIOSEO crea un <code>sitemap.xml</code> y SEOPress <code>sitemaps.xml</code>, <strong>ninguno de estos aprovecha el mapa del sitio nativo que ya existe, y en este caso juega a su favor</strong>.</p>
<p>De hecho, si tienes uno de esos activo y visitas <code>wp-sitemap.xml</code> te vas a encontrar <strong>un 404 de verdad, de página no encontrada</strong>, al filtrar <code>wp_sitemaps_enabled</code> a <code>false</code> su código desactiva el sitemap nativo pero deja las reglas puestas precisamente para poder contestar ese 404. Ahí no hay nada roto, aunque tampoco es buena práctica, pero <a href="https://ayudawp.com/mapas-del-sitio-xml-wordpress/" target="_blank" rel="noopener">eso ya lo hemos comentado</a>.</p>
<p>Ahora, <strong>si lo que usas es algo que utiliza el mapa del sitio nativo</strong> en lugar de montar el suyo, <strong>heredas el fallo entero</strong>, porque el sitemap que se sirve es el del core de WordPress con sus filtros y todo lo que lleva por defecto.</p>
<p>Es el caso de mi plugin de SEO, <a href="https://es.wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="nofollow noopener">Visibility</a>, que trabaja así a propósito, y por eso <strong>desde la versión 2.4.0 trae entre sus novedades el blindaje del estado del sitemap, y así mapa del sitio se entrega con código de estado 200 aunque la web no tenga ni una entrada publicada</strong>, y tú no tienes que tocar nada. Por ahi sin problema, sin 404 de ningún tipo, todo perfecto, ¿o lo dudabas?</p>
<p>Cualquier otro plugin que personalice el nativo en vez de sustituirlo te vale el arreglo que te cuento más abajo.</p>
<h2>Cómo saber si mi sitemap XML da error 404</h2>
<p>Lo primero que tienes que asumir es que <strong>el navegador te miente en esto</strong>. Abres la URL, ves el XML con su hoja de estilos y sus enlaces, todo precioso, y del código de estado no te dice ni mu, salvo que investigues, claro.</p>
<p><a href="https://ayudawp.com/?attachment_id=160180" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160180 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-no-posts-404-1200x633.jpg" alt="" width="1200" height="633" srcset="https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-no-posts-404-1200x633.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-no-posts-404-768x405.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-no-posts-404-1536x810.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-no-posts-404.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>El que sí te lo muestra enseguida es Google, que cuando se <strong>encuentra un error 4xx al procesar el mapa del sitio</strong> <a href="https://support.google.com/webmasters/answer/7451001?hl=es" target="_blank" rel="nofollow noopener">te muestra el código recibido</a> y no hay dudas.</p>
<p>Hay que mirar la cabecera de la respuesta, y de las tres formas de hacerlo la que nunca falla es la del navegador:</p>
<ul>
<li>Abre las <strong>herramientas de desarrollo</strong> con F12 y mira la pestaña <strong>Red</strong>, o directamente la <strong>consola</strong>, que te canta el 404 del documento en cuanto cargas la URL. El navegador supera cualquier protección antibots que tengas delante, así que lo que ves ahí es lo que hay.</li>
<li>En <strong>Google Search Console</strong>, añadiendo o viendo el informe de <strong>Sitemaps</strong>, que es donde lo vas a ver sin duda posible porque te lo cuenta el propio Google.</li>
<li>Con <code>curl -I https://ejemplo.com/wp-sitemap.xml</code>, que es lo más rápido si la web no tiene cortafuegos delante. Ojo con esto, que lo explico ahora mismo.</li>
</ul>
<p>En Search Console el aviso es <strong>«No se ha podido leer el sitemap»</strong>, con un <strong>«Error general de HTTP»</strong> y, desplegando, el <strong>«Error HTTP: 404»</strong>.</p>
<p><a href="https://ayudawp.com/?attachment_id=160181" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160181 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/error-404-sitemap-google-search-console-1200x678.jpg" alt="" width="1200" height="678" srcset="https://ayudawp.com/wp-content/uploads/2026/09/error-404-sitemap-google-search-console-1200x678.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/error-404-sitemap-google-search-console-768x434.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/error-404-sitemap-google-search-console-1536x867.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/error-404-sitemap-google-search-console.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>Fíjate en el resto de la ficha, que es lo que le da la puntilla, <strong>las páginas descubiertas son cero</strong>.</p>
<p>Y ahí viene lo cruel del asunto, que <strong>el consejo que te da Google te manda a buscar justo donde no está el problema</strong>. Te dice que compruebes que el sitemap se encuentra en la dirección especificada y que no le tengas bloqueado el acceso.</p>
<p>Pues está en su dirección, se ve perfectamente y no está bloqueado. Con esas dos pistas te puedes tirar la tarde revisando el <code>robots.txt</code>, las reglas del cortafuegos y los permisos, sin encontrar nada, porque <strong>lo que falla es el código de estado</strong> y de eso no hay pistas visibles.</p>
<p><strong>El <code>curl</code> desde tu ordenador se lo va a tragar el cortafuegos en la mitad de las webs decentes.</strong> Si tienes Cloudflare, el WAF del hosting o un plugin de seguridad con protección antibots, la petición ni llega a WordPress y te contesta la capa de delante con un 403, un 202 o un 503, siempre en <code>text/html</code>.</p>
<p>Yo mismo me he llevado un 403 en la primera prueba y he tardado un minuto en caer en la cuenta.</p>
<p>Si tienes acceso a la terminal del servidor puedes saltarte a Cloudflare pidiéndoselo al origen directamente, con la cabecera <code>Host</code> puesta a mano:</p>
<pre><code>curl -skI https://127.0.0.1/wp-sitemap.xml -H "Host: midominio.com"</code></pre>
<p>Y ahora el detalle que separa tres problemas que se confunden todo el rato. <strong>Mira el <code>content-type</code> que viene al lado del código de estado</strong>:</p>
<ul>
<li><code>404</code> con <code>content-type: application/xml</code>, es este fallo. El sitemap se ha generado y se está sirviendo, solo que con el cartel de cerrado.</li>
<li><code>404</code> con <code>content-type: text/html</code>, no es esto. Ahí lo que pasa es que las reglas de reescritura no están puestas, la petición ni siquiera llega al sistema de sitemaps y lo que te devuelve es la página de error de tu tema. Se arregla yendo a «<strong>Ajustes &gt; Enlaces permanentes</strong>» y dando a guardar sin tocar nada.</li>
<li><code>403</code>, <code>202</code> o <code>503</code>, no has llegado a WordPress. Te ha contestado la protección antibots y no has comprobado nada, así que repite por el navegador.</li>
</ul>
<p>Una sola cabecera te dice cuál de los tres tienes, y te ahorras el rato (largo).</p>
<p>Si quieres profundizar en los sitemaps que no se ven, salen en blanco o dan errores raros, tengo <a href="https://ayudawp.com/errores-sitemap/" target="_blank" rel="ugc noopener">una guía entera sobre eso</a> que cubre los tres tipos de problema. Pero no vayas ahora, que queda mucho por ver, aprender y sobre todo hay que arreglar este problema.</p>
<h2>Cómo hacer la prueba con una instalación limpia y cero plugins</h2>
<p>Esto no es una sospecha ni una teoría, lo he medido en una instalación recién hecha, sin un solo plugin activo:</p>
<table>
<tbody>
<tr>
<th>Portada</th>
<th>Entradas publicadas</th>
<th>Páginas publicadas</th>
<th>/wp-sitemap.xml</th>
</tr>
<tr>
<td>Blog</td>
<td>1</td>
<td>1</td>
<td>200</td>
</tr>
<tr>
<td>Blog</td>
<td>0</td>
<td>1</td>
<td><strong>404</strong></td>
</tr>
<tr>
<td>Estática</td>
<td>1</td>
<td>1</td>
<td>200</td>
</tr>
<tr>
<td>Estática</td>
<td>0</td>
<td>1</td>
<td><strong>404</strong></td>
</tr>
</tbody>
</table>
<p>Borras la única entrada de una instalación nueva y el sitemap el código de estado es 404 (arriba te cuento como verlo). Publicas una y vuelve a 200.</p>
<p><strong>Da igual el tipo de portada y da igual que tengas cien páginas, mil productos o los cursos del campus publicados</strong>: lo único que cuenta es que exista al menos un <code>post</code>, que no pinta absolutamente nada en el mapa del sitio que se va a servir.</p>
<p>Y hay un dato que parece un detalle y en realidad es la pista que lo explica todo: <code>/wp-sitemap-index.xsl</code>, la hoja de estilos que le da el aspecto bonito al XML, sí devuelve 200 en los dos casos. Guarda el dato que lo vemos enseguida. Apasionante ¿verdad? ¿o triste? Venga, que ya llegamos…</p>
<h3>El error 404 en el sitemap es peor aún de lo que imaginas</h3>
<p>Esto es lo que convierte el asunto en <strong>un problema serio y no en una cosa curiosa del <em>güorpré</em></strong>, lo he probado en una tienda WooCommerce de pruebas sin una sola entrada de blog, con sus productos, sus páginas y sus categorías publicados, y el índice lista sus cuatro sitemaps ahí <em>to guapos</em>: páginas, productos, categorías de producto y usuarios.</p>
<p><strong>Los cuatro muestran todas sus URLs.</strong> El de productos enseña sus veintitrés fichas con sus fechas de modificación, perfectamente formado, y <strong>¡todos con código de estado 404!</strong>.</p>
<p><a href="https://ayudawp.com/?attachment_id=160182" rel="nofollow"><img loading="lazy" decoding="async" class="sombra alignnone wp-image-160182 size-medium" src="https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-products-404-1200x634.jpg" alt="" width="1200" height="634" srcset="https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-products-404-1200x634.jpg 1200w, https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-products-404-768x406.jpg 768w, https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-products-404-1536x811.jpg 1536w, https://ayudawp.com/wp-content/uploads/2026/09/wp-sitemap-xml-products-404.jpg 1920w" sizes="auto, (max-width: 1200px) 100vw, 1200px"></a></p>
<p>O sea, que a una tienda sin blog, que son legión, no tiene <strong>ni una sola URL que Google pueda extraer de sus mapas del sitio</strong>.</p>
<p>Ni las fichas de producto, ni las categorías, ni las páginas. Y todo esto con la tienda funcionando de maravilla, a priori, sin un error en el escritorio de WordPress ni nada que te avise.</p>
<h2>¿Pero qué han roto en WordPress 7.1? Análisis forense…</h2>
<p>El 8 de julio de 2026 entró en el core el <a href="https://core.trac.wordpress.org/changeset/62664" target="_blank" rel="nofollow noopener">changeset 62664</a>, que añade la etiqueta condicional <code>is_sitemap()</code>, un añadido de lo más razonable y que mucha gente llevaba años pidiendo, para poder saber desde un plugin si la petición que estás atendiendo es la de un sitemap.</p>
<p>El propio mensaje del commit lo cuenta, y ahí está la frase del delito, que la marca se activa cuando existe la variable de consulta <code>sitemap</code> y <strong>una petición de mapa del sitio deja de tratarse como la portada</strong>.</p>
<p>Suena inofensivo y no lo es ni de lejos, porque de eso dependía el estado HTTP.</p>
<p>Para empezar, <code>WP::handle_404()</code> se ejecuta antes que <code>template_redirect</code>, o sea antes de que el sistema de sitemaps pinte nada. En una petición de sitemap la consulta principal es la consulta por defecto, la de la portada, que en una web sin entradas no devuelve ni un solo resultado.</p>
<p>Y <code>handle_404()</code> funciona de manera muy simple, si la consulta trae contenido entrega con código 200, si no trae nada mira una lista corta de excepciones, y si no está en ninguna tienes un código 404.</p>
<p>Esa lista de excepciones es <code>is_author()</code>, <code>is_tag()</code>, <code>is_category()</code>, <code>is_tax()</code>, <code>is_post_type_archive()</code>, <code>is_home()</code>, <code>is_search()</code> e <code>is_feed()</code>.</p>
<p><strong>Lo único que salvaba al sitemap era <code>is_home()</code></strong>, por pura chiripa, porque una petición de sitemap se consideraba portada. Al dejar de considerarse portada se quitó el salvavidas, y en <code>handle_404()</code> no hay excepción para <code>is_sitemap()</code>, ni en la 7.1 ni inicialmente en el trunk (desarrollo) de la 7.2.</p>
<p>Medido por dentro, con el filtro <code>pre_handle_404</code>:</p>
<pre>sin entradas:  is_404=false is_home=false is_singular=false is_archive=false is_feed=false is_paged=false posts=0  -&gt; 404
con 1 entrada: is_404=false is_home=false is_singular=false is_archive=false is_feed=false is_paged=false posts=1  -&gt; 200</pre>
<p>Todas las excepciones en <code>false</code>, <code>is_home()</code> la primera. Lo único que cambia entre las dos líneas es que <code>$wp_query-&gt;posts</code> traiga algo, y esas entradas no tienen nada que ver con el sitemap.</p>
<p>Después, ya en <code>template_redirect</code>, <code>WP_Sitemaps::render_sitemaps()</code> pinta el XML y hace <code>exit</code> sin llamar nunca a <code>status_header( 200 )</code>, así que sale con el estado que se puso antes.</p>
<p>Y aquí encaja la pieza que te dije que ponía esto aún más apasionante, porque aa hoja de estilos se salva porque su variable de consulta es <code>sitemap-stylesheet</code>, no <code>sitemap</code>, así que <code>is_sitemap</code> no se activa, la petición sigue considerándose portada y contesta 200.</p>
<p>El fallo y la excepción salen del mismo sitio, que es lo que confirma que el diagnóstico es ese y no otro. Quedarse sin contenido no es lo mismo que no existir, y un mapa del sitio con páginas dentro existe aunque no haya un solo artículo en la web.</p>
<h2>Cómo arreglar el problema con solo nueve líneas</h2>
<p>Mientras esto se corrige en el core, se soluciona forzando el 200 solo en las peticiones de sitemap. Crea un archivo, llámalo <code>ayudawp-sitemap-200.php</code>, y súbelo por FTP o por el gestor de archivos de tu hosting a la carpeta <code>wp-content/mu-plugins/</code>. Si esa carpeta no existe la creas tú, WordPress la carga sola.</p>
<p>Lo pongo ahí y no en el <code>functions.php</code> del tema a propósito, porque así sobrevive a un cambio de tema y no se te queda un sitemap roto el día que decidas rediseñar:</p>
<pre>&lt;?php
/**
 * Plugin Name: Corregir el mapa del sitio nativo: de 404 a 200.
 * Plugin URI: https://plugins.ayudawp.com
 * Description: Fuerza código de estado 200 en peticiones del mapa del sitio nativo, en vez de 404. Borra este plugin cuando salga el arreglo nativo en WordPress.
 * Version: 1.0.0
 * Author: Fernando Tellado
 * Author URI: https://tellado.es
 * License: GPL2
 */

// Forzamos estado 200 dejando el resto como 404
function ayudawp_sitemap_force_200_status( $preempt, $wp_query ) {

$is_sitemap_request = get_query_var( 'sitemap' ) || get_query_var( 'sitemap-stylesheet' );

// Si no es petición al sitemap dejar que WordPress decida el estado
if ( ! $is_sitemap_request ) {
return $preempt;
}

$wp_query-&gt;is_404 = false;
status_header( 200 );

// Devuelve true para parar WP::handle_404() y guarda el estado de arriba
return true;
}
add_filter( 'pre_handle_404', 'ayudawp_sitemap_force_200_status', 10, 2 );</pre>
<p>Súbelo, vuelve a pasarle el <code>curl -I</code> que vimos antes y deberías ver ya el código de estado 200. Sin caché que purgar ni enlaces permanentes que guardar, porque esto no toca las reglas de <code>rewrite</code>.</p>
<h3>¡Que nooo, que este código no rompe nada!</h3>
<p><strong>Los 404 legítimos siguen intactos</strong>, que es lo que te tiene que importar antes de meter esto en una web de cliente. En una web sin entradas, <code>/wp-sitemap-posts-post-1.xml</code> sigue devolviendo 404, y es lo correcto, porque ese sitemap está vacío de verdad.</p>
<p>Lo fuerza el propio core, en <code>render_sitemaps()</code>, después de que nuestro filtro haya pasado. Lo mismo pasa con el 404 de cuando tienes los mapas del sitio desactivados por otro plugin de SEO.</p>
<p>El filtro <strong>solo actúa donde hay una variable de consulta del sitemap</strong>, y devuelve el control a WordPress en cualquier otra petición.</p>
<p><strong>De regalo arregla de paso los sitemaps paginados que se iban a 404 cuando el número de página superaba al de páginas del blog</strong>, que es otro caso viejo del mismo mecanismo.</p>
<blockquote><p>Nota: como ya habrás imaginado, una versión refinada y más sólida de este ajuste (opcional, porque no le pasa a todas las webs) está implementado en el plugin <a href="https://visibility.quest/" target="_blank" rel="noopener">Visibility</a></p></blockquote>
<h2>Con los feeds pasó exactamente lo mismo en 2017</h2>
<p>Esto, como casi todo, ya lo hemos vivido, y con el mismo desenlace, pues en WordPress 4.7 entró un cambio para que las URLs no válidas de feeds dejaran de generar RSS, y de rebote los feeds válidos pero vacíos empezaron a devolver 404.</p>
<p>Se avisó en el <a href="https://core.trac.wordpress.org/ticket/39157" target="_blank" rel="nofollow noopener">ticket 39157</a>, se aceptó como fallo y se corrigió en la 4.7.3 revirtiendo el trozo de código que lo causaba. Lo he comprobado versión a versión, el bloque está en la 4.7.2 y ya no está en la 4.7.3.</p>
<p>O sea que el criterio ya está ahí desde hace nueve años. Lo que hay que decidir ahora es dónde se pone el parche esta vez, si en <code>handle_404()</code> con una excepción para <code>is_sitemap()</code>, que es el equivalente exacto de lo que hay para los feeds, o en <code>render_sitemaps()</code> mandando el 200 antes de pintar el XML, pero eso ya no es decision mía, yo he avisado (mira más abajo), y te ofrezco soluciones.</p>
<h2>El estado en Trac ahora mismo</h2>
<p>Hay dos tickets abiertos en el componente de sitemaps que te interesan:</p>
<ul>
<li>El <a href="https://core.trac.wordpress.org/ticket/65936" target="_blank" rel="nofollow noopener">65936</a>, anterior al mío, sobre sitemaps del core servidos con estado 404. Va con parche y está marcado para la 7.1.1, así que la corrección tiene pinta de estar en camino.</li>
<li>El <a href="https://core.trac.wordpress.org/ticket/65945" target="_blank" rel="nofollow noopener">65945</a>, que he abierto yo mismo con este caso concreto, el de las webs sin entradas publicadas, los datos de la tabla de arriba y la medición del párrafo anterior. Ya se ha contemplado incluir este arreglo en WordPress 7.2.</li>
</ul>
<p>Por debajo de los dos está el <a href="https://core.trac.wordpress.org/ticket/51117" target="_blank" rel="nofollow noopener">51117</a>, abierto desde 2020, que es la raíz de todo el asunto: las peticiones de sitemap ejecutan la consulta principal de la portada, que es una consulta que no se va a usar para nada y que además decide el estado HTTP de una página que no tiene nada que ver con ella.</p>
<p>El changeset de la 7.1 lo cita como referencia, pero mientras eso siga así vamos a seguir teniendo sorpresas de este tipo cada vez que alguien toque una condición.</p>
<p>Un apunte que debes saber es que <code>is_sitemap()</code> es una etiqueta condicional nueva que cambia el comportamiento de <code>is_home()</code> en una petición del core, y <strong>no tiene nota de desarrollo</strong>, no aparece por ninguna parte en la guía de campo de la 7.1.</p>
<p>Un cambio que altera un condicional que usan miles de plugins merecía su párrafo, o en mi cabeza es lo que me parece lógico, pero vaya, será que soy raro o algo.</p>
<h2>¿Me afecta?</h2>
<p>Si mantienes webs de clientes, y sobre todo si mantienes tiendas o webs corporativas sin blog, pásale el <code>curl -I</code> que vimos antes a las que ya tengan la versión 7.1 o superior antes de que Googlebot pase otra vez.</p>
<p>Si tienes muchas y quieres salir del paso rápido, mete el mu-plugin en las que te den 404 con XML dentro y reenvía el sitemap desde Search Console para que Google lo vuelva a leer sin esperar a su ritmo.</p>
<p>Si andas con ganas de cacharrear, en el <a href="https://ayudawp.com/mapas-del-sitio-xml-wordpress/" target="_blank" rel="ugc noopener">artículo sobre cómo personalizar el mapa del sitio XML nativo</a> tienes los filtros para quitar tipos de contenido, taxonomías y usuarios del sitemap, que combinan perfectamente con el arreglo de arriba, y por supuesto, no me cansaré de animarte a darle una oportunidad al mejor plugin de SEO del mundo mundial, nacido de mi (extraña) necesidad de tener un buen plugin de SEO, todo gratuito, y adaptado a las nuevas funcionalidades y cambios de rastreo por bots e IAs. Se llama <a href="https://es.wordpress.org/plugins/native-aeo-pack/" target="_blank" rel="noopener">Visibility</a>, facilito.</p>
<p>Y si lo compruebas y te sale 404 con el XML dentro, cuéntamelo abajo en los comentarios con la versión de WordPress y si tu web tiene blog o no, que cuantos más casos reunamos más fácil es que esto se arregle cuanto antes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ayudawp.com/404-wp-sitemap-xml/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>