Convoca Core
Plugin base del ecosistema Convoca. Proporciona la infraestructura compartida que usan el resto de módulos: logging centralizado, webhooks, locks atómicos, rate limiting, panel de control, salud del sistema, asistente de configuración, backup, licencias y branding de documentos. No registra shortcodes ni tipos de contenido propios; esos pertenecen a los módulos (Members, Enroll, Gateway, Shifts).
Requisitos: WordPress 6.4+ · PHP 8.1+ · probado hasta WordPress 7.1.
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. Activación y arranque¶
Al activar el plugin, Convoca Core:
- Crea las tablas de base de datos
convoca_logs,convoca_webhook_retries,convoca_locksyconvoca_member_sequence. - Programa los cron de limpieza de logs (
convoca_log_cleanupyconvoca_log_purge). - Asigna al rol
administratorlas capacidades granularesmanage_convoca_templatesymanage_convoca_logs. - Redirige al Asistente de Configuración en la primera activación (ver sección 6).
Si defines CONVOCA_KEEP_DATA_ON_UNINSTALL (valor verdadero) en wp-config.php, la desinstalación conserva todos los datos; de lo contrario, borra las tablas, opciones y crons del plugin.
2. Menú Convoca y páginas de administración¶
Convoca Core crea el menú superior Convoca (posición 3) en la barra lateral del admin. Las páginas que registra Core son:
| Página | Slug | Capacidad requerida |
|---|---|---|
| Salud del Sistema (página raíz del menú) | convoca-core |
manage_options |
| Panel de Control | conv-dashboard |
manage_options |
| Registros | conv-logs-central |
common_view_logs |
| Notificaciones (oculta del menú) | conv-notificaciones |
manage_options |
| Asistente (oculta del menú) | conv-setup-wizard |
manage_options |
| Copia de Seguridad | conv-backup |
common_manage_backup |
| Licencia | convoca-license |
manage_options |
| Plantillas PDF (bajo Ajustes) | conv-pdf-templates |
manage_convoca_templates |
Las páginas de socios, inscripciones, pagos, turnos, etc. las registran sus propios módulos, no Core. Core solo monta el menú raíz «Convoca» y sus páginas de infraestructura.
3. Panel de Control¶
Convoca → Panel de Control muestra un resumen agregado de todo el ecosistema, con caché de 5 minutos (botón Actualizar datos para refrescar):
| Tarjeta | Fuente |
|---|---|
| Socios activos | Convoca Members |
| Altas este mes | Convoca Members |
| Inscripciones confirmadas | Convoca Enroll |
| En lista de espera | Convoca Enroll |
| Ingresos este mes | Convoca Gateway |
| Turnos sin cubrir | Convoca Shifts |
Además incluye gráficas Chart.js —servidas localmente desde el plugin, sin CDN externo— de tendencia a 6 meses, ingresos mensuales, inscripciones por estado, métodos de pago y pagos de los últimos 7 días. El botón Generar memoria PDF descarga la memoria mensual (sección 15).

4. Salud del Sistema¶
Convoca → Salud del Sistema ejecuta un diagnóstico consolidado de todos los módulos instalados:
- Versión de Convoca Common.
- Estado de los plugins Members, Enroll, Gateway y Shifts (con sus checks internos).
- Existencia de las tablas
convoca_logs,convoca_locksyconvoca_webhook_retries.
Usa Forzar comprobación para repetir el diagnóstico sin caché. El resultado se clasifica en Todo correcto, Advertencias o Errores detectados, con sugerencias de reparación cuando el módulo las aporta.
5. Registros (Logs)¶
Convoca → Registros centraliza todos los logs del ecosistema en la tabla convoca_logs. Cada entrada guarda fecha, nivel (info, warning, error, debug), contexto (p. ej. Common/Security, Gateway/Redsys, Core/Lock), mensaje, usuario y objeto relacionado.
- Filtro por contexto y nivel; buscador; contador aproximado para tablas grandes (>10 000 filas).
- Clic en una entrada abre un modal con el mensaje completo.
- El logger interno está limitado a 50 escrituras por minuto para evitar inundaciones.
Retención (configurable por nivel, vía cron diario):
| Nivel | Días de retención por defecto |
|---|---|
info |
14 |
warning |
30 |
error |
90 |
La retención se ajusta por nivel con la opción convoca_log_retention_days (array nivel→días, get_log_retention_days()), borrando cada día los registros que superan su antigüedad según su level. El exportador de la página de logs permite descargar los logs filtrados como CSV (BOM UTF-8, quoting RFC-4180, cabeceras created_at,level,context,message,user_id,object_id) con el botón «Exportar CSV».
6. Asistente de Configuración¶
Al activar por primera vez (o desde el enlace «Asistente Convoca» de la barra de admin), se abre un asistente de 7 pasos que comprueba y prepara la plataforma:
- Infraestructura — verifica Convoca Common y las tablas de base de datos.
- Páginas — crea las páginas obligatorias
alta-socios,panel-socioypago(con sus shortcodes). - Membresía — edita nombre, modalidad (Numerario/Familiar/Juvenil) y precio de los planes; al renombrar un ID corto migra los socios que lo usan.
- Pagos (Redsys) — guarda
Merchant CodeySecret Key. - Turnos — hora de apertura y cierre del centro.
- Ecosistema — detecta qué módulos están activos y permite elegir el tema de los documentos.
- Finalización — resumen con los requisitos cumplidos/pendientes.
Se puede volver a cualquier paso ya recorrido o Omitir asistente para configurar manualmente. El progreso se guarda en las opciones convoca_setup_wizard_completed, _dismissed y _progress.
6.1 Tema de los documentos (claro/oscuro)¶
En el paso 6 puedes elegir el estilo por defecto de carnets, certificados y emails transaccionales: Claro (por defecto) u Oscuro. Se guarda en la opción convoca_document_theme y puede cambiarse después desde la configuración del módulo correspondiente. El tema aplica al layout de email (Email_Layout) y a los documentos que respetan la opción global.
7. Copia de Seguridad (Backup y Restauración)¶
Convoca → Copia de Seguridad permite exportar e importar datos masivos del ecosistema.
Exportar genera un ZIP con:
- CSVs UTF-8 (con BOM para Excel) de
miembros,inscripciones,proyectosyturnos. settings.jsoncon la configuración de los módulos (solo opciones incluidas en una lista blanca:convoca_gateway_settings,convoca_members_settings,convoca_members_plans,convoca_enroll_settings, horarios y URL del calendario de turnos).
Importar sigue un flujo atómico:
- Subes el ZIP (máx. 500 MB) y se valida su contenido, mostrando una previsualización con el número de registros por entidad.
- Seleccionas qué entidades importar y confirmas. Se crean registros nuevos (los IDs originales se pierden) y se intenta remapear las relaciones internas (p. ej. inscripción → actividad).
- Cada entidad exige su capacidad:
proyectos/inscripciones→manage_inscripciones,miembros→gestionar_miembros,turnos→convoca_shifts_manage_turnos. - Antes de sobrescribir una opción de configuración se guarda una copia
_backup_<fecha>.
La importación usa un lock (convoca_backup_import) para impedir importaciones concurrentes, y el archivo temporal se protege con .htaccess y un token de sesión.
8. Plantillas PDF¶
Ajustes → Plantillas PDF gestiona el HTML de los documentos generados por el sistema de firmas:
| Clave | Documento |
|---|---|
acuerdo_incorporacion |
Acuerdo de Incorporación |
anexo_voluntariado |
Anexo de Voluntariado |
certificado |
Certificado |
desvinculacion |
Acuerdo de Desvinculación |
- Cada plantilla es HTML con placeholders
{{nombre}},{{dni}},{{fecha}}, etc. - Al guardar se crea un backup versionado de las últimas 5 versiones (opción
convoca_pdf_templates_versions). - Si una plantilla se corrompe (HTML inválido), se restaura a los valores por defecto guardando antes una copia de seguridad.
- Validación al guardar: tamaño máximo 500 KB, profundidad DOM < 30, máximo 10 bloques
<style>, sin@importniexpression(), y sanitización de estilos peligrosos. Los usuarios sinunfiltered_htmlven el HTML sanitizado con una lista blanca específica de Dompdf.
Usa Restaurar Plantillas por Defecto para volver al HTML original (pide confirmación).
9. Licencia¶
Convoca → Licencia activa/desactiva la clave de licencia (opción convoca_license) que habilita las funcionalidades PRO. La validación se hace contra la API remota con una petición firmada HMAC anti-replay; si el servidor no responde, guarda la clave en estado pending y reintenta. La cuadrícula de funcionalidades muestra qué módulos PRO están desbloqueados.
Sin licencia, Convoca Core sigue funcionando en modo gratuito.
10. Webhooks salientes¶
Convoca Core implementa el motor de webhooks (Webhook_Manager): los módulos emiten eventos y Core los entrega a las URLs registradas. La interfaz de configuración de las URLs vive en Convoca Members; Core se encarga del almacenamiento (opción convoca_webhooks), la entrega y los reintentos.
Eventos disponibles¶
| Evento | Cuándo se dispara |
|---|---|
member.created |
Nuevo socio registrado |
member.activated |
Socio activado |
member.suspended |
Socio suspendido |
member.expired |
Membresía expirada |
member.renewed |
Membresía renovada |
payment.completed |
Pago completado |
payment.failed |
Pago fallido |
payment.reminder_sent |
Recordatorio de pago enviado |
enrollment.created |
Nueva inscripción |
enrollment.cancelled |
Inscripción cancelada |
enrollment.checkin |
Check-in realizado |
volunteer.hours_logged |
Horas de voluntariado registradas |
volunteer.hours_approved |
Horas de voluntariado aprobadas |
Entrega y firma¶
Cada entrega incluye las cabeceras X-Convoca-Event, X-Convoca-Delivery (UUID único) y, si configuraste un secreto, X-Convoca-Signature con HMAC-SHA256 del cuerpo. Verificación en el receptor:
<?php
$secret = 'tu-secreto-compartido';
$body = file_get_contents( 'php://input' );
$computed = hash_hmac( 'sha256', $body, $secret );
if ( hash_equals( $computed, $_SERVER['HTTP_X_CONVOCA_SIGNATURE'] ?? '' ) ) {
// Firma válida
}
- Deduplicación: mismo evento + payload se omite si se repite en 10 segundos.
- Reintentos con backoff exponencial: 60 s, 120 s, 240 s (máx. 3 intentos), procesados por el cron horario
convoca_webhook_retry. - Registro de entregas: últimas 50 por webhook.
11. Notificaciones internas¶
Core añade una campanita 🔔 en la barra de admin con las notificaciones del ecosistema (pagos fallidos, altas pendientes, horas por aprobar, solicitudes de baja, etc.). Se almacenan por usuario en el meta _convoca_notifications (máx. 50) y se pueden marcar como leídas o descartar desde el desplegable o desde Convoca → Notificaciones. También existen notificaciones por socio (meta del miembro), visibles en su panel.
Las notificaciones llegan a los roles administrator y monitor_actividad, y pueden enviarse además como push vía ntfy.sh (opción convoca_ntfy_config).
Copia de los correos (administrador o monitor)¶
Todo correo que un plugin de Convoca envía a una persona se copia también a la asociación: a los responsables (monitores) de la actividad si el correo es de una actividad, y al correo de administración en cualquier otro caso. Así una alta, una renovación, un certificado o una tarjeta no pasan desapercibidos fuera del panel.
- Mecanismo:
Convoca\Core\Email_Copy(includes/Email_Copy.php). Los correos salen por el mismo canal que el original (se lo inyecta quien invoca), así que heredan el proveedor de correo configurado. - La copia se marca con el asunto
[Copia] …y una cabecera que indica a quién se envió y de dónde viene (plugin, plantilla, actividad o inscripción). No duplica los adjuntos. - Un correo dirigido ya al destinatario de la copia no se copia a sí mismo.
- Activada por defecto. Se apaga desde Ajustes de socios → General (convoca-members) o
con el filtro
convoca_email_copy_enabled.
| Ajuste / filtro | Para qué |
|---|---|
convoca_members_settings[admin_email] |
Correo de administración que recibe las copias. Si está vacío se usa el correo del sitio. |
convoca_members_settings[copy_all_emails] |
Interruptor de la copia (marcado por defecto). |
convoca_email_copy_enabled |
Fuerza activada/desactivada por código. |
convoca_email_copy_recipients |
Sustituye la lista de destinatarios (por ejemplo, varios correos). |
convoca_email_copy_payload |
Ajusta asunto, cuerpo y cabeceras antes de enviar. |
Correo de administración distinto del remitente
Si el correo de administración es el mismo que el remitente del sitio, las copias llegan al propio remitente y nadie las lee. Configura ahí el correo de secretaría o el de la organización.
12. Seguridad: rate limiter, locks y Security Monitor¶
Protecciones automáticas que no requieren configuración:
- Rate limiter (
Utils::check_rate_limit): por defecto 10 peticiones por ventana de 5 minutos por IP, con contador atómico en base de datos (INSERT ON DUPLICATE KEY). Se aplica a formularios y endpoints públicos. - Locks atómicos (
Utils::acquire_lock/release_lock): evitan condiciones de carrera (p. ej. sobreventa de plazas) usando la tablaconvoca_locks, con fallback awp_options. - Security Monitor: observa accesos 401/403 a rutas REST de Convoca (
rest_post_dispatch) y registra la contención de locks. Un digest diario (convoca_security_digest) envía email al administrador cuando en 24 h se superan los umbrales (configurables con el filtroconvoca_security_thresholds):
| Métrica | Umbral por defecto |
|---|---|
Fallos de firma Redsys (Ds_Signature) |
3 |
| Contenciones de lock | 10 |
| Accesos REST no autorizados | 20 |
| Rate limits excedidos | 50 |
El digest se envía como máximo una vez al día (anti-spam).
13. Branding: logo del sitio y tema de documentos¶
- Logo: los emails y PDFs usan el logo del sitio WordPress (
custom_logodel tema). No hay fallback a un logo interno del plugin: si no haycustom_logo, se muestra el nombre del sitio. Filtro:convoca_{contexto}_logo_url(p. ej.convoca_email_logo_url). - Tema de documentos: opción
convoca_document_theme(lightpor defecto,dark). La exponeUtils::get_document_theme()con filtrosconvoca_document_themeyconvoca_document_theme_{contexto}(p. ej.convoca_document_theme_email).
14. Bloques y assets del frontend¶
- Bloque: Core registra el bloque
convoca-common/post-meta-field(muestra un postmeta formateado: texto, fecha, precio o número) y crea las categorías de bloquesconvoca-core,convoca-enroll,convoca-members,convoca-turnosyconvoca-gateway. - Assets comunes: los estilos
convoca-corey el scriptconvoca-common-jsse registran siempre (no se imprimen por sí solos) para que los shortcodes de los módulos —incluidos los renderizados dentro de plantillas FSE, que corren después dewp_enqueue_scripts— puedan declararlos como dependencia sin que WordPress los descarte. Se encolan solo cuando la página contiene un shortcode[convoca_*]o un plugin lo pide con el filtroconvoca_need_common_assets:
<?php
// Forzar los assets comunes en una página concreta
add_filter( 'convoca_need_common_assets', function ( $needed ) {
return is_page( 'mi-pagina-convoca' ) ? true : $needed;
} );
El asistente crea páginas con shortcodes que pertenecen a los plugins de cada área (
[convoca_alta_socio]y[convoca_mi_area]en Members,[convoca_pago]en Gateway). Verifica que cada página contenga su shortcode real y las repara si no.
15. Shortcodes de interfaz y contenido¶
Core registra los shortcodes que necesitan las plantillas del theme (los ficheros .html de FSE no ejecutan PHP). No inventan datos: si no hay menú, redes, relacionadas, cifras o fecha de evento, devuelven vacío.
| Shortcode | Qué pinta | Fuente de datos |
|---|---|---|
[convoca_menu location="top" class="convoca-nav"] |
Un menú clásico de WordPress | Ubicaciones de menú del tema |
[convoca_socials] |
Los enlaces de redes del sitio | Filtro convoca_social_links |
[convoca_cuando] |
Fecha (y fin) del evento de la entrada | Meta de evento de la entrada |
[convoca_donde] |
Lugar del evento | Meta de evento de la entrada |
[convoca_relacionadas number="3"] |
Entradas de la misma categoría | Categorías de la entrada |
[convoca_stats] |
Cifras reales del sitio | \Convoca\Core\site_stats() |
16. Datos de evento de una entrada¶
Core añade a la ficha de edición de la entrada el bloque Evento (marcar el contenido como evento, fecha de inicio, fecha de fin, lugar y precio) y escribe las claves canónicas _convoca_has_event, _convoca_event_start_date, _convoca_event_end_date, _convoca_event_address y _convoca_event_price. El theme publica el schema.org y pinta esos datos, pero no los guarda.
El precio (_convoca_event_price) es el precio por persona en euros y alimenta offers.price del datos estructurados del evento: sin él, una actividad de pago se anunciaba como gratuita. Se normaliza al guardar con event_price_sanitize(): acepta coma o punto decimal, exige un número válido y no negativo, y guarda dos decimales. Vacío = evento gratuito, y un valor inválido borra el meta en lugar de inventarse un precio.
- Filtro
convoca_event_meta_legacy_keys: mapaclave canónica => clave antiguapara que un sitio con datos históricos (por ejemplo_legacy_event_*) los siga leyendo sin que el producto arrastre el nombre de ninguna asociación. - Filtro
convoca_site_stats: ajusta o amplía las cifras de[convoca_stats]. - Filtro
convoca_social_links: arrayservicio => URL(máshandleopcional) que alimenta[convoca_socials]y los tokens{social_*}del pie del theme.
15. Memoria mensual PDF¶
El botón Generar memoria PDF del Panel de Control genera un PDF (Dompdf) con el resumen mensual de la asociación: socios, altas, inscripciones, ingresos y turnos. El cron semanal (convoca_weekly_event) la genera automáticamente durante la primera semana de cada mes y la guarda en wp-content/uploads/convoca-memorias/, notificando al administrador por email.
16. Extras para desarrolladores¶
- Registro de módulos: los módulos externos se registran con el filtro
convoca_register_module; Core validacore_min, funcionalidades PRO y capacidades, y disparaconvoca_module_registered. - Performance Probe: añade
?convoca_probe=1a cualquier URL (solo admins) para ver tiempo total, memoria pico, hooks lentos y queries lentas al final de la página. - Layout de email:
Email_Layout::render()genera emails HTML con la identidad visual (naranja#FF8700+ púrpura#320028) respetando el tema claro/oscuro. - Firmas PDF:
Signaturegenera PDFs desde plantillas HTML con reemplazo de placeholders, sello de aceptación con hash SHA-256 y protección del directorio de salida.
Referencia técnica¶
Capacidades personalizadas¶
Definidas en Capabilities::get_all() y asignadas a roles en plugins_loaded (no hace falta reactivar el plugin tras una actualización):
| Capacidad | Descripción | Roles |
|---|---|---|
gestionar_mis_turnos |
Gestionar mis turnos (voluntarios) | administrator, monitor_actividad, voluntario_aprobado |
convoca_shifts_manage_turnos |
Gestionar turnos del calendario | administrator, monitor_actividad |
convoca_shifts_view_stats |
Ver estadísticas de turnos | administrator, monitor_actividad |
convoca_shifts_audit_hours |
Auditoría de horas de voluntarios | administrator, monitor_actividad |
convoca_manage_checkin |
Hacer check-in de asistentes | administrator, monitor_actividad |
convoca_manage_evaluations |
Gestionar evaluaciones | administrator, monitor_actividad |
convoca_view_reports |
Ver informes de actividades | administrator, monitor_actividad |
convoca_manage_hours |
Gestionar horas de voluntarios (aprobar) | administrator, monitor_actividad |
convoca_export_members |
Exportar listado de socios | administrator |
convoca_manage_webhooks |
Gestionar webhooks | administrator |
convoca_view_payments |
Ver pagos y dashboard | administrator |
convoca_manage_payments |
Gestionar pagos manualmente | administrator |
common_view_logs |
Ver logs del sistema | administrator |
common_manage_backup |
Gestionar copias de seguridad | administrator |
Capacidades adicionales referenciadas en Utils (usadas por los módulos): manage_inscripciones, gestionar_miembros, gestionar_documentos_voluntariado, view_reports, manage_convoca_templates, manage_convoca_logs, manage_convoca_gateway.
Roles¶
Core asigna capacidades a estos roles, que crean sus respectivos módulos (Core no los registra):
| Rol | Capacidades que Core le asigna |
|---|---|
administrator |
Todas las granulares + manage_convoca_templates + manage_convoca_logs |
monitor_actividad |
gestionar_mis_turnos, convoca_shifts_*, convoca_manage_checkin, convoca_manage_evaluations, convoca_view_reports, convoca_manage_hours |
voluntario_aprobado |
gestionar_mis_turnos |
Tablas de base de datos¶
| Tabla | Uso |
|---|---|
convoca_logs |
Logs centralizados |
convoca_locks |
Locks atómicos |
convoca_webhook_retries |
Cola de reintentos de webhooks |
convoca_member_sequence |
Secuencia para número de socio |
Cron¶
| Hook | Frecuencia | Función |
|---|---|---|
convoca_log_cleanup |
diario | Retención 90 días / 1 año (errores) |
convoca_log_purge |
diario | Retención 60 días |
convoca_continue_access_codes |
horario (condicional) | Continúa generando códigos de acceso |
convoca_webhook_retry |
horario (condicional) | Reintentos de webhooks |
convoca_security_digest |
diario | Digest de seguridad por email |
convoca_weekly_event |
(registrado) | Memoria mensual automática |
convoca_license_validate |
(registrado) | Validación de licencia |
API REST¶
| Método | Ruta | Respuesta | Permiso |
|---|---|---|---|
| GET | /wp-json/convoca/v1/admin/metrics |
timestamp, php_version, wp_version |
manage_options |
Hooks y filtros públicos (prefijo convoca_)¶
Acciones que dispara Core: convoca_module_registered.
Acciones que Core escucha (de los módulos): convoca_members_estado_changed, convoca_members_created, convoca_members_membership_expired, convoca_gateway_payment_completed, convoca_gateway_payment_failed, convoca_members_payment_reminder_sent, convoca_enroll_inscripcion_nueva, convoca_enroll_inscripcion_cancelada, convoca_enroll_asistencia_cambiada, convoca_members_hours_submitted, convoca_members_hora_aprobada, convoca_members_hora_rechazada, convoca_member_created, convoca_payment_failed, convoca_hours_submitted, convoca_inscripcion_pendiente_pago, convoca_voluntario_pendiente, convoca_members_unsubscribe_request, convoca_voluntario_aprobado.
Filtros: convoca_document_theme, convoca_document_theme_{contexto}, convoca_need_common_assets, convoca_security_thresholds, convoca_admin_appearance_url, convoca_common_webhook_sslverify, convoca_register_module, convoca_license_api_url, convoca_pdf_html_safe_keys, convoca_pdf_allowed_html, convoca_{contexto}_logo_url.
Convención de metadatos (postmeta) que Core lee/escribe¶
Core no registra los tipos de contenido, pero lee y escribe estos metas sobre CPTs que pertenecen a sus módulos (Members, Enroll, Gateway, Shifts):
| CPT (módulo) | Metas usadas por Core |
|---|---|
miembro (Members) |
_convoca_email, _convoca_dni, _convoca_plan, _convoca_estado_miembro, _convoca_vencimiento, _convoca_access_code, _convoca_fecha_renovacion |
inscripcion (Enroll) |
_convoca_nombre, _convoca_email, _convoca_estado, _convoca_actividad_id |
proyecto (Members/Enroll) |
_convoca_fecha_inicio, _convoca_fecha_fin, _convoca_activo |
pago (Gateway) |
_convoca_status, _convoca_amount_cents, _convoca_method, _convoca_paid_at, _convoca_origin_id |
centro_turno (Shifts) |
_estado, _estado_real, _hora_fin, _id_responsable |
registro_hora (Members) |
_convoca_horas, _convoca_descripcion |
Los metadatos con prefijo _ son privados (no aparecen en el editor de WordPress por defecto).