ODSLocal Data Export
PHP ≥ 8.1
WordPress ≥ 6.0
Requiere ODSLocal Municipios
CC BY 4.0
1. Qué hace
Add-on de exportación abierta para ODSLocal Municipios. Cualquier visitante (o sistema externo) puede descargar las mediciones aprobadas en:
- CSV — UTF-8 con BOM, cabecera RFC-compliant, compatible con Excel.
- XLSX — Excel nativo (requiere PhpSpreadsheet) o fallback automático a CSV.
- JSON — objetos estructurados con metadatos.
Todos los ficheros incluyen cabecera con nombre de la organización, URL, licencia CC BY 4.0 y timestamp UTC.
2. Instalación
- Asegúrate de tener ODSLocal Municipios activo.
- (Opcional) Para XLSX real:
composer require phpoffice/phpspreadsheeten la raíz de WordPress. Sin esto, los endpoints XLSX hacen fallback a CSV. - Sube
odslocal-data-export/awp-content/plugins/. - Actívalo. Se crea la tabla
wp_odslocal_export_logy aparece el submenú Municipios → Exportar datos.
3. Shortcode de panel público
Plataforma ODSLocal España — Datos Abiertos ODS
Por municipio
Selecciona un municipio para habilitar la descarga.
Por indicador
Renderiza un panel completo con:
- Búsqueda de municipio con autocompletado (mín. 2 caracteres) accesible por teclado (↑/↓/Enter/Esc).
- Filtros por grupo ODS y año.
- Botones de descarga por formato (CSV / XLSX / JSON) para el municipio seleccionado.
- Descarga por indicador: selecciona un indicador y año, descarga valores para todos los municipios.
El panel funciona sin autenticación. Solo devuelve mediciones approved.
4. Panel administrador
En Municipios → Exportar datos (requiere manage_options):
- Estadísticas — total de mediciones aprobadas, municipios cubiertos, indicadores.
- Descarga en lote por año — en un click, todas las mediciones aprobadas de un año concreto.
- Historial de exportaciones — últimos logs con filtros por usuario, tipo, fecha.
- Identidad de la organización — aviso amarillo si no está configurada; enlace directo a Ajustes → Contributor Profiles.
5. Endpoints REST
Namespace base: /wp-json/odslocal-export/v1.
| Método | Ruta | Qué devuelve |
|---|---|---|
| GET | /municipality/{code_ine}/csv |
Todos los indicadores aprobados del municipio en CSV. |
| GET | /municipality/{code_ine}/json |
Idem en JSON. |
| GET | /municipality/{code_ine}/xlsx |
Idem en XLSX (o fallback CSV). |
| GET | /indicator/{indicator_key}/csv?year=YYYY |
Un indicador para todos los municipios. |
| GET | /indicator/{indicator_key}/json?year=YYYY |
Idem JSON. |
| GET | /bulk/csv?year=YYYY |
Descarga completa por año (1 req / 60 s / IP). |
| GET | /territories?q=… |
Autocompletado (mín. 2 chars). |
Parámetros opcionales en /municipality/*: ods_group, year.
Ejemplos
# CSV completo de Vigo
curl -O "https://odslocal.es/wp-json/odslocal-export/v1/municipality/36057/csv"
# JSON solo de ODS3 en Vigo
curl "https://odslocal.es/wp-json/odslocal-export/v1/municipality/36057/json?ods_group=ODS3"
# Todos los datos aprobados del año 2023
curl -O "https://odslocal.es/wp-json/odslocal-export/v1/bulk/csv?year=2023"
6. Formatos de salida
6.1 CSV
- Codificación: UTF-8 con BOM (para que Excel abra sin caracteres raros).
- Separador: coma.
- Nueva línea: CRLF.
- Campos con coma, comilla o CR/LF van entre comillas dobles con escape
"". - Protección Formula Injection: cualquier celda textual que empiece por
=,+,-,@, TAB o CR se prefija con'(comilla simple). Evita que Excel ejecute fórmulas arbitrarias.
6.2 XLSX
Si PhpSpreadsheet está disponible, se genera un .xlsx con una hoja de datos + hoja de metadatos. Si no, el servidor devuelve el CSV con MIME application/vnd.ms-excel (Excel lo abre igualmente).
6.3 JSON
{
"meta": {
"organisation": "Plataforma ODSLocal España",
"url": "https://odslocal.es",
"license": "CC BY 4.0",
"exported_at": "2026-04-21T14:30:05Z"
},
"data": [
{
"code_ine": "36057",
"name": "Vigo",
"indicator_key": "ods_ods_3_1_1__esperanza_de_vida_al_nacer",
"year": 2023,
"value": 83.2,
"source": "INE"
}
]
}
7. Identidad de la organización
El plugin no tiene sus propios ajustes. Lee la identidad desde ODSLocal Contributor Profiles (porque la carta y el export deben coincidir):
| Opción | Dónde se configura |
|---|---|
odslocal_profiles_org_name |
Ajustes → Contributor Profiles → Organización. |
odslocal_profiles_org_address |
Idem. |
odslocal_profiles_logo_url |
Idem. |
odslocal_profiles_signature_name |
Idem → Firma. |
odslocal_profiles_signature_title |
Idem. |
Si org_name está vacío, se usa get_bloginfo('name') y se muestra un aviso sólo en las pantallas del propio plugin.
8. Licencia y atribución de datos
Todos los ficheros llevan una cabecera (comentarios CSV, celdas top en XLSX, bloque meta en JSON) con:
- Nombre de la organización.
- URL de la plataforma.
- Licencia: Creative Commons CC BY 4.0.
- Timestamp UTC de la exportación.
La atribución correcta al reutilizar los datos es: «Datos publicados por [Organización] bajo CC BY 4.0 — [URL].»
9. Rate limiting
El endpoint /bulk/csv (descarga completa por año) está limitado a 1 request / 60 segundos / IP para proteger el servidor de scrapers agresivos.
- Cuando se excede, la respuesta es
429 Too Many Requestscon headerRetry-After: 60. - El resto de endpoints (municipio único, indicador único, autocompletado) no tienen rate limit.
10. Seguridad
- CSV Formula Injection neutralizada (
'prepended). - Header injection:
X-ODSLocal-Orghace strip dern. - Content-Disposition: ASCII fallback + RFC 5987
filename*=UTF-8''…para nombres con caracteres especiales. - IP logging: valida con
FILTER_VALIDATE_IP; prefiereREMOTE_ADDR; sólo consulta headers forwarded si hay proxy real. - Sólo datos aprobados: no se expone nada en estados
draft,pendingorejected. - Sin autenticación por diseño — los datos son abiertos bajo CC BY 4.0.
11. Auditoría
Cada exportación se registra en wp_odslocal_export_log:
| Campo | Significado |
|---|---|
user_id |
0 si es visitante anónimo. |
export_type |
csv_municipality, json_indicator, xlsx_bulk, etc. |
params |
JSON con los filtros usados. |
rows |
Número de filas incluidas. |
ip |
IP validada. |
created_at |
Timestamp. |
12. Traducciones
- Text domain:
odslocal-export, idioma de origen: español. languages/odslocal-export.pot— plantilla.odslocal-export-gl_ES.po/.mo— galego.- Para un nuevo idioma: duplicar POT, traducir, compilar con Poedit o
wp i18n make-mo.
13. Solución de problemas
XLSX descarga como CSV
Es el fallback automático. Instala phpoffice/phpspreadsheet vía Composer en la raíz de WordPress para XLSX nativo.
429 al descargar bulk
Esperado. Espera 60 s o usa endpoints más granulares (por municipio o indicador).
El CSV abre con caracteres raros en Excel
El fichero ya incluye BOM UTF-8. Si aun así falla, en Excel elige Datos → Desde texto y selecciona codificación 65001 UTF-8.
Los datos aparecen como «Array» en el historial
Bug corregido en 1.2.0 — si ves este síntoma, actualiza.