Convoca Enroll
Guía para administradores: gestión de actividades e inscripciones.
1. Introducción¶
Convoca Enroll gestiona el ciclo completo de actividades: desde su creación hasta el check-in de asistentes. Permite crear actividades, configurar plazas y precios, procesar inscripciones con control de aforo, gestionar lista de espera, hacer check-in con QR, y exportar datos a CSV.
Requiere: convoca-core activo.
2. Configuración inicial¶
Accede a Convoca → Enroll → Ajustes:
| Ajuste | Descripción |
|---|---|
| Email de notificaciones | Dirección que recibe avisos de nuevas inscripciones |
| Plantillas de email | Personaliza el asunto y cuerpo de los correos de confirmación, cancelación y recordatorio |
| Google Calendar | Conecta una cuenta de Google para sincronizar actividades |
| Google Photos | Conecta un álbum de Google Photos para fotos de actividades |
| Recordatorios | Configura días de antelación para enviar recordatorios automáticos |
Conectar Google Calendar¶
- Ve a Convoca → Enroll → Ajustes → Google Calendar
- Haz clic en Conectar cuenta de Google
- Autoriza a Convoca para gestionar calendarios
- Selecciona el calendario donde se crearán los eventos
3. Crear una actividad¶
- Ve a Actividades → Añadir nueva
- Rellena el título (ej: "De pajareo a Somiedo")
- Escribe la descripción en el editor de bloques
- En el panel lateral Datos de la actividad, configura:
| Campo | Descripción |
|---|---|
| Fecha y hora de inicio | Cuándo empieza la actividad |
| Fecha y hora de fin | Cuándo termina (opcional) |
| Ubicación | Dirección o lugar (ej: "Parque de Somiedo, Asturias") |
| Plazas totales | Número máximo de asistentes |
| Precio general | Precio para no socios |
| Precio socio | Precio para socios |
| Estado | Publicada, Borrador, Cancelada |
- Asigna una imagen destacada (se usará en listados y redes sociales)
- Selecciona las categorías adecuadas (Rutas, Talleres, Voluntariado…)
- Haz clic en Publicar
Shortcodes¶
Usa [convoca_inscripcion_page] en una página para mostrar el listado de actividades con su formulario de inscripción:
Para mostrar el formulario de inscripción de una actividad concreta:
El panel de reservas del usuario:
4. Gestionar inscripciones¶
Cada actividad tiene su panel de inscripciones en Actividades → [nombre] → Inscripciones.
| Acción | Cómo hacerlo |
|---|---|
| Ver inscritos | El panel muestra nombre, email, fecha y estado |
| Cancelar inscripción | Haz clic en Cancelar junto al nombre |
| Añadir a lista de espera | Si las plazas están llenas, nuevos inscritos van automáticamente a espera |
| Promover de espera | Cuando hay baja, el sistema promueve automáticamente al siguiente en espera |
| Exportar CSV | Botón Exportar → descarga lista de inscritos |
Cómo se inscribe un usuario¶
El usuario accede a la página de la actividad, ve el formulario con plazas disponibles y precio, y completa sus datos. El sistema:
- Verifica que hay plazas disponibles
- Bloquea atómicamente la plaza (evita overbooking)
- Si no hay plazas, ofrece lista de espera
- Envía email de confirmación al usuario y al administrador
5. Check-in con QR¶
Cada inscripción confirmada genera un QR único que permite hacer check-in el día del evento.
Como administrador¶
- Ve a la actividad y abre el panel de Check-in
- Escanea el QR del asistente (desde su email o móvil)
- El sistema registra la hora de llegada
- También puedes hacer check-in manual buscando por nombre o email
Como asistente¶
El asistente recibe un email de confirmación con su QR. Puede mostrarlo desde el móvil al llegar a la actividad.
6. Evaluaciones¶
Después de una actividad, Convoca Enroll envía automáticamente un formulario de evaluación a los asistentes:
- El sistema espera 24h tras la finalización
- Envía un email con enlace al formulario
- Las respuestas se almacenan en Actividades → Evaluaciones
- Puedes ver estadísticas agregadas desde el panel
7. Google Calendar¶
Si configuraste la integración:
- Las actividades se crean automáticamente como eventos en Google Calendar
- Los cambios en fecha/hora se sincronizan
- Las cancelaciones eliminan el evento
- El enlace de Google Calendar aparece en la página de la actividad
8. Google Photos¶
Si configuraste la integración:
- Crea álbumes automáticamente para cada actividad
- Sube la imagen destacada como portada
- Los asistentes pueden subir fotos si se habilita
9. CRM — Seguimiento de inscripciones¶
El Monitor CRM en Convoca → Enroll → CRM muestra:
- Total de inscripciones por mes
- Tasa de ocupación por actividad
- Asistentes recurrentes
- Actividades más populares
10. Problemas comunes¶
| Problema | Solución |
|---|---|
| No se envían emails | Verifica que el servidor tenga wp_mail() funcionando. Revisa la cola en Convoca → Registros |
| Error al conectar Google | Reautoriza desde Ajustes → Google. Los tokens expiran cada hora (se refrescan automáticamente) |
| Plazas no se actualizan | Ve a Convoca → Salud del Sistema y pulsa Forzar comprobación |
| QR no funciona | Verifica que el asistente tiene el email de confirmación. Regenera el QR desde el panel de inscripciones |
| No aparecen actividades en el frontend | Asegúrate de que el estado es "Publicada" y la fecha no es pasada |
11. Shortcodes y bloques¶
| Shortcode/Bloque | Uso |
|---|---|
[convoca_inscripcion_page] |
Página de actividades con inscripción |
[convoca_form_inscripcion id="123"] |
Formulario de inscripción de una actividad concreta |
[convoca_panel_reservas] |
Panel de reservas del usuario |
[convoca_actividad_meta field="ubicacion"] |
Muestra metadato de la actividad actual |
[convoca_inscripcion_actual] |
Formulario de inscripción de la actividad actual (página singular) |
[convoca_evaluacion] |
Formulario de evaluación post-actividad |
| Bloque | Registro |
| -------- | ---------- |
convoca-enroll/inscripcion |
Block_Inscripcion.php |
convoca-enroll/panel-reservas |
Block_Inscripcion.php |
convoca-enroll/pagina-inscripcion |
Block_Inscripcion.php |
convoca-enroll/evaluacion |
Block_Inscripcion.php |
convoca-enroll/lista-espera |
Block_Inscripcion.php |
12. API REST¶
Convoca Enroll expone endpoints REST para integraciones:
GET /wp-json/convoca-enroll/v1/actividades
GET /wp-json/convoca-enroll/v1/inscripciones?actividad_id=123
POST /wp-json/convoca-enroll/v1/checkin
Permisos: GET /actividades es público; los demás requieren manage_inscripciones (o rol voluntario_aprobado para check-in).
Referencia técnica¶
Poster Endpoints¶
POST /convoca/v1/media/poster/render¶
Generate a poster for an activity.
Capability: conv_manage_media
Request Body:
Response 200:
{
"files": { "square": "/path/to/poster.png" },
"url": "https://.../poster-100-nature-classic-square.png"
}
POST /convoca/v1/media/poster/regenerate¶
Regenerate (force) a poster, clearing caches.
Capability: conv_manage_media
Request Body:
Response 200: Same as render.
Template Endpoints¶
GET /convoca/v1/media/templates¶
List all available templates.
Capability: conv_manage_media
Response 200: Array of template objects with id, name, slug, description, config.
GET /convoca/v1/media/templates/{id}¶
Get a single template.
Capability: conv_manage_media
Response 200: Single template object.
Blog Endpoints¶
POST /convoca/v1/media/blog/create¶
Create or update a blog post for an activity.
Capability: conv_manage_media
Request Body:
Response 200:
Social OAuth Endpoints¶
GET /convoca/v1/social/auth/meta¶
Redirect to Facebook OAuth dialog.
Capability: conv_manage_social
Query Params: None (state auto-generated)
GET /convoca/v1/social/callback/meta¶
OAuth callback from Meta. Exchanges code for long-lived token, discovers Pages + Instagram.
Permission: Public (OAuth redirect)
GET /convoca/v1/social/auth/google¶
Redirect to Google OAuth consent screen.
Capability: conv_manage_social
GET /convoca/v1/social/callback/google¶
OAuth callback from Google. Exchanges code for access + refresh tokens.
Permission: Public (OAuth redirect)
Account Management¶
GET /convoca/v1/social/accounts¶
List connected social accounts.
Capability: conv_manage_social
Response 200: Array of accounts with network, account_name, token_expires_at, is_active.
DELETE /convoca/v1/social/accounts/{id}¶
Disconnect a social account.
Capability: conv_manage_social
Response 200: { "success": true }
Error Response Format¶
All endpoints return standard WP REST errors:
{
"code": "rest_forbidden",
"message": "Sorry, you are not allowed to do that.",
"data": { "status": 401 }
}
Referencia técnica¶
Overview¶
Convoca Enroll v2.7.0 is a WordPress plugin for activity management with an integrated Media & Social Suite for automated poster generation and social media publishing.
┌─────────────────────────────────────────────────────────┐
│ WordPress │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Convoca Core (v2.1.3) │ │
│ │ Utils · Logger · Capabilities · Installer │ │
│ └──────────┬────────────────────────────────────────┘ │
│ │ depends on │
│ ┌──────────▼────────────────────────────────────────┐ │
│ │ Convoca Enroll (v2.7.0) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────┐ ┌──────────┐ │ │
│ │ │ Poster │ │ Social │ │ Admin │ │ │
│ │ │ Engine │ │ Publisher │ │ UI │ │ │
│ │ │ (media/) │ │ (social/) │ │ (admin/) │ │ │
│ │ └─────────────┘ └──────────────┘ └──────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
Database Schema (4 custom tables)¶
| Table | Purpose | Key Columns |
|---|---|---|
wp_conv_media_templates |
Poster template definitions (JSON) | id, slug, config (LONGTEXT JSON), is_system |
wp_conv_social_accounts |
OAuth tokens (encrypted via openssl) | id, network, access_token, refresh_token, token_expires_at |
wp_conv_social_queue |
Social publishing queue | id, status, scheduled_at, attempts, last_error |
wp_conv_media_logs |
Audit log for all operations | object_type, action, status, context, duration_ms |
Token Encryption¶
Social OAuth tokens are encrypted using openssl_encrypt() with AES-256-CBC.
$key = defined('CONVOCA_SOCIAL_KEY') ? CONVOCA_SOCIAL_KEY : wp_salt('auth');
$iv = substr(wp_salt('nonce'), 0, 16);
$encrypted = base64_encode(openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv));
Poster Engine — 3-Pass Pipeline (v3)¶
- Pass 1 (HTML Compilation): Inject activity data (title, date, price, QR, hero image) into an HTML/CSS template file. Full CSS3 support (Flexbox, Grid, gradients, shadows).
- Pass 2 (PDF Rendering): Render the HTML to a 1-page PDF via mPDF (
mpdf/mpdfv8). Pixel-perfect vector output. - Pass 3 (Rasterization): Open the PDF page with Imagick at appropriate DPI, resize to final format dimensions, export as PNG/WebP/JPG. Temporary PDF is deleted after conversion.
Template System¶
- Templates are PHP files in
templates/html/that output HTML5 + CSS3. - Variables injected:
$title,$date,$time,$location,$price,$hero_image,$qr_image,$logo_image,$primary_color,$accent_color,$org_name,$type_label,$type_icon,$format,$width,$height. - Legacy JSON templates in
media/templates/are automatically used as fallback via a basic HTML wrapper.
Format Dimensions¶
| Format | Width | Height | Use Case |
|---|---|---|---|
| square | 1080 | 1080 | Instagram Feed |
| portrait | 1080 | 1350 | Instagram Portrait |
| story | 1080 | 1920 | Instagram Stories |
| 1200 | 630 | Open Graph | |
| banner | 1920 | 1080 | Web banner |
| a4 | 2480 | 3508 |
Action Scheduler Integration¶
All social publishing is async via Action Scheduler (bundled with WooCommerce).
save_post_actividad hook
↓
as_unschedule_all_actions() (remove duplicates)
↓
as_schedule_single_action() (enqueue)
↓
Action Scheduler worker
↓
convoca_publish_social_post hook
↓
Meta_Provider or GBP_Provider::publish()
Module Dependencies¶
| Module | Depends On |
|---|---|
| Poster Engine (media/) | Convoca Core (Utils), Imagick/GD |
| QR Generator | chillerlan/php-qrcode (composer) |
| Social Publisher (social/) | Poster Engine, Action Scheduler, openssl |
| Admin UI (admin/) | Poster Engine, Social Publisher |
Security¶
- Capabilities:
conv_manage_media,conv_publish_social,conv_manage_social,conv_view_media_logs - Nonces: All AJAX and REST endpoints require nonce verification
- CSRF: OAuth flows use
wp_generate_password(32)state parameter with transient validation - Idempotency: Transient-based lock (5 min TTL) prevents concurrent duplicate publishing
Referencia técnica¶
Architecture: HTML → PDF → Image¶
Instead of composing images pixel-by-pixel with Imagick, the v3 engine follows an editorial-grade pipeline:
Why This Approach¶
- CSS3 native: Flexbox, Grid, gradients, shadows, border-radius — no manual coordinate calculations
- Google Fonts: Load any font via
@import url(...)without TTF files on the server - Maintainable: Edit posters by modifying HTML/CSS files, not PHP array logic
- Clean rasterization: Imagick only handles mechanical PDF→PNG conversion (DPI, resize, export)
Pipeline Details¶
- Pass 1 — HTML Compilation (
compile_html()) - Reads PHP template from
templates/html/{slug}.php - Injects activity data as extracted variables
-
Returns full HTML document with
<style>block -
Pass 2 — PDF Rendering (
html_to_pdf()) - Uses
mpdf/mpdfv8 with format set to exact pixel dimensions - No margins, no page breaks
-
Temporary PDF stored in uploads
convoca-temp/ -
Pass 3 — Rasterization (
pdf_to_image()) - Opens PDF page 1 with Imagick at ~360 DPI
- Resizes to exact format dimensions (Lanczos filter)
- Strips metadata, sets quality (92% for JPEG/WebP)
- Deletes temporary PDF
Template Variables¶
All PHP templates in templates/html/ receive:
| GET | /admin/users/search | Búsqueda de usuarios para check-in (admin) |
| POST | /checkin/flush | Limpiar caché/estado de check-in |
| GET | /ics | Exportar calendario iCal de las actividades |
| GET | /me/session-status | Estado de sesión del usuario |
| GET | /stats/{actividad_id} | Estadísticas de una actividad |