=== Contexta Press ===
Contributors: Naranjo Labs - Juanma Lluesma
Tags: ai, seo, content generation, woocommerce, blog
Requires at least: 5.8
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.6.9
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Genera artículos con IA usando estilos de escritura configurables, sincronizados con tu catálogo de WooCommerce.

== Description ==

Contexta Press conecta tu WordPress con un backend externo de generación de contenido mediante IA. Permite:

* Generar artículos a partir de keywords y estilos de escritura reutilizables.
* Sugerir ideas de artículos con enfoque SEO.
* Sincronizar el catálogo de productos de WooCommerce y los posts existentes con el backend.
* Personalizar el diseño visual de los artículos generados.

Este plugin requiere una cuenta activa en el servicio Contexta Press (contextapress.com) y una API Key válida para funcionar. Consulta la sección "Servicios externos" para más información sobre los datos que se envían.

== Installation ==

1. Sube la carpeta del plugin a `/wp-content/plugins/`.
2. Activa el plugin desde el menú "Plugins" de WordPress. Al activarse, intenta conectar tu cuenta automáticamente usando el email del administrador del sitio.
3. Si la conexión automática no se completó, ve a "Contexta Press > Ajustes" y usa "Conectar cuenta" (introduciendo tu email) o pega manualmente una API Key que ya tuvieras.

== Frequently Asked Questions ==

= ¿Necesito una cuenta externa para usar este plugin? =

Sí. Contexta Press es un cliente para el backend de generación de contenido con IA de Contexta Press (https://www.contextapress.com). Necesitas una API Key válida, obtenida en esa plataforma, para generar artículos, sugerir ideas o sincronizar tu catálogo.

= ¿Qué pasa con mis datos? =

Consulta la sección "Servicios externos" de este readme y la política de privacidad del servicio en https://www.contextapress.com/privacidad.

== External services ==

Este plugin actúa como cliente del backend de Contexta Press (https://api.contextapress.com), un servicio de generación de contenido mediante IA operado por Contexta Press. Es necesario para el funcionamiento del plugin y requiere una API Key asociada a tu cuenta.

Se envían datos a este servicio en los siguientes casos:

* **Alta de cuenta** (al activar el plugin por primera vez, y/o al pulsar "Conectar cuenta" en Ajustes): se envía el email del administrador del sitio y la URL del sitio (`site_url`) para crear la cuenta y obtener una API Key. No requiere que haya ninguna API Key configurada previamente.
* **Generación de artículos e ideas** (acción manual del administrador desde el panel "Contexta Press"): se envían las keywords/tema introducidas, el prompt del estilo de escritura seleccionado y, si se activa la opción "Incluir productos", una referencia al catálogo. Si se activa la opción "Generar imagen destacada" (planes Growth y Agency), se envía además el estilo de imagen indicado y se recibe una imagen generada por IA, que el plugin sube a la Biblioteca de medios y asigna como imagen destacada del artículo.
* **Extracción de contexto de negocio** (acción manual): el texto de contexto de empresa que el administrador guarda se envía como contexto global para las peticiones de generación.
* **Sincronización automática al guardar contenido**: cada vez que se crea o actualiza un producto de WooCommerce o una entrada (post) del blog, el plugin envía en segundo plano al backend su título/nombre, descripción/extracto, precio y stock (en productos), y el HTML renderizado del contenido (en posts), para mantener el índice del backend actualizado. Esto ocurre automáticamente mientras la URL del backend y la API Key estén configuradas en los ajustes del plugin.
* **Sincronización masiva** (acción manual, botón "Sincronizar Catálogo" en Ajustes): envía en lotes de 50 el catálogo completo de productos y posts (mismos campos que arriba, más la imagen principal del producto).
* **Consulta de uso/facturación** (acción manual): se solicita al backend el resumen de artículos y tokens consumidos en el mes.
* **Sincronización del sitemap**: una vez al día (automático), y además cada vez que un post, página o producto pasa a publicado, el plugin envía la lista completa de URLs públicas e indexables del sitio (título, URL y tipo de cada una), sustituyendo por completo la lista anterior en el backend. Se excluyen borradores, contenido con contraseña y cualquier entrada marcada noindex por Yoast SEO o Rank Math.

No se envían datos a este servicio hasta que el administrador configura una URL de backend y una API Key válidas en Contexta Press > Ajustes.

Enlaces:
* Sitio del servicio: https://www.contextapress.com
* Términos de servicio: https://www.contextapress.com/terminos
* Política de privacidad: https://www.contextapress.com/privacidad

Este plugin también contacta periódicamente con la API de GitHub (api.github.com) para comprobar si hay una versión nueva publicada en https://github.com/DonWizu/contexta-plugin/releases, usando la librería [Plugin Update Checker](https://github.com/YahnisElsts/plugin-update-checker) de YahnisElsts (MIT). El repositorio es privado, así que esta comprobación usa una credencial de solo lectura incluida en el propio plugin (no configurable desde el admin de WordPress). No se envía ningún dato del sitio a GitHub, solo se consulta la lista de releases del repositorio.

== Changelog ==

= 1.6.9 =
* Fix variantes de idiomas

= 1.6.8 =
* Versiones de idioma añadido

= 1.6.7 =
* Corregido: al guardar una idea de la "Lluvia de ideas SEO" (o al usarla para generar un post), si el título, extracto o ángulo diferencial devuelto por la IA contenía comillas, el HTML dinámico se rompía y se perdía el resto del texto. Ahora se escapa correctamente antes de insertarlo en la página.
* Nuevo: la tabla "Ideas Guardadas" muestra la fecha en que se guardó cada idea y las ordena de más reciente a más antigua.
* Los campos "Nº de referencias" y "Estilo de imagen" del formulario de generación ya no se muestran; se envían siempre con un valor fijo (10 referencias, estilo de imagen genérico sin marcas).

= 1.6.6 =
* Corregido: no se escribían las meta keys de The SEO Framework (`_genesis_title`/`_genesis_description`), así que el título y la meta description no se aplicaban con ese plugin de SEO activo. Ahora se escriben junto a las de Rank Math y Yoast.
* Mitigado: algunas respuestas del backend devuelven el `html_content` ya envuelto en su propio contenedor y con su propio `<h1>` de título, duplicando el título del post (que WordPress ya muestra vía el theme) y anidando el contenedor dos veces. El plugin ahora lo detecta y lo quita si aparece.
* Mitigado: algunas respuestas del backend filtran el meta_description y el excerpt como párrafos visibles al principio del body (p.ej. "Meta descripción: ..."), duplicando esos mismos datos que ya se guardan en sus propios campos. El plugin ahora los quita si aparecen al principio del contenido. Es una mitigación de algo que genera el backend, no un problema que introdujera el plugin — quedará sin efecto en cuanto se corrija en origen.

= 1.6.5 =
* Cambio de arquitectura: la generación de artículos pasa de una única petición HTTP síncrona (que podía tardar varios minutos y chocaba con límites de proxy de 60-120s en distintos hostings, causando errores 503/504 aunque el artículo se generase correctamente) a un patrón asíncrono: el plugin arranca el trabajo (`POST /content/generate/start`) y consulta su estado cada pocos segundos (`GET /content/generate/status/{job_id}`) hasta que termina. Ninguna petición individual necesita quedarse abierta más de unos segundos.
* La barra de progreso ahora refleja el estado real reportado por el backend (en cola / generando / guardando) en vez de una estimación por tiempo transcurrido.
* Un sondeo de estado fallido de forma puntual ya no cancela la generación: solo se avisa al usuario tras varios fallos de sondeo seguidos, porque el artículo puede seguir generándose en el servidor igualmente.
* Protección contra condiciones de carrera si el estado se consulta dos veces en paralelo (dos pestañas, doble disparo): el borrador de WordPress se crea una sola vez por job.

= 1.6.4 =
* Nuevo: barra de progreso e indicador de tiempo transcurrido durante la generación de artículos, con fases indicativas ("Redactando el artículo...", "Generando la imagen destacada...", etc.) y un desplegable "¿Por qué puede tardar varios minutos?" explicando el proceso. No hay progreso real reportado por el backend (es una única llamada HTTP), así que la barra avanza de forma estimada según el tiempo transcurrido.

= 1.6.3 =
* Nuevo: generación de imagen destacada con IA (planes Growth y Agency). Añade el checkbox "Generar imagen destacada" y un campo opcional de estilo de imagen al formulario de generación de artículos; el plugin sube la imagen recibida (WebP) a la Biblioteca de medios y la asigna como destacada, con su título, texto alternativo y descripción.
* Si la generación de la imagen falla (rechazo de contenido, error puntual) el artículo se crea igualmente y se muestra un aviso no bloqueante, en vez de tratarse como un fallo de la operación completa.
* El timeout de `/content/generate` sube a 280s para dar margen a la generación de imagen (puede añadir 90s+ sobre el artículo).

= 1.6.2 =
* Ajustado el timeout de `/content/generate` a 170s (antes 300s) para no esperar una respuesta que el backend ya habría descartado tras su propio límite.
* Añadido `set_time_limit(0)` defensivo antes de llamar a la API de generación/ideas, por si el hosting tiene un `max_execution_time` bajo.
* Los errores de conexión y de timeout ahora muestran un mensaje diferenciado (indicando si conviene reintentar o si el artículo puede haberse generado igualmente), en vez del genérico "Error de conexión con el servidor".
* Se añade un timeout explícito en las peticiones AJAX del admin (175s en generación de artículos, 125s en ideas) y logging de diagnóstico (`status`, `textStatus`, tiempo transcurrido) en consola para facilitar identificar dónde se corta una petición larga.

= 1.6.1 =
* Corregido: CONTEXTA_PRESS_Sync se instanciaba dos veces (una en su propio archivo y otra en contexta-press.php), lo que registraba el handler de sincronización manual por duplicado y procesaba cada página del catálogo dos veces.

= 1.6.0 =
* Nuevo: sincronización de sitemap con el backend (`POST /sitemap/sync`, modo "replace"). La lista de URLs públicas e indexables se construye directamente desde WordPress (posts, páginas, productos y categorías publicados), sin depender de ningún sitemap.xml ni de qué plugin de SEO esté activo. Excluye contenido noindex (Yoast/Rank Math) y con contraseña.
* Se ejecuta una vez al día vía WP-Cron, y además al publicar cualquier post/página/producto (de forma asíncrona, sin alargar el guardado).
* Si la construcción de la lista falla a medias, o queda vacía, no se envía nada — evita que un fallo parcial borre enlaces internos legítimos en el backend.

= 1.5.2 =
* Corregido: la pestaña Ajustes → Contexto del Negocio nunca mostraba el contexto ya guardado al abrirla. El proxy de lectura leía la clave `context` de la respuesta del backend, pero el backend devuelve `company_context`; el campo aparecía siempre vacío aunque hubiera contexto guardado (el guardado en sí funcionaba bien).

= 1.5.1 =
* El acceso de solo lectura al repositorio de GitHub para comprobar actualizaciones ya no se configura desde Ajustes: viene incluido en el propio plugin, sin campo visible ni editable en el admin.

= 1.5.0 =
* Nuevo: comprobación automática de actualizaciones vía Plugin Update Checker (YahnisElsts), apuntando a los Releases de GitHub. Requiere un token de GitHub guardado en Ajustes → Actualizaciones del plugin (el repositorio es privado); sin token, el plugin sigue funcionando igual pero no avisa de nuevas versiones.
* Usa el .zip publicado por release.yml como asset del Release (no el código fuente completo del repo).

= 1.4.0 =
* Nuevo campo opcional "Keywords" en el generador, separado de "Idea del artículo". Al generar, se combinan en un único topic_keywords ("Idea del artículo: ...\nKeywords: ...", omitiendo la línea de Keywords si está vacía) — el request a la API no cambia de forma.
* Al usar una idea de la Lluvia de Ideas SEO, sus keywords ahora se copian al nuevo campo "Keywords" en vez de mezclarse dentro del texto de la idea.

= 1.3.2 =
* El seo_title y meta_description que devuelve la IA se recortan a los límites recomendados por Yoast SEO y Rank Math (60 / 156 caracteres, respetando palabras completas) antes de guardarlos en rank_math_title, rank_math_description, _yoast_wpseo_title y _yoast_wpseo_metadesc.

= 1.3.1 =
* El plan de suscripción ahora se muestra como una insignia a la izquierda de posts y tokens consumidos en el resumen de uso.
* Nuevo enlace "Mejorar plan" en el resumen de uso (oculto en el plan Agency, el más alto).

= 1.3.0 =
* Nuevo: "Incluir productos" queda bloqueado en el generador para planes free y starter; solo Growth y Agency pueden activarlo.
* El resumen de uso ahora muestra el plan, posts y tokens consumidos sobre su límite, y el fin del periodo actual (o "Aún no has generado contenido" si el cliente es nuevo).
* El botón "Generar Artículo" se deshabilita proactivamente cuando se agota la cuota de posts o de tokens (lo que ocurra antes), en vez de esperar al 402 tras rellenar el formulario.
* Corregido: el resumen de uso leía `tokens_used`, un campo que la API nunca ha devuelto (es `tokens_consumed`); por eso siempre mostraba 0.
* Si la API Key deja de ser válida (403/404 en `/billing/status`), se muestra un aviso con enlace directo para reconectar la cuenta desde Ajustes.

= 1.2.4 =
* Al usar una idea de la Lluvia de Ideas SEO para generar un artículo, el "Ángulo diferencial" ahora se copia también al campo de tema del generador (antes solo se copiaban título, idea y keywords).

= 1.2.3 =
* Corregido: al generar un artículo sin "Incluir productos" marcado (el estado por defecto), el plugin enviaba `num_references: 0` a la API, lo que provocaba un 422 de validación del backend antes de que la petición llegara a registrarse en su log. Ahora siempre se envía un valor entre 1 y 10.
* Los mensajes de error de generación ya no anteponen "Error al conectar con la API" cuando la API sí respondió (por ejemplo, cuota agotada o contenido rechazado) — ese prefijo queda reservado para fallos de conexión reales.

= 1.2.2 =
* Añadido un footer con enlace a https://www.contextapress.com/ en las páginas de administración del plugin.

= 1.2.0 =
* Nuevo: alta de cuenta self-service ("Conectar cuenta") mediante email + URL del sitio, con intento automático al activar el plugin.
* Mensajes de error específicos al generar artículos e ideas (cuota agotada, contenido rechazado, contexto de negocio pendiente, etc.), en vez de un error genérico.
* Nuevo: se muestra el "ángulo diferencial" de cada idea sugerida por la IA.
* Corregido: el webhook de borrado de producto enviaba el ID como número en vez de como texto, inconsistente con el resto de llamadas al backend.

= 1.1.2 =
* Corregido el desajuste entre la clase CSS del contenedor de artículos generados y la que usaba "Modificar estilos", que hacía que la personalización de diseño no tuviera efecto.
* Migración automática, transparente para el usuario, de la meta key de posts generados por IA a su nuevo nombre.
* Corrección de más caracteres mal codificados en el panel "Modificar estilos".

= 1.1.1 =
* Corrección de caracteres mal codificados en textos del panel de administración.
* La URL del backend ahora debe usar HTTPS para proteger la API Key en tránsito.
* Documentación del servicio externo utilizado por el plugin.

= 1.0.13 =
* Versión previa.
