Retenido
Tu plugin de WordPress está retenido: qué significa realmente cada motivo de rechazo
El correo del equipo de revisión es corto y vago a propósito. Esto es lo que significa realmente cada motivo, qué lo dispara y qué desbloquea de verdad.
Enviaste un plugin a wordpress.org. Dos semanas después llega un correo de plugins@wordpress.org diciendo que tu plugin ha sido retenido por los siguientes motivos, seguido de tres o cuatro párrafos cortos que parecen explicarse solos y no lo hacen.
He recibido ese correo. Dos veces, con el mismo plugin, por dos motivos distintos. Lo que sigue es lo que significa realmente cada motivo, incluidos los dos errores que pagué con semanas de espera.
No los persigas
Su correo lo dice, y es cierto: las peticiones de estado ralentizan la cola. La revisión tarda de una a seis semanas. No hay vía rápida.
No discutas
El equipo de revisión no es un soporte con el que negociar. Cada minuto explicando por qué tu caso es distinto es un minuto que no dedicas a corregir.
Pega el correo que has recibido.
El equipo de revisión escribe en inglés sea cual sea tu idioma. Pega su mensaje y esta página te dice a cuál de los siete motivos te enfrentas realmente — y qué espera cada uno de ti.
Todo ocurre en tu navegador. No se envía nada a ninguna parte, no se guarda nada, no hay ningún servidor detrás.
Primero, cómo funciona realmente la revisión
- 01
Revisan todo de nuevo
No comparan tu reenvío con la versión anterior. Un problema que no mencionaron la primera vez puede salir en la segunda pasada, y un changelog detallado en tu respuesta es esfuerzo perdido.
- 02
Leen el código fuente
No solo el readme ni las cabeceras. Mover una comprobación a un sitio menos visible o renombrar una función no funciona, y convierte una objeción técnica en un problema de confianza.
- 03
Su correo es escueto a propósito
Gestionan una cola enorme con voluntarios. Cada frase pesa: relee su correo como una pasada aparte, frase por frase, cuando creas haber terminado.
Los siete motivos
Elige el que coincida con tu correo. Cada tarjeta lleva a qué lo dispara y a qué pasa la revisión.
Guideline 5, el «trialware»
Un plugin no puede limitar funcionalidades que se ejecutan enteramente en la instalación del usuario.
Qué lo dispara
- Una funcionalidad que se ejecuta enteramente en el servidor del usuario, limitada artificialmente, con un plan de pago para desbloquearla
- El caso de manual: un modo «usa tu propia clave de API» limitado a N usos al mes — el usuario pone la clave, el usuario paga al proveedor, el cálculo no te cuesta nada
- Fíjate en lo que no es el problema: cobrar está permitido, tener una versión Pro está permitido
Qué pasa la revisión
- Quitar el límite de todo lo que se ejecuta en local
- Mover la funcionalidad al servidor, a tu coste — entonces el límite refleja un gasto real, y la Guideline 6 lo permite explícitamente
- Vender soporte, actualizaciones o un servicio alojado — cualquier cosa salvo desbloquear código que ya se ejecuta en la máquina del usuario
Lo que funcionó de verdad, y me sorprendió
Mi primera corrección mantenía el modo local quitándole el límite, junto a un nuevo servicio gestionado. Cumplía. También era frágil de explicar, porque obligaba al revisor a evaluar dos caminos de código y a creerme sobre a cuál se aplicaba el precio.
La versión que pasó eliminaba por completo el modo local. Si no hay código local, la Guideline 5 no aplica en absoluto. Una posición de cumplimiento sencilla vale más que una defendible.
Orden de magnitud: esto no es un parche. Para mí supuso eliminar un modo entero, montar un Cloudflare Worker con mi propia clave de API, conectar webhooks de licencia con validación de firma, añadir cuotas por instalación y reescribir toda la cadena de generación. Saber la respuesta me llevó una hora. Entregarla, días.
Colisión de nombre y marca
no solo en el nombre — incluye … las URLs de este plugin
Qué lo dispara
- El nombre mostrado, el slug, el text domain, el Plugin URI, cada enlace de tu interfaz de administración, el readme, el usuario contribuidor y el propio dominio
- Un conflicto fuera de WordPress: proyectos tecnológicos sin relación, GitHub, npm, productos SaaS, registros de marcas
- Un nombre de sustitución que no es demostrablemente tuyo — el permiso del otro propietario no resuelve nada
Qué pasa la revisión
- Un nombre puramente descriptivo no puede chocar con la marca de nadie
- Lo más seguro: tomar la mitad descriptiva del nombre que ellos mismos sugieren y quitar el identificador — lo escribieron ellos, difícilmente lo llamarán engañoso
- Pon tu alternativa en el mismo correo, o compras otro viaje de ida y vuelta de una a seis semanas
- Comprobar si un slug está libre: api.wordpress.org/plugins/info/1.2/?action=plugin_information&request[slug]=TU-SLUG devuelve «Plugin not found.» cuando está disponible
Tres renombrados que sobrevivieron a un grep que di por limpio
El nombre partido por una etiqueta HTML. El logo de mi sitio se escribía Plug<span class="dot">Forge</span>. Ninguna búsqueda del nombre completo encuentra eso, y era el elemento más visible de cada página.
Un slug todavía más antiguo. Decenas de enlaces seguían apuntando al primer nombre del plugin, abandonado dos renombrados antes, incluido el botón principal. Busca todos los nombres muertos, no solo el último.
Lo que sale por la red. Un worker en segundo plano enviaba el nombre antiguo en su User-Agent a cada sitio de terceros que visitaba. Invisible en pantalla, completamente real para los servidores que lo recibían.
La línea Contributors
Qué lo dispara
- El titular de la cuenta de wordpress.org que envía el plugin no aparece en la línea Contributors: del readme
- Se pasa por alto a menudo precisamente porque la línea ya existe con otros nombres — el autor de un framework, un SDK de facturación — y por eso no parece vacía
Qué pasa la revisión
- Añade el usuario de la cuenta que envía a Contributors:
- Si además resuelves un problema de marca, revisa esa línea: un usuario contribuidor construido sobre el nombre rechazado contradice todo el renombrado
Plugin URI roto
Qué lo dispara
- La URL devuelve un 404 — corrección técnica
- La URL sigue conteniendo el nombre en conflicto — eso es un problema de marca, ver el motivo 02
- La URL apunta a la portada de tu agencia en lugar de a este plugin concretamente
Qué pasa la revisión
- Verifícala en vivo, no en el archivo: una URL corregida en tu código pero nunca desplegada sigue siendo un rechazo
- Antes de responder, abre de verdad cada URL que contenga tu envío
Servicios externos sin documentar
Qué lo dispara
- Una llamada saliente no documentada en una sección External Services del readme: qué se envía, cuándo y a qué proveedor
- Una descripción que ya no coincide con el código enviado — peor que ninguna descripción, porque se lee como ocultación y no como descuido
Qué pasa la revisión
- Escribe esa sección la última, cuando tu arquitectura haya dejado de moverse
- Comprueba que la política de privacidad que enlazas ahí dice lo mismo
- Nombra cada endpoint que el plugin llama realmente, en el dominio que llama realmente
La que casi se me cuela
Mi política de privacidad seguía diciendo que el plugin enviaba la URL de una imagen mucho después de que el código hubiera pasado a enviar la imagen misma. Dos documentos oficiales que se contradicen sobre lo que sale del servidor del usuario es exactamente el tipo de discrepancia que esta sección existe para cazar. Lo encontré una hora antes de reenviar, en una última pasada, con todo lo demás ya dado por limpio.
Un secreto enviado en el ZIP público
Qué lo dispara
- Algunos SDK de licencias escriben un secreto en texto plano en tu archivo principal — el código generado a veces lo dice, en un comentario
- Un ZIP montado a mano en lugar de con la herramienta de compilación del SDK, que quita el secreto automáticamente
Qué pasa la revisión
- Si montas tu propio archivo, descomprímelo y haz un grep antes de subirlo
- Diez segundos de comprobación frente a un fallo irreversible una vez publicado
«Esta categoría está saturada»
Qué lo dispara
- Un comentario sobre la saturación de tu categoría — no es un punto de cumplimiento y no bloquea la aprobación por sí solo
Qué pasa la revisión
- Responde con una diferencia técnica verificable, no con un argumento de marketing
- Resiste el «mejor que X»: es infalsable, y un equipo de revisión que lo lea confiará menos en el resto de tu envío
Cómo responder
Su instrucción merece seguirse al pie de la letra: sé breve y no listes tus cambios. Revisan todo desde cero, así que un changelog es ruido.
- La confirmación de lo que ha cambiado, en una o dos frases — la posición, no el diff
- Si hay renombrado, una petición explícita de reservar el nuevo slug — no lo hacen solos
- Tu alternativa, si queda alguna duda
Sube la versión corregida por la página «Add your plugin», con la sesión iniciada en la cuenta que envió — no como adjunto de un correo. Una página de make.wordpress.org de 2015 dice lo contrario; está desactualizada. El aviso «Text Domain» al subir es normal hasta que reserven tu slug.
La lista que repaso antes de reenviar
Cada línea viene de haber fallado en una de ellas. Márcalas: tu navegador lo recuerda.
La última línea es la que más importó: trece pasadas de revisión sobre mi propio código no vieron tres errores bloqueantes, y todos aparecieron en los primeros cinco minutos de ejecutarlo de verdad. Se lee el código para encontrar lo que está mal. Se ejecuta para encontrar lo que falta.
Lo que esto cuesta de verdad
Para una corrección de cumplimiento sencilla — documentación, cabeceras, contribuidores, URLs — unas horas es realista.
Para la Guideline 5, sé honesto contigo mismo: estás cambiando el modelo de negocio de tu producto y probablemente construyendo infraestructura de servidor que no tenías. Entre mi primer rechazo y mi reenvío final hubo nueve días, dos nombres rechazados, un Cloudflare Worker, una integración de webhooks y tres errores que solo aparecieron cuando dejé de leer y empecé a ejecutar.
Las normas no son arbitrarias, y una vez ves el patrón detrás son coherentes: el directorio aloja software libre que funciona, y todo se juzga contra eso.
Lo hago para otros autores de plugins: cada punto del correo de rechazo resuelto, las normas que aún no han sacado revisadas también, y la respuesta redactada para que solo tengas que enviarla.