ODSLocal Data Editor
PHP ≥ 8.1
WordPress ≥ 6.0
Requiere ODSLocal Municipios
1. Qué hace
ODSLocal Data Editor da a los colaboradores un editor frontend amigable para introducir y actualizar valores de indicadores ODS por municipio, con un pipeline de revisión completo y notificaciones por email.
Pensado como alternativa accesible al panel de WordPress para usuarios sin rol administrativo.
- Autosave cada 3 minutos en modo borrador.
- Filtros por scope: cada usuario solo ve los municipios y grupos ODS que tiene asignados.
- Notificaciones por email al cambiar el estado de las mediciones.
- Redirección post-login para roles ODS-only que no deben entrar a
wp-admin.
2. Instalación
- Asegúrate de tener ODSLocal Municipios activo.
- Copia
odslocal-data-editor/awp-content/plugins/. - Actívalo. En la primera carga se crea automáticamente la página «Editor de datos ODS» en
/editor-datos-ods/con el shortcode.Debes iniciar sesión para introducir datos.
- Asigna las capabilities necesarias a los roles (ver §3).
- Configura los scopes territorio/ODS de cada usuario en Municipios → Gestión de accesos.
3. Roles y capabilities
| Capability | Quién la necesita | Qué permite |
|---|---|---|
ods_edit_own |
Cualquier colaborador | Editar las mediciones que él mismo introdujo mientras están en draft. |
ods_edit_assigned |
Investigador, gestor municipal | Editar los territorios/grupos asignados por scope. |
ods_edit_all |
Admin, gestor de plataforma | Editar cualquier municipio / ODS. |
ods_validate |
Validador/a | Aprobar o rechazar mediciones pendientes. |
4. Uso para colaboradores
4.1 Acceder al editor
Tras iniciar sesión, abrir /editor-datos-ods/ (o la pestaña Aportar datos del Hub si está instalado Contributor Profiles).
4.2 Seleccionar municipio
- Si tu usuario tiene 1 solo municipio asignado, se selecciona automáticamente.
- Si tienes ≤ 50 municipios asignados, aparecen en un selector.
- Si tienes más (o eres admin con acceso global), aparece un buscador con autocompletado: escribe nombre o código INE (3+ caracteres).
4.3 Elegir año
Por defecto el año actual. Puedes editar valores de años anteriores si necesitas completar series históricas.
4.4 Rellenar indicadores
Los 178 indicadores ODS están agrupados por ODS1..ODS17 en acordeones. Abre el grupo que quieres editar y rellena:
- Valor — número, puede usar coma o punto como decimal.
- Fuente (opcional) — p. ej. INE, Ministerio, elaboración propia.
- URL de evidencia (opcional) — solo
http://ohttps://. - Notas (opcional) — texto libre.
4.5 Guardar
| Acción | Estado resultante |
|---|---|
| Guardar como borrador | draft — solo visible para ti. |
| Enviar a revisión | pending — notifica a revisores. |
| Autosave automático | draft cada 3 min si has modificado algo. |
ods_edit_allSi guardas con rol admin/gestor con
ods_edit_all, las mediciones se marcan directamente como approved sin pasar por pending. Este atajo acelera la carga masiva por un equipo técnico.
5. Revisión y validación
Usuarios con ods_validate disponen de:
5.1 Página Admin
Municipios → Revisión de datos:
- Lista de mediciones
pending, paginada. - Filtros por municipio, indicador, año, autor.
- Acciones en lote: aprobar / rechazar con motivo.
5.2 Acción por batch
- Marca las filas a aprobar.
- Pulsa Aprobar seleccionadas.
- Las mediciones pasan a
approvedy se dispara el hookodslocal_measurements_validatedcon la lista de IDs y la decisión. - Cada autor afectado recibe un email resumen.
5.3 Rechazo
Al rechazar se pide un motivo (obligatorio). Se guarda en el campo rejection_reason de la medición. El autor lo ve al reabrir el editor y puede corregir y re-enviar.
6. Panel de administración
Elementos añadidos al panel WP:
- Municipios → Revisión de datos — fila de pendientes con badge contador (cache de 1 request).
- Redirect post-login para usuarios ODS-only: al loguearse van directos a
/editor-datos-ods/.
Ocultar wp-admin a roles ODS
Los roles sin edit_posts (p. ej. ods_researcher) reciben 403 si intentan entrar a /wp-admin/, excepto a admin-ajax.php (necesario para el editor) y a sus propias pantallas de revisión.
7. Endpoints AJAX
Todos requieren nonce odslocal_editor_nonce y usuario autenticado con la capability correspondiente.
| Action | Capability | Propósito |
|---|---|---|
odslocal_editor_municipalities |
edit caps | Listar/buscar municipios dentro del scope. |
odslocal_editor_load |
edit caps | Cargar indicadores y mediciones existentes para un territorio/año. |
odslocal_editor_save |
edit caps | Enviar valores (draft → pending/approved). |
odslocal_editor_save_draft |
edit caps | Guardar borrador sin notificar. |
odslocal_editor_pending |
ods_validate |
Listar mediciones pendientes. |
odslocal_editor_approve |
ods_validate |
Aprobar/rechazar un batch con motivo opcional. |
8. Formatos numéricos
El servidor normaliza notación europea antes de persistir:
| Entrada | Se guarda como |
|---|---|
3,14 |
3.14 |
1.234,56 |
1234.56 |
1,234.56 |
1234.56 |
−3,5 (minus unicode) |
-3.5 |
9. Accesibilidad
- Cabeceras de grupos ODS operables por teclado (
role="button",tabindex="0",aria-expanded). - Toggle con Enter y Espacio.
- Focus ring visible.
- Etiquetas
labelasociadas a cada input.
10. Seguridad
- Todos los AJAX verifican nonce + capability + scope territorial.
- Texto sanitizado con
sanitize_text_field/sanitize_textarea_field. - URLs de evidencia solo aceptan esquema
httpohttps. - Cap de 500 indicadores por petición para mitigar payloads abusivos.
- La configuración inline JSON usa
JSON_HEX_TAG | JSON_HEX_APOSpara prevenir</script>injection.
11. Notificaciones por email
Se envían en estos eventos:
| Evento | Destinatarios |
|---|---|
| Medición aprobada | Autor de la medición. |
| Medición rechazada | Autor, con el motivo. |
| Nueva tanda pendiente (> 5 filas) | Usuarios con ods_validate dentro del scope del territorio. |
Los correos son texto plano. El enlace al editor usa la URL correcta del panel edit.php?post_type=municipio&page=….
12. Traducciones
- Text domain:
odslocal-editor. languages/odslocal-editor.pot— plantilla.odslocal-editor-gl_ES.po/.mo— galego.- Los strings del JS se sirven pre-traducidos vía
wp_localize_script(cfg.i18n).
# Regenerar POT
wp i18n make-pot . languages/odslocal-editor.pot --domain=odslocal-editor
# Compilar .mo
wp i18n make-mo languages
13. Solución de problemas
«No tienes municipios asignados»
El usuario no tiene ningún scope. Asígnale uno en Municipios → Gestión de accesos.
El autosave no funciona
- ¿El navegador tiene la pestaña activa? El autosave se pausa en segundo plano para ahorrar recursos.
- ¿El nonce ha expirado (24h por defecto)? Recarga la página.
Los revisores no reciben email
- Verifica que
wp_mailfunciona (instala WP Mail SMTP si usas un host con bloqueo saliente). - Revisa que existen usuarios con
ods_validatecuyo scope cubra el territorio en cuestión.
El valor aparece como 0 al guardar
Probablemente introdujiste algo no numérico. Revisa el campo; el normalizador rechaza strings sin dígitos.