Convoca Enroll
Guía para administradores y monitores del motor de actividades e inscripciones de Convoca. Documentada sobre la versión 2.7.62.
Manual para la junta directiva (sin conocimientos técnicos)¶
Esta página es la referencia técnica del plugin. Para el día a día hay un manual en tres partes, en castellano y con capturas:
1. Introducción¶
Convoca Enroll gestiona el ciclo completo de una actividad: creación, inscripción con control de aforo y lista de espera, aportación/pago, confirmación de plaza, check-in por QR, evaluaciones, recordatorios automáticos y generación de carteles para redes.
Requiere: el plugin convoca-core (Convoca Common Utilities) activo. Sin él, el plugin se desactiva automáticamente en la activación.
| Requisito | Valor |
|---|---|
| WordPress | ≥ 6.4 |
| PHP | ≥ 8.1 |
| Dependencias | convoca-core, extensión PHP Imagick (solo para carteles) |
| Opcionales | convoca-members (socios), convoca-gateway (pagos) |
2. Instalación¶
- Asegúrate de que Convoca Core está activo.
- Sube la carpeta
convoca-enrolla/wp-content/plugins/. - Activa el plugin desde Plugins.
- En la activación el plugin crea automáticamente: la página «Panel de reservas», las tablas de base de datos, las plantillas de email por defecto y los eventos de cron.
3. Menú de administración¶
El plugin registra un menú principal «Actividades» (icono portapapeles, posición 27). Sus submenús:
| Submenú | Página (slug) | Quién lo ve |
|---|---|---|
| Inscripciones | convoca-enroll |
gestionar_miembros |
| Añadir inscripción | conv-nueva-inscripcion |
gestionar_miembros |
| Actividades | convoca-enroll-actividades |
edit_posts |
| Añadir nueva actividad | convoca-enroll-actividad-editor |
edit_posts |
| Mis actividades (CRM monitores) | conv-monitor-crm |
manage_inscripciones |
| Check-in | conv-checkin |
gestionar_miembros |
| Evaluaciones | edit.php?post_type=convoca_evaluacion |
gestionar_miembros |
| Informes | conv-informes |
convoca_view_reports |
| Configuración | conv-ajustes |
manage_options |
| Logs | convoca_enroll-logs |
common_view_logs |
| Cola de Correos | conv-email-queue |
manage_options |
También añade un widget de escritorio «Inscripciones Convoca» con totales (inscripciones, confirmadas, en espera y próximas actividades).

4. Configuración (Ajustes)¶
Accede a Actividades → Configuración. Está organizada en pestañas:
| Pestaña | Contenido |
|---|---|
| General | Email del administrador, versión RGPD, límite de una reserva por adulto, permitir menores, bloqueo de DNI duplicado, plazas por defecto, URL del panel de reservas, webhooks y Google Sheets |
| Normas de inscripción | Texto de introducción y normas mostradas al público |
| Protección de datos | URLs de privacidad, uso de imágenes y protección de datos |
| Emails | Edición de las 11 plantillas + tamaño de lote y reintentos de la cola |
| Recordatorios de evaluación | Recordatorio automático a monitores/voluntarios |
| Google Photos | Credenciales OAuth y configuración de álbumes |
| Google Calendar | Credenciales OAuth y sincronización |
| Estado | Panel de diagnóstico (plugins y páginas necesarias) |
Ajustes generales relevantes¶
| Ajuste | Clave | Descripción |
|---|---|---|
| Email del administrador | admin_email |
Recibe copia de los correos automáticos |
| Una reserva por adulto | limite_una_reserva |
Impide que un adulto tenga más de una reserva activa |
| Permitir menores | permitir_menores |
Permite inscribir menores a cargo |
| Bloquear DNI duplicado | bloquear_dni_duplicado |
Evita el mismo DNI dos veces en la misma actividad |
| Plazas por defecto | plazas_por_defecto |
Aforo inicial al crear una actividad (por defecto 20) |
| URL panel de reservas | url_panel_reservas |
Enlace a la página con [convoca_panel_reservas] |
5. Crear una actividad¶
- Ve a Actividades → Añadir nueva actividad.
- Rellena título, descripción y resumen corto (el resumen se usa en listados y carteles).
- Configura los datos logísticos:
| Campo | Meta key | Descripción |
|---|---|---|
| Fecha y hora de inicio | _convoca_fecha_inicio |
Obligatoria; en formato Y-m-d H:i |
| Fecha y hora de fin | _convoca_fecha_fin |
Opcional |
| Ubicación / punto de encuentro | _convoca_ubicacion |
Texto libre |
| Plazas totales | _convoca_plazas_totales |
Aforo máximo |
| Plazas disponibles | _convoca_plazas_disponibles |
Se auto-gestiona al inscribir/cancelar |
| Precio socio | _convoca_precio_socio |
Importe en € para socios |
| Requiere pago previo | _convoca_requiere_pago |
Marca la actividad como de pago |
| Es una actividad externa | _convoca_actividad_externa |
Marca informativa |
| Monitores / Responsables | _convoca_responsables |
Lista de IDs de usuario separados por coma |
- Asigna una imagen destacada (se usa en listados y en el cartel).
- Publica.
Validaciones automáticas al guardar: la fecha de fin no puede ser anterior a la de inicio (se corrige sola); plazas_disponibles no puede superar plazas_totales; si dejas una vacía se iguala a la otra.
El CPT
actividades público, con archivo en/actividades/. El archive del frontend muestra solo actividades futuras, ordenadas por fecha de inicio ascendente. Cada actividad singular emite JSON-LD (EducationEvent) con fecha, lugar, precio mínimo y disponibilidad (InStock/SoldOut).
6. Shortcodes y bloques¶
Shortcodes¶
| Shortcode | Registro | Uso |
|---|---|---|
[convoca_inscripcion_page] |
Pagina_Inscripcion |
Listado de actividades próximas con enlace al panel |
[convoca_form_inscripcion id="123"] |
Form_Inscripcion |
Formulario de inscripción de una actividad |
[convoca_panel_reservas] |
Panel_Reservas |
Panel del usuario (acceso con email + código) |
[convoca_actividad_meta field="ubicacion"] |
CPT_Actividad |
Muestra un metadato de la actividad actual |
[convoca_inscripcion_actual] |
CPT_Actividad |
Formulario de la actividad actual (página singular) |
[convoca_evaluacion actividad_id="123"] |
Formulario_Evaluacion |
Formulario de evaluación post-actividad |
Atributos de [convoca_form_inscripcion]:
id="123" (obligatorio) ID de la actividad
mostrar_plazas="true" muestra plazas disponibles
mostrar_precios="true" muestra precios
Atributos de [convoca_actividad_meta] (se formatea según el campo):
[convoca_actividad_meta field="ubicacion"]
[convoca_actividad_meta field="fecha_inicio"] → "15 Mar 2026"
[convoca_actividad_meta field="precio"] → "5,00 €" o "Gratis"
[convoca_actividad_meta field="plazas_disponibles"] → "4 / 20"
También admite placeholders %% dentro del contenido de una actividad: %%FECHA_INICIO%%, %%LUGAR%%, %%PRECIO%%, %%PLAZAS%%.
Bloques (Gutenberg)¶
| Bloque | Atributo | Render |
|---|---|---|
convoca-enroll/inscripcion |
actividadId |
Formulario de inscripción |
convoca-enroll/panel-reservas |
— | Panel de reservas |
convoca-enroll/pagina-inscripcion |
— | Página de inscripciones |
convoca-enroll/evaluacion |
actividadId |
Formulario de evaluación |
convoca-enroll/lista-espera |
actividadId |
Contador de lista de espera |
7. Motor de inscripción¶
La lógica central vive en Motor_Inscripcion (clase Convoca\Enroll\Motor_Inscripcion).
Estados de una inscripción¶
| Estado | Etiqueta | ¿Consume plaza? |
|---|---|---|
pendiente |
Pendiente | ✅ al inscribirse |
pendiente_pago |
Pendiente de aportación | ✅ al inscribirse |
confirmada |
Confirmada | Solo si viene de lista_espera |
pagada |
Pagada (especial) | — (estado manual/legado) |
lista_espera |
Lista de espera | ❌ |
cancelada |
Cancelada | ❌ (libera plaza) |
Cómo se inscribe un usuario¶
El formulario lo pone el plugin en la ficha de la actividad (CPT_Actividad::append_registration_form()), no el tema: así funciona también en sitios cuyo tema no sea el de Convoca. Un tema que ya pinte el formulario puede tomar el relevo declarando add_theme_support( 'convoca-actividad-form' ), y cada sitio puede desactivarlo con el filtro convoca_enroll_form_en_ficha (recibe el ID de la actividad). Si la actividad ya ha empezado, la ficha no ofrece el formulario: explica que ha finalizado.
- El formulario público (
wp_ajax_convoca_inscribir) valida nombre, email (con verificación de dominio MX/A), DNI/NIE y consentimiento RGPD. Motor_Inscripcion::inscribir()aplica rate limit (5 intentos por IP y hora), comprueba que la actividad existe y no ha finalizado, y valida duplicados de email/DNI en la misma actividad.- Se genera un código de reserva único de 8 caracteres (sin
I,O,0,1). - Todo se ejecuta en transacción SQL con
SELECT … FOR UPDATEsobre la fila de la actividad. Esto serializa las inscripciones concurrentes y cierra la condición de carrera de doble clic (TOCTOU): los duplicados se re-verifican dentro de la transacción. - Si hay plazas, se decrementa atómicamente
plazas_disponibles; si no, el estado pasa alista_espera. - El estado resultante es:
pendiente_pagosi la actividad requiere pago con importe > 0;pendientesi no requiere pago;lista_esperasi no hay plazas.- Se dispara el hook
convoca_enroll_inscripcion_nueva(que encola el email de recepción o de lista de espera).
Flujo de pago → confirmación¶
Cuando la actividad requiere pago:
- El formulario crea un pago en la pasarela (
Convoca\Gateway\Payment_Handler::create_payment()conorigin=enroll,origin_id=inscripción) y escribe_convoca_pago_idantes de pagar. - Al completarse el pago, la pasarela dispara el hook
convoca_gateway_payment_completed. Payment_Listener(claseConvoca\Enroll\Payment_Listener) lo recibe, deduplica contra el pago realmente aplicado (_convoca_pago_aplicado_id, no contra_convoca_pago_id— fix E2E-9) y llama aMotor_Inscripcion::confirmar().- La creación del pago está protegida con un lock atómico de BD para evitar doble creación por doble clic.
- Si la confirmación falla (p. ej. aforo agotado mientras se pagaba), la inscripción se marca
_convoca_needs_manual_reviewpara revisión manual.
Regla clave de concurrencia:
pendienteypendiente_pagoya consumieron su plaza al inscribirse, así queconfirmar()solo decrementa el aforo cuando la inscripción venía delista_espera(fix de doble plaza).
Cancelación y liberación de plaza¶
Motor_Inscripcion::cancelar() ejecuta en transacción:
- Si el estado consume plaza (
confirmada,pendienteopendiente_pago), libera la plaza: primero intenta promover al primero de la lista de espera y, si no hay nadie, incrementaplazas_disponibles(fix E2E-10: antes solo liberabaconfirmada). - Marca
estado = canceladae invalida el token de check-in por seguridad. - Dispara
convoca_enroll_inscripcion_cancelada(email de cancelación).
La cancelación puede hacerla el propio usuario desde el panel de reservas (con email + código) o un administrador/monitor desde el CRM.
Ventana de cancelación (D9): si la actividad está a menos de cancel_window_hours (opción convoca_enroll_settings, 24 h por defecto, configurable) de su inicio, la cancelación del usuario se rechaza con un mensaje de aviso, salvo que la haga un administrador, alguien con convoca_manage_enroll o se use $force=true (p. ej. liberación automática por pago fallido). Cada cancelación tardía se registra en el contador _convoca_late_cancellations_<año>; al alcanzar 3 cancelaciones tardías en un año se notifica al administrador por email para revisión manual de la actividad.
Pago fallido libera plaza (D10): si la pasarela comunica un pago rechazado (convoca_gateway_payment_failed) para una inscripción que sigue en pendiente_pago, el Payment_Listener la cancela automáticamente con motivo «pago fallido» (con $force=true, sin pasar por la ventana de cancelación) y libera la plaza para la lista de espera. Si la inscripción ya estaba confirmada o el pago ya se aplicó, el evento se ignora.
Regla de una reserva por persona¶
Con limite_una_reserva activo, un adulto no puede tener más de una reserva activa (estados confirmada, pagada, pendiente, pendiente_pago o lista_espera). Los menores a cargo quedan excluidos de esta regla.
8. Lista de espera¶
- Cuando el aforo está completo, la inscripción queda en
lista_esperasin consumir plaza. - Al cancelarse una plaza confirmada/pendiente/pendiente_pago,
promote_waitlist()promueve atómica y automáticamente al primero de la lista al estadopendiente. - Prioridad de socios (D8): la promoción ordena primero por socio con cuota al día (campo
es_socio/condición de socio activo víaconvoca-members) y después por fecha de inscripción más antigua. Un socio en espera se promueve antes que un no socio inscrito antes. - La promoción dispara
convoca_enroll_inscripcion_promovida(email «¡Tienes una plaza disponible!»). - El bloque
convoca-enroll/lista-esperamuestra el número de personas en espera.
9. Gestión de inscripciones (admin y CRM)¶
Listado principal (Actividades → Inscripciones)¶
Muestra todas las inscripciones con búsqueda, acciones masivas (Confirmar plazas), exportación CSV y (con licencia PRO) exportación PDF. Cada fila abre el detalle de la inscripción, donde puedes:
- Cambiar el estado (los cambios a
confirmada/canceladapasan por el motor para gestionar plazas correctamente). - Marcar pagado manualmente.
- Editar notas internas.
- Reenviar el email de confirmación.
CRM de monitores (Actividades → Mis actividades)¶
Panel simplificado para el rol monitor_actividad y responsables asignados. Por actividad muestra contadores (confirmados, asistieron, faltaron, pendientes) y permite:
- Validar inscripciones pendientes o promover desde lista de espera.
- Marcar asistencia (✅/❌) por participante.
- Modo check-in rápido y exportar CSV de todas o de asistentes.
Un monitor solo ve las actividades que tiene asignadas (meta _convoca_responsables o inscripción confirmada como voluntario_aprobado).
10. Check-in con QR¶
Cada inscripción confirmada tiene un token de check-in único e impredecible (48 caracteres hexadecimales).
Como monitor/administrador¶
- Abre
/checkin/(escáner web optimizado para móvil, usahtml5-qrcodeservido localmente) o usa el submenú Check-in. - Escanea el QR del asistente. El token se valida contra
_convoca_checkin_token. - El registro de asistencia es idempotente y está protegido con
SELECT … FOR UPDATE(evita registros duplicados bajo concurrencia). - También puedes marcar asistencia manualmente (✅/❌) desde el listado de inscripciones o el CRM.
Requisito de acceso: manage_inscripciones o rol voluntario_aprobado, y ser responsable de la actividad.
Las dos rutas del check-in¶
| Ruta | Para quién | Qué hace |
|---|---|---|
/checkin/ |
monitor o voluntario | escáner web con cámara (html5-qrcode, servido localmente) y PWA instalable |
/checkin/<token>/ |
monitor o voluntario | check-in directo: registra la asistencia del token escaneado |
Las registra Checkin_Handler por rewrite rule. El nombre que ponen las reglas tiene que ser
exactamente el de la query var que lee el handler (convoca_enroll_checkin y
convoca_enroll_checkin_page); si no coincide, la ruta responde con la web normal y el escáner
queda inalcanzable —que es lo que pasaba hasta la 2.7.17—. Las reglas viven en la base de datos:
al actualizar el plugin hay que vaciar la caché de reglas (guardar Ajustes → Enlaces
permanentes, o wp rewrite flush), o el cambio no surte efecto.
Comportamiento comprobado en vivo: el check-in directo responde «Check-in Exitoso», la asistencia queda registrada una sola vez —repetir el escaneo no la duplica— y atribuida a quien la hizo; un token que no existe o está manipulado responde «Token de check-in no válido» y sin sesión de personal la ruta devuelve 403.
Como asistente¶
El email de confirmación incluye el QR y un enlace ICS para añadir la actividad al calendario.
El QR lleva a /checkin/<token>/?h=… y funciona para quien lo recibe: el socio lo abre en su
móvil y su asistencia queda registrada, sin cuenta ni permisos de administración. La firma h
autoriza esa inscripción y ninguna otra (un socio no puede marcar la asistencia de otro) y se
calcula con la sal persistente del sitio, así que un QR enviado ayer sigue valiendo hoy.
La imagen la pinta el propio Convoca (QR_Generator, con chillerlan/php-qrcode) y se guarda en
wp-content/uploads/convoca-qr/: el token del socio no sale del sitio. Antes se le pedía la
imagen a un servicio externo con la URL de check-in dentro, y por ahí se iba la credencial.
Qué responde cada caso, para poder diagnosticar de un vistazo:
| Situación | Respuesta |
|---|---|
| Enlace correcto | 200 «Check-in Exitoso» |
| Ya se había hecho | 200 (la asistencia es idempotente: no se duplica) |
| Firma manipulada, sin sesión de personal | 403 |
| El enlace no corresponde a ninguna inscripción | 404 «Enlace no válido» |
| La inscripción no está confirmada | 409 |
/checkin/ (el escáner) sin sesión |
403 (es herramienta de personal) |
Al cancelar una inscripción, el token de check-in se invalida inmediatamente.
11. Evaluaciones¶
Las evaluaciones son un CPT interno (convoca_evaluacion, no público). El formulario se muestra con [convoca_evaluacion actividad_id="X"] o el bloque convoca-enroll/evaluacion.
Reglas de acceso al formulario:
- Solo después de que la actividad haya finalizado (
_convoca_fecha_finen el pasado). - Requiere sesión iniciada.
- Pueden evaluar: administradores,
convoca_manage_evaluations, monitores responsables ovoluntario_aprobadocon asistencia registrada (si). - Un usuario solo puede enviar una evaluación por actividad.
El formulario recoge 4 valoraciones de 1–5 estrellas (gestión, instalaciones, participantes, comunicación) y campos de texto abierto. Al enviarse dispara el hook convoca_evaluacion_completada.
Recordatorios de evaluación¶
Eval_Reminder_Cron (cron diario convoca_enroll_eval_reminder) envía automáticamente un recordatorio a los monitores y voluntarios que asistieron, N días después de la finalización (configurable en Ajustes → Recordatorios de evaluación). Por defecto 3 días, con variables {nombre_actividad}, {fecha_actividad}, {evaluador_nombre}, {link_evaluacion}.
El email
feedback_post(7 días después, vía cron diario) es independiente y pide opinión por correo directo.
12. Emails automáticos¶
Email_Automation gestiona 11 plantillas editables en Ajustes → Emails, todas con el layout HTML de Convoca y enviadas de forma asíncrona a través de Email_Queue (cola procesada por cron cada minuto).
| Plantilla | Cuándo se envía |
|---|---|
recepcion |
Inscripción creada (no lista de espera) |
lista_espera |
Inscripción en lista de espera |
promocion_lista_espera |
Plaza asignada desde lista de espera |
confirmacion_plaza |
Inscripción confirmada (incluye QR e ICS) |
cancelacion_reserva |
Inscripción cancelada |
recordatorio_7dias |
7 días antes (cron semanal) |
recordatorio_24h |
24 h antes (cron diario) |
recordatorio_1hora |
1 h antes (cron horario) |
feedback_post |
7 días después del evento (cron diario) |
google_photos_album_creado |
Álbum de fotos creado |
google_photos_album_compartido |
Álbum compartido con participantes |
Variables disponibles: {nombre}, {email}, {actividad}, {fecha}, {hora}, {ubicacion}, {estado}, {importe}, {plazas_restantes}, {codigo_reserva}, {panel_reservas}, {qr_code}, {url_checkin}, {album_url}, {calendario_link}.
Cada envío tiene deduplicación atómica (no se reenvía el mismo correo en una ventana de 5 minutos) y notifica una copia al email del administrador. Los recordatorios solo se envían si la actividad tiene el flag de recordatorio activado (reminder_7dias, reminder_1dia, reminder_1hora, reminder_post_evento).
Recordatorio configurable X horas antes (D27): además de los fijos, Activity_Reminder_Cron (cron horario, hook convoca_enroll_activity_reminder) envía un recordatorio a las X horas configurables (_convoca_reminder_hours, opción de la actividad, 24 h por defecto) antes del inicio, con fecha/hora/lugar y enlace al panel. El envío es por inscripción con dedupe (meta _convoca_reminder_activity_sent): cada inscripción confirmada recibe el recordatorio una sola vez por actividad.
13. Integraciones de Google¶
Google Calendar¶
- Sincroniza actividades como eventos (creación, actualización y borrado) vía OAuth 2.0.
_convoca_google_event_id/_convoca_google_event_linkguardan la referencia.- Cada confirmación adjunta un archivo ICS (librería
eluceo/ical). - Configurable en Ajustes → Google Calendar (sincronización automática, ID de calendario, credenciales).
Google Photos¶
- Crea álbumes por actividad y los comparte con los participantes confirmados.
- Meta relacionada:
_convoca_google_album_id,_convoca_google_album_url,_convoca_google_album_shared. - Acciones AJAX desde la metabox de la actividad: crear álbum y compartir.
Google Sheets¶
- Sincronización opcional (
sheets_enabled) con API key (se recomienda definirla vía constanteCONV_ENROLL_GOOGLE_SHEETS_API_KEY).
14. Webhooks¶
Funcionalidad PRO (licencia webhooks). Webhook_Dispatcher encola eventos de cambio de estado en la tabla convoca_enroll_webhook_queue (o delega en Convoca\Core\Webhook_Manager si está disponible).
- Eventos:
state_change(nueva, cancelada, confirmada, promovida) yattendance_change. - La cola se procesa por cron (cada minuto) con reintentos (máx. 3) y lock de concurrencia.
- El secreto configurado se envía en la cabecera
X-Convoca-Signature(HMAC-SHA256 del payload).
Configuración en Ajustes → General → Webhooks (URL y secreto).
15. Carteles (Poster Engine)¶
El Poster Engine v6 genera carteles de actividad con Imagick directamente (sin pipeline HTML/CSS/PDF). Requiere la extensión PHP Imagick.
Formatos¶
| Formato | Dimensiones | Uso |
|---|---|---|
square |
1080×1080 | Instagram 1:1 |
portrait |
1080×1350 | Instagram 4:5 |
story |
1080×1920 | Stories/Reels 9:16 |
facebook |
1200×630 | Facebook/link 1.91:1 |
banner |
1920×1080 | Banner 16:9 |
a4 |
2480×3508 | Impresión 300 dpi |
Plantillas¶
8 plantillas de sistema (paleta + composición) almacenadas en la tabla convoca_media_templates como JSON (layers, design_tokens, formats): nature-classic, modern-ngo, educational-workshop, volunteer-campaign, kids-family, full-photo-hero, story-focused, minimal-corporate.
- Tipografías Montserrat y Playfair Display servidas desde
assets/fonts/. - La imagen se toma de: imagen destacada →
_convoca_poster_image_id→ primera imagen del contenido/galería. Si no hay, se dibuja un placeholder. - Incluye QR (librería
chillerlan/php-qrcode) que apunta al blog post, landing o URL de inscripción de la actividad. - Los carteles se cachean en
wp-content/uploads/convoca-posters/.
Cómo se generan: por API (no hay pantalla)¶
El cartel se genera por API REST, que es la interfaz real del módulo:
| Método | Ruta | Permiso |
|---|---|---|
| POST | /media/poster/render |
convoca_manage_media |
| POST | /media/poster/regenerate |
convoca_manage_media |
| GET | /media/templates y /media/templates/{id} |
convoca_manage_media |
| POST | /media/blog/create |
convoca_manage_media |
No hay pantalla (ni metabox ni página de administración) para lanzarlo a mano desde el
escritorio, y no la ha habido nunca: los ficheros que la pretendían —assets/js/media-admin.js,
assets/js/convoca-editor.js y assets/css/media-admin.css— eran de junio, no los encolaba ningún
PHP, y sus acciones (convoca_render_poster, convoca_create_blog_post) y su página
(convoca-media-editor) no existían en ninguna parte; la API, el Poster Engine y el gestor de
entradas son posteriores. Se retiraron como código muerto en las versiones 2.7.19 y
2.7.20, con copia previa y explicación. Si se quiere una pantalla para hacerlo a mano, es un
envoltorio fino sobre esas cuatro rutas.
Suite Social¶
Módulo social/ para publicar en redes vía OAuth 2.0:
- Meta (Facebook/Instagram) y Google Business Profile, más un proveedor de WhatsApp.
- Tokens cifrados con AES-256-CBC (clave
CONVOCA_SOCIAL_KEYowp_salt('auth')). - Publicación asíncrona con Action Scheduler (hook
convoca_social_publish). - Tablas:
convoca_social_accounts,convoca_social_queue,convoca_media_logs.
16. API REST¶
Dos namespaces.
convoca-enroll/v1 (inscripciones y actividades)¶
| Método | Ruta | Acceso |
|---|---|---|
| GET | /actividades |
Público (con rate limit y caché) |
| GET | /actividades/{id} |
Público |
| GET | /me/session-status |
Público |
| GET | /inscripciones?actividad_id=123&estado=confirmada |
manage_inscripciones |
| PATCH | /inscripciones/{id} (estado, asistencia) |
manage_inscripciones |
| GET | /stats/{actividad_id} |
manage_inscripciones |
| POST | /checkin |
manage_inscripciones o voluntario_aprobado |
| GET | /ics?id=…&token=… |
Público (requiere token) |
| GET | /admin/users/search?term=… |
manage_inscripciones |
convoca/v1 (medios y redes)¶
| Método | Ruta | Acceso |
|---|---|---|
| POST | /media/poster/render |
convoca_manage_media |
| POST | /media/poster/regenerate |
convoca_manage_media |
| GET | /media/templates |
convoca_manage_media |
| GET | /media/templates/{id} |
convoca_manage_media |
| POST | /media/blog/create |
convoca_manage_media |
| GET | /social/auth/meta, /social/auth/google |
convoca_manage_social |
| GET | /social/callback/meta, /social/callback/google |
Público (callback OAuth) |
| GET | /social/accounts |
convoca_manage_social |
| DELETE | /social/accounts/{id} |
convoca_manage_social |
Formato de error estándar de WP REST (rest_forbidden, etc.). El token de check-in nunca se expone en las respuestas de inscripciones.
17. Roles y capacidades¶
El plugin crea el rol monitor_actividad (Monitor de Actividad) y garantiza estas capacidades al actualizar:
| Capacidad | Rol |
|---|---|
manage_inscripciones |
administrator, monitor_actividad |
gestionar_miembros |
administrator, monitor_actividad |
convoca_manage_checkin |
administrator, monitor_actividad |
convoca_manage_evaluations |
administrator, monitor_actividad |
convoca_view_reports |
administrator, monitor_actividad |
convoca_manage_media |
administrator |
convoca_publish_social |
administrator, monitor_actividad |
convoca_manage_social |
administrator |
convoca_view_media_logs |
administrator, monitor_actividad |
Un monitor solo puede editar/leer actividades donde esté asignado como responsable (map_meta_cap); no puede borrarlas.
18. Hooks públicos principales¶
add_action( 'convoca_enroll_inscripcion_nueva', function ( $inscripcion_id, $actividad_id, $estado ) {
// Lógica al crearse una inscripción (nueva o en lista de espera).
}, 10, 3 );
add_action( 'convoca_inscripcion_confirmada', function ( $inscripcion_id, $actividad_id ) {
// Lógica al confirmarse una plaza.
}, 10, 2 );
| Hook | Argumentos |
|---|---|
convoca_enroll_inscripcion_nueva |
$inscripcion_id, $actividad_id, $estado |
convoca_inscripcion_confirmada |
$inscripcion_id, $actividad_id |
convoca_inscripcion_cancelada |
$inscripcion_id, $actividad_id |
convoca_inscripcion_promovida |
$inscripcion_id, $actividad_id |
convoca_asistencia_cambiada |
$inscripcion_id, $asistencia |
convoca_gateway_payment_completed |
$pago_id, $origin, $origin_id, $meta |
convoca_evaluacion_completada |
$eval_id, $actividad_id, $user_id |
convoca_social_publish |
$queue_id |
19. Cron y tablas de base de datos¶
Eventos de cron¶
| Evento | Frecuencia |
|---|---|
convoca_enroll_reminder_7dias |
Semanal |
convoca_enroll_reminder_24h |
Diaria |
convoca_enroll_reminder_1hora |
Horaria |
convoca_enroll_feedback |
Diaria |
convoca_enroll_eval_reminder |
Diaria (si está activo) |
convoca_enroll_process_email_queue |
Cada minuto |
convoca_enroll_process_webhook_queue |
Cada minuto |
convoca_enroll_cleanup_orphan_codes |
Diaria |
convoca_enroll_google_photos_share |
Diaria |
Tablas personalizadas¶
| Tabla | Propósito |
|---|---|
convoca_media_templates |
Plantillas de cartel (JSON) |
convoca_social_accounts |
Cuentas sociales OAuth (tokens cifrados) |
convoca_social_queue |
Cola de publicación social |
convoca_media_logs |
Auditoría de operaciones de medios |
convoca_reservation_codes |
Códigos de reserva únicos |
convoca_enroll_webhook_queue |
Cola de webhooks (legacy) |
Tabla de Email_Queue |
Cola de correos |
20. WP-CLI¶
Copia de los correos a los monitores¶
Los correos de inscripciones y actividades se copian a los responsables (monitores) de la
actividad mediante Convoca\Core\Email_Copy; si la actividad no tiene responsables, la copia
va al correo de administración. Los responsables se toman del campo Responsables de la
actividad (usuarios de WordPress).
21. Problemas comunes¶
| Problema | Solución |
|---|---|
| No se envían emails | Revisa Actividades → Cola de Correos. El envío es asíncrono por cron (cada minuto) |
| No se generan carteles | Verifica que la extensión PHP Imagick está instalada y activa |
| No aparece el listado público | El archive solo muestra actividades futuras; asegúrate de que la fecha de inicio es futura y el estado es publicado |
| Una cancelación no libera plaza | La liberación aplica a confirmada, pendiente y pendiente_pago; lista_espera y cancelada no consumían plaza |
| Pago completado pero inscripción sin confirmar | Revisa _convoca_needs_manual_review en la inscripción; puede haber aforo agotado durante el pago |
| QR no funciona | El token se invalida al cancelar; regenera o reenvía el email de confirmación desde el detalle de la inscripción |
| Sincronización con Google no arranca | Reautoriza desde Ajustes → Google Calendar / Google Photos |
| No aparecen actividades para un monitor | Verifica que esté asignado en Monitores/Responsables de la actividad |