Plugins bloques

This commit is contained in:
Jose Ibáñez
2026-02-13 13:13:06 +01:00
commit 26d7f11378
24 changed files with 6324 additions and 0 deletions
@@ -0,0 +1,453 @@
<?php
/**
* Registro de campos ACF
*
* @package Bloques_Transicion
*/
if (!defined('ABSPATH')) {
exit;
}
class Bloques_ACF_Fields {
/**
* Registrar todos los grupos de campos
*/
public static function register() {
add_action('acf/init', [__CLASS__, 'register_field_groups']);
}
/**
* Registrar grupos de campos ACF
*/
public static function register_field_groups() {
if (!function_exists('acf_add_local_field_group')) {
return;
}
self::register_actuacion_fields();
self::register_recurso_fields();
self::register_evento_fields();
self::register_iniciativa_fields();
self::register_linea_trabajo_fields();
}
/**
* Campos para Actuaciones
*/
private static function register_actuacion_fields() {
acf_add_local_field_group([
'key' => 'group_bloques_actuacion',
'title' => __('Datos de la Actuación', 'bloques-transicion'),
'fields' => [
// Es piloto
[
'key' => 'field_actuacion_es_piloto',
'label' => __('Es actuación piloto', 'bloques-transicion'),
'name' => 'es_piloto',
'type' => 'true_false',
'instructions' => __('Marcar si esta actuación es un proyecto piloto', 'bloques-transicion'),
'ui' => 1,
'ui_on_text' => __('Sí', 'bloques-transicion'),
'ui_off_text' => __('No', 'bloques-transicion'),
'default_value' => 0,
],
// Tab Ubicación
[
'key' => 'field_actuacion_tab_ubicacion',
'label' => __('Ubicación', 'bloques-transicion'),
'name' => '',
'type' => 'tab',
'placement' => 'top',
],
// Dirección
[
'key' => 'field_actuacion_direccion',
'label' => __('Dirección', 'bloques-transicion'),
'name' => 'direccion',
'type' => 'text',
'instructions' => __('Dirección completa', 'bloques-transicion'),
],
// Localidad
[
'key' => 'field_actuacion_localidad',
'label' => __('Localidad', 'bloques-transicion'),
'name' => 'localidad',
'type' => 'text',
'instructions' => __('Ciudad o barrio', 'bloques-transicion'),
],
// Latitud
[
'key' => 'field_actuacion_latitud',
'label' => __('Latitud', 'bloques-transicion'),
'name' => 'latitud',
'type' => 'number',
'instructions' => __('Coordenada de latitud (ej: 40.4168)', 'bloques-transicion'),
'step' => 'any',
'wrapper' => ['width' => '50'],
],
// Longitud
[
'key' => 'field_actuacion_longitud',
'label' => __('Longitud', 'bloques-transicion'),
'name' => 'longitud',
'type' => 'number',
'instructions' => __('Coordenada de longitud (ej: -3.7038)', 'bloques-transicion'),
'step' => 'any',
'wrapper' => ['width' => '50'],
],
// Mapa (Google Maps si está disponible, sino texto)
[
'key' => 'field_actuacion_mapa',
'label' => __('Seleccionar en mapa', 'bloques-transicion'),
'name' => 'mapa',
'type' => 'google_map',
'instructions' => __('Haz clic en el mapa para obtener las coordenadas automáticamente', 'bloques-transicion'),
'center_lat' => '40.4168',
'center_lng' => '-3.7038',
'zoom' => 12,
'conditional_logic' => [
[
[
'field' => 'field_actuacion_latitud',
'operator' => '==empty',
],
],
],
],
],
'location' => [
[
[
'param' => 'post_type',
'operator' => '==',
'value' => 'actuacion',
],
],
],
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'active' => true,
]);
}
/**
* Campos para Recursos
*/
private static function register_recurso_fields() {
acf_add_local_field_group([
'key' => 'group_bloques_recurso',
'title' => __('Datos del Recurso', 'bloques-transicion'),
'fields' => [
// Archivo
[
'key' => 'field_recurso_archivo',
'label' => __('Archivo', 'bloques-transicion'),
'name' => 'archivo',
'type' => 'file',
'instructions' => __('Sube el archivo del recurso (PDF, DOC, JPG, PNG, etc.)', 'bloques-transicion'),
'required' => 0,
'return_format' => 'array',
'library' => 'all',
'mime_types' => 'pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,zip',
],
// Tipo de recurso (informativo)
[
'key' => 'field_recurso_tipo',
'label' => __('Tipo de Recurso', 'bloques-transicion'),
'name' => 'tipo_recurso',
'type' => 'select',
'instructions' => __('Categoría del tipo de recurso', 'bloques-transicion'),
'choices' => [
'documento' => __('Documento', 'bloques-transicion'),
'guia' => __('Guía', 'bloques-transicion'),
'informe' => __('Informe', 'bloques-transicion'),
'presentacion' => __('Presentación', 'bloques-transicion'),
'video' => __('Vídeo', 'bloques-transicion'),
'imagen' => __('Imagen', 'bloques-transicion'),
'otro' => __('Otro', 'bloques-transicion'),
],
'default_value' => 'documento',
'allow_null' => 0,
'return_format' => 'value',
],
// URL externa (alternativa al archivo)
[
'key' => 'field_recurso_url_externa',
'label' => __('URL Externa', 'bloques-transicion'),
'name' => 'url_externa',
'type' => 'url',
'instructions' => __('Si el recurso está alojado externamente (YouTube, Drive, etc.)', 'bloques-transicion'),
],
],
'location' => [
[
[
'param' => 'post_type',
'operator' => '==',
'value' => 'recurso_bloques',
],
],
],
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'active' => true,
]);
}
/**
* Campos para Eventos
*/
private static function register_evento_fields() {
acf_add_local_field_group([
'key' => 'group_bloques_evento',
'title' => __('Datos del Evento', 'bloques-transicion'),
'fields' => [
// Tab Fecha y Hora
[
'key' => 'field_evento_tab_fecha',
'label' => __('Fecha y Hora', 'bloques-transicion'),
'name' => '',
'type' => 'tab',
'placement' => 'top',
],
// Fecha inicio
[
'key' => 'field_evento_fecha_inicio',
'label' => __('Fecha de inicio', 'bloques-transicion'),
'name' => 'fecha_inicio',
'type' => 'date_picker',
'instructions' => __('Fecha en que comienza el evento', 'bloques-transicion'),
'required' => 1,
'display_format' => 'd/m/Y',
'return_format' => 'Y-m-d',
'first_day' => 1,
'wrapper' => ['width' => '50'],
],
// Hora inicio
[
'key' => 'field_evento_hora_inicio',
'label' => __('Hora de inicio', 'bloques-transicion'),
'name' => 'hora_inicio',
'type' => 'time_picker',
'instructions' => __('Hora de inicio del evento', 'bloques-transicion'),
'display_format' => 'H:i',
'return_format' => 'H:i',
'wrapper' => ['width' => '50'],
],
// Fecha fin
[
'key' => 'field_evento_fecha_fin',
'label' => __('Fecha de fin', 'bloques-transicion'),
'name' => 'fecha_fin',
'type' => 'date_picker',
'instructions' => __('Fecha en que termina el evento (opcional)', 'bloques-transicion'),
'display_format' => 'd/m/Y',
'return_format' => 'Y-m-d',
'first_day' => 1,
'wrapper' => ['width' => '50'],
],
// Hora fin
[
'key' => 'field_evento_hora_fin',
'label' => __('Hora de fin', 'bloques-transicion'),
'name' => 'hora_fin',
'type' => 'time_picker',
'instructions' => __('Hora de finalización (opcional)', 'bloques-transicion'),
'display_format' => 'H:i',
'return_format' => 'H:i',
'wrapper' => ['width' => '50'],
],
// Tab Ubicación
[
'key' => 'field_evento_tab_ubicacion',
'label' => __('Ubicación', 'bloques-transicion'),
'name' => '',
'type' => 'tab',
'placement' => 'top',
],
// Lugar
[
'key' => 'field_evento_lugar',
'label' => __('Lugar', 'bloques-transicion'),
'name' => 'lugar',
'type' => 'text',
'instructions' => __('Nombre del lugar donde se celebra', 'bloques-transicion'),
],
// Dirección
[
'key' => 'field_evento_direccion',
'label' => __('Dirección', 'bloques-transicion'),
'name' => 'direccion',
'type' => 'text',
],
// URL Online
[
'key' => 'field_evento_url_online',
'label' => __('Enlace para evento online', 'bloques-transicion'),
'name' => 'url_online',
'type' => 'url',
'instructions' => __('URL de Zoom, Meet, YouTube, etc. para eventos online', 'bloques-transicion'),
],
// Tab Inscripción
[
'key' => 'field_evento_tab_inscripcion',
'label' => __('Inscripción', 'bloques-transicion'),
'name' => '',
'type' => 'tab',
'placement' => 'top',
],
// URL inscripción
[
'key' => 'field_evento_url_inscripcion',
'label' => __('URL de inscripción', 'bloques-transicion'),
'name' => 'url_inscripcion',
'type' => 'url',
'instructions' => __('Enlace al formulario de inscripción', 'bloques-transicion'),
],
// Plazas
[
'key' => 'field_evento_plazas',
'label' => __('Número de plazas', 'bloques-transicion'),
'name' => 'plazas',
'type' => 'number',
'instructions' => __('Aforo máximo (dejar vacío si no hay límite)', 'bloques-transicion'),
'min' => 0,
],
],
'location' => [
[
[
'param' => 'post_type',
'operator' => '==',
'value' => 'evento_bloques',
],
],
],
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'active' => true,
]);
}
/**
* Campos para taxonomía Iniciativas
*/
private static function register_iniciativa_fields() {
acf_add_local_field_group([
'key' => 'group_bloques_iniciativa_tax',
'title' => __('Datos de la Iniciativa', 'bloques-transicion'),
'fields' => [
// Icono
[
'key' => 'field_iniciativa_icono',
'label' => __('Icono', 'bloques-transicion'),
'name' => 'icono',
'type' => 'image',
'instructions' => __('Icono representativo de la iniciativa (SVG o PNG recomendado)', 'bloques-transicion'),
'return_format' => 'url',
'preview_size' => 'thumbnail',
'library' => 'all',
'mime_types' => 'svg,png,jpg,jpeg',
],
// Color
[
'key' => 'field_iniciativa_color',
'label' => __('Color', 'bloques-transicion'),
'name' => 'color',
'type' => 'color_picker',
'instructions' => __('Color identificativo de la iniciativa', 'bloques-transicion'),
'default_value' => '#1E6B52',
],
// Ubicación
[
'key' => 'field_iniciativa_ubicacion',
'label' => __('Ubicación', 'bloques-transicion'),
'name' => 'ubicacion_texto',
'type' => 'text',
'instructions' => __('Texto descriptivo de la ubicación (ej: "Puente y Villa de Vallecas")', 'bloques-transicion'),
],
// Estado
[
'key' => 'field_iniciativa_estado',
'label' => __('Estado', 'bloques-transicion'),
'name' => 'estado',
'type' => 'text',
'instructions' => __('Estado actual de la iniciativa (ej: "En proceso", "Abierta")', 'bloques-transicion'),
],
],
'location' => [
[
[
'param' => 'taxonomy',
'operator' => '==',
'value' => 'iniciativa',
],
],
],
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'active' => true,
]);
}
/**
* Campos para taxonomía Líneas de Trabajo
*/
private static function register_linea_trabajo_fields() {
acf_add_local_field_group([
'key' => 'group_bloques_linea_trabajo_tax',
'title' => __('Datos de la Línea de Trabajo', 'bloques-transicion'),
'fields' => [
// Icono
[
'key' => 'field_linea_trabajo_icono',
'label' => __('Icono', 'bloques-transicion'),
'name' => 'icono',
'type' => 'image',
'instructions' => __('Icono representativo de la línea de trabajo', 'bloques-transicion'),
'return_format' => 'url',
'preview_size' => 'thumbnail',
'library' => 'all',
'mime_types' => 'svg,png,jpg,jpeg',
],
// Color (opcional para líneas de trabajo)
[
'key' => 'field_linea_trabajo_color',
'label' => __('Color', 'bloques-transicion'),
'name' => 'color',
'type' => 'color_picker',
'instructions' => __('Color identificativo (opcional)', 'bloques-transicion'),
],
],
'location' => [
[
[
'param' => 'taxonomy',
'operator' => '==',
'value' => 'linea_trabajo',
],
],
],
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'active' => true,
]);
}
}
@@ -0,0 +1,265 @@
<?php
/**
* Menú de administración personalizado
*
* @package Bloques_Transicion
*/
if (!defined('ABSPATH')) {
exit;
}
class Bloques_Admin_Menu {
/**
* Registrar menú
*/
public static function register() {
add_action('admin_menu', [__CLASS__, 'add_admin_menu']);
add_action('parent_file', [__CLASS__, 'fix_parent_menu']);
add_action('submenu_file', [__CLASS__, 'fix_submenu']);
}
/**
* Añadir menú principal y submenús
*/
public static function add_admin_menu() {
// Menú principal: Bloques
add_menu_page(
__('Bloques en Transición', 'bloques-transicion'),
__('Bloques', 'bloques-transicion'),
'edit_posts',
'bloques-dashboard',
[__CLASS__, 'render_dashboard'],
'dashicons-building',
25
);
// Dashboard
add_submenu_page(
'bloques-dashboard',
__('Panel de Bloques', 'bloques-transicion'),
__('Panel', 'bloques-transicion'),
'edit_posts',
'bloques-dashboard',
[__CLASS__, 'render_dashboard']
);
// === ACTUACIONES ===
add_submenu_page(
'bloques-dashboard',
__('Actuaciones', 'bloques-transicion'),
__('Actuaciones', 'bloques-transicion'),
'edit_posts',
'edit.php?post_type=actuacion'
);
add_submenu_page(
'bloques-dashboard',
__('Añadir Actuación', 'bloques-transicion'),
__('↳ Añadir nueva', 'bloques-transicion'),
'edit_posts',
'post-new.php?post_type=actuacion'
);
// === RECURSOS ===
add_submenu_page(
'bloques-dashboard',
__('Recursos', 'bloques-transicion'),
__('Recursos', 'bloques-transicion'),
'edit_posts',
'edit.php?post_type=recurso_bloques'
);
add_submenu_page(
'bloques-dashboard',
__('Añadir Recurso', 'bloques-transicion'),
__('↳ Añadir nuevo', 'bloques-transicion'),
'edit_posts',
'post-new.php?post_type=recurso_bloques'
);
// === EVENTOS ===
add_submenu_page(
'bloques-dashboard',
__('Eventos', 'bloques-transicion'),
__('Eventos', 'bloques-transicion'),
'edit_posts',
'edit.php?post_type=evento_bloques'
);
add_submenu_page(
'bloques-dashboard',
__('Añadir Evento', 'bloques-transicion'),
__('↳ Añadir nuevo', 'bloques-transicion'),
'edit_posts',
'post-new.php?post_type=evento_bloques'
);
// === SEPARADOR ===
add_submenu_page(
'bloques-dashboard',
'',
'<span style="display:block;border-top:1px solid #555;margin:10px 0;"></span>',
'edit_posts',
'#separator1'
);
// === TAXONOMÍAS ===
add_submenu_page(
'bloques-dashboard',
__('Iniciativas', 'bloques-transicion'),
__('Iniciativas', 'bloques-transicion'),
'manage_categories',
'edit-tags.php?taxonomy=iniciativa'
);
add_submenu_page(
'bloques-dashboard',
__('Líneas de Trabajo', 'bloques-transicion'),
__('Líneas de Trabajo', 'bloques-transicion'),
'manage_categories',
'edit-tags.php?taxonomy=linea_trabajo'
);
add_submenu_page(
'bloques-dashboard',
__('Tipos de Evento', 'bloques-transicion'),
__('Tipos de Evento', 'bloques-transicion'),
'manage_categories',
'edit-tags.php?taxonomy=tipo_evento'
);
// === SEPARADOR ===
add_submenu_page(
'bloques-dashboard',
'',
'<span style="display:block;border-top:1px solid #555;margin:10px 0;"></span>',
'manage_options',
'#separator2'
);
// === HERRAMIENTAS ===
add_submenu_page(
'bloques-dashboard',
__('Cargar datos iniciales', 'bloques-transicion'),
__('⚙️ Cargar datos', 'bloques-transicion'),
'manage_options',
'bloques-seeder',
[__CLASS__, 'render_seeder_page']
);
// === AJUSTES ===
add_submenu_page(
'bloques-dashboard',
__('Ajustes', 'bloques-transicion'),
__('⚙️ Ajustes', 'bloques-transicion'),
'manage_options',
'bloques-settings',
[__CLASS__, 'render_settings_page']
);
}
/**
* Renderizar página de ajustes
*/
public static function render_settings_page() {
// Guardar opciones si se envió el formulario
if (isset($_POST['bloques_settings_nonce']) && wp_verify_nonce($_POST['bloques_settings_nonce'], 'bloques_save_settings')) {
$custom_css = isset($_POST['bloques_custom_css']) ? wp_strip_all_tags($_POST['bloques_custom_css']) : '';
update_option('bloques_custom_css', $custom_css);
$saved = true;
}
$custom_css = get_option('bloques_custom_css', '');
include BLOQUES_PLUGIN_DIR . 'templates/admin/settings.php';
}
/**
* Corregir menú padre activo
*/
public static function fix_parent_menu($parent_file) {
global $current_screen;
if (!$current_screen) {
return $parent_file;
}
$post_types = Bloques_Post_Types::get_post_types();
$taxonomies = Bloques_Taxonomies::get_taxonomies();
// Si estamos en un CPT de Bloques
if (in_array($current_screen->post_type, $post_types)) {
return 'bloques-dashboard';
}
// Si estamos en una taxonomía de Bloques
if (in_array($current_screen->taxonomy, $taxonomies)) {
return 'bloques-dashboard';
}
return $parent_file;
}
/**
* Corregir submenú activo
*/
public static function fix_submenu($submenu_file) {
global $current_screen;
if (!$current_screen) {
return $submenu_file;
}
$post_types = Bloques_Post_Types::get_post_types();
$taxonomies = Bloques_Taxonomies::get_taxonomies();
// CPTs
if (in_array($current_screen->post_type, $post_types)) {
if ($current_screen->base === 'post') {
return 'post-new.php?post_type=' . $current_screen->post_type;
}
return 'edit.php?post_type=' . $current_screen->post_type;
}
// Taxonomías
if (in_array($current_screen->taxonomy, $taxonomies)) {
return 'edit-tags.php?taxonomy=' . $current_screen->taxonomy;
}
return $submenu_file;
}
/**
* Renderizar dashboard
*/
public static function render_dashboard() {
// Obtener conteos
$counts = [
'actuacion' => wp_count_posts('actuacion')->publish ?? 0,
'recurso_bloques' => wp_count_posts('recurso_bloques')->publish ?? 0,
'evento_bloques' => wp_count_posts('evento_bloques')->publish ?? 0,
];
$iniciativas = wp_count_terms(['taxonomy' => 'iniciativa', 'hide_empty' => false]);
$lineas = wp_count_terms(['taxonomy' => 'linea_trabajo', 'hide_empty' => false]);
include BLOQUES_PLUGIN_DIR . 'templates/admin/dashboard.php';
}
/**
* Renderizar página de seeder
*/
public static function render_seeder_page() {
// Procesar acción si se envió el formulario
if (isset($_POST['bloques_seed_action']) && wp_verify_nonce($_POST['bloques_seed_nonce'], 'bloques_seed')) {
$result = Bloques_Data_Seeder::seed_all();
$message = $result ?
__('Datos cargados correctamente.', 'bloques-transicion') :
__('Error al cargar los datos.', 'bloques-transicion');
$message_type = $result ? 'success' : 'error';
}
include BLOQUES_PLUGIN_DIR . 'templates/admin/seeder.php';
}
}
@@ -0,0 +1,233 @@
<?php
/**
* Carga de datos iniciales (Iniciativas y Líneas de Trabajo)
*
* @package Bloques_Transicion
*/
if (!defined('ABSPATH')) {
exit;
}
class Bloques_Data_Seeder {
/**
* Cargar todos los datos iniciales
*/
public static function seed_all() {
$result_iniciativas = self::seed_iniciativas();
$result_lineas = self::seed_lineas_trabajo();
$result_tipos = self::seed_tipos_evento();
return $result_iniciativas && $result_lineas && $result_tipos;
}
/**
* Cargar Iniciativas
*/
public static function seed_iniciativas() {
$iniciativas = [
[
'name' => 'Oficina de Transición Justa',
'slug' => 'oficina-transicion-justa',
'description' => 'Acompañamiento técnico, asesoramiento y formación para personas y comunidades interesadas en impulsar iniciativas de cambio.',
'meta' => [
'ubicacion_texto' => 'Puente y Villa de Vallecas',
'estado' => 'Abierta - consultas permanentes',
'color' => '#1E6B52',
],
],
[
'name' => 'Coles en transición',
'slug' => 'coles-transicion',
'description' => 'Acompañamiento en la elaboración e implementación de planes de adaptación climática en centros educativos y otras iniciativas de cambio con participación de la comunidad escolar.',
'meta' => [
'ubicacion_texto' => '7 centros en Puente y Villa de Vallecas',
'estado' => 'En marcha',
'color' => '#4A9B7F',
],
],
[
'name' => 'Comunidad energética',
'slug' => 'comunidad-energetica',
'description' => 'Acompañamiento en la creación de la Comunidad Energética Vallekana para producir, compartir y gestionar energía renovable.',
'meta' => [
'ubicacion_texto' => 'Puente de Vallecas',
'estado' => 'En proceso de constitución',
'color' => '#F4A261',
],
],
[
'name' => 'Creación de redes',
'slug' => 'creacion-redes',
'description' => 'Intercambio de conocimientos y participación. Acompañamiento e impulso del funcionamiento y la creación de redes locales y estatales multiactor para el aprendizaje y la puesta en marcha de acciones hacia la transición justa.',
'meta' => [
'ubicacion_texto' => 'Madrid, Cataluña y Valencia',
'estado' => 'En proceso',
'color' => '#E76F51',
],
],
];
return self::insert_terms($iniciativas, 'iniciativa');
}
/**
* Cargar Líneas de Trabajo
*/
public static function seed_lineas_trabajo() {
$lineas = [
[
'name' => 'Energía',
'slug' => 'energia',
'description' => 'Rehabilitación edificios, comunidades energéticas y autoconsumo renovable',
'meta' => [
'color' => '#F4A261',
],
],
[
'name' => 'Cuidados',
'slug' => 'cuidados',
'description' => 'Redes de apoyo mutuo y espacios vecinales',
'meta' => [
'color' => '#E9C46A',
],
],
[
'name' => 'Alimentación',
'slug' => 'alimentacion',
'description' => 'Alimentación sostenible y saludable y redes de consumo',
'meta' => [
'color' => '#2A9D8F',
],
],
[
'name' => 'Movilidad',
'slug' => 'movilidad',
'description' => 'Movilidad sostenible, uso de la bicicleta y espacio público',
'meta' => [
'color' => '#264653',
],
],
[
'name' => 'Renaturalización',
'slug' => 'renaturalizacion',
'description' => 'Renaturalización de comunidades y patios escolares',
'meta' => [
'color' => '#1E6B52',
],
],
[
'name' => 'Reutilización',
'slug' => 'reutilizacion',
'description' => 'Economía circular y consumo colaborativo',
'meta' => [
'color' => '#E76F51',
],
],
];
return self::insert_terms($lineas, 'linea_trabajo');
}
/**
* Cargar Tipos de Evento
*/
public static function seed_tipos_evento() {
$tipos = [
[
'name' => 'Online',
'slug' => 'online',
'description' => 'Evento que se realiza de forma virtual',
],
[
'name' => 'Presencial',
'slug' => 'presencial',
'description' => 'Evento que se realiza de forma presencial',
],
];
return self::insert_terms($tipos, 'tipo_evento');
}
/**
* Insertar términos en una taxonomía
*/
private static function insert_terms($terms, $taxonomy) {
$success = true;
foreach ($terms as $term_data) {
// Verificar si ya existe
$existing = term_exists($term_data['slug'], $taxonomy);
if ($existing) {
$term_id = is_array($existing) ? $existing['term_id'] : $existing;
// Actualizar descripción si existe
wp_update_term($term_id, $taxonomy, [
'description' => $term_data['description'] ?? '',
]);
} else {
// Crear nuevo término
$result = wp_insert_term(
$term_data['name'],
$taxonomy,
[
'slug' => $term_data['slug'],
'description' => $term_data['description'] ?? '',
]
);
if (is_wp_error($result)) {
$success = false;
continue;
}
$term_id = $result['term_id'];
}
// Guardar meta datos con ACF si está disponible
if (!empty($term_data['meta']) && function_exists('update_field')) {
foreach ($term_data['meta'] as $key => $value) {
update_field($key, $value, $taxonomy . '_' . $term_id);
}
}
}
return $success;
}
/**
* Eliminar todos los datos del plugin
*/
public static function clear_all() {
// Eliminar términos de iniciativas
$iniciativas = get_terms([
'taxonomy' => 'iniciativa',
'hide_empty' => false,
]);
foreach ($iniciativas as $term) {
wp_delete_term($term->term_id, 'iniciativa');
}
// Eliminar términos de líneas de trabajo
$lineas = get_terms([
'taxonomy' => 'linea_trabajo',
'hide_empty' => false,
]);
foreach ($lineas as $term) {
wp_delete_term($term->term_id, 'linea_trabajo');
}
// Eliminar tipos de evento
$tipos = get_terms([
'taxonomy' => 'tipo_evento',
'hide_empty' => false,
]);
foreach ($tipos as $term) {
wp_delete_term($term->term_id, 'tipo_evento');
}
return true;
}
}
@@ -0,0 +1,192 @@
<?php
/**
* Registro de Custom Post Types
*
* @package Bloques_Transicion
*/
if (!defined('ABSPATH')) {
exit;
}
class Bloques_Post_Types
{
/**
* Registrar todos los CPTs
*/
public static function register()
{
self::register_actuacion();
self::register_recurso();
self::register_evento();
}
/**
* CPT: Actuaciones
*/
private static function register_actuacion()
{
$labels = [
'name' => _x('Actuaciones', 'Post type general name', 'bloques-transicion'),
'singular_name' => _x('Actuación', 'Post type singular name', 'bloques-transicion'),
'menu_name' => _x('Actuaciones', 'Admin Menu text', 'bloques-transicion'),
'name_admin_bar' => _x('Actuación', 'Add New on Toolbar', 'bloques-transicion'),
'add_new' => __('Añadir nueva', 'bloques-transicion'),
'add_new_item' => __('Añadir nueva Actuación', 'bloques-transicion'),
'new_item' => __('Nueva Actuación', 'bloques-transicion'),
'edit_item' => __('Editar Actuación', 'bloques-transicion'),
'view_item' => __('Ver Actuación', 'bloques-transicion'),
'all_items' => __('Todas las Actuaciones', 'bloques-transicion'),
'search_items' => __('Buscar Actuaciones', 'bloques-transicion'),
'parent_item_colon' => __('Actuación padre:', 'bloques-transicion'),
'not_found' => __('No se encontraron actuaciones.', 'bloques-transicion'),
'not_found_in_trash' => __('No hay actuaciones en la papelera.', 'bloques-transicion'),
'featured_image' => _x('Imagen destacada', 'Overrides the "Featured Image" phrase', 'bloques-transicion'),
'set_featured_image' => _x('Establecer imagen destacada', 'Overrides the "Set featured image" phrase', 'bloques-transicion'),
'remove_featured_image' => _x('Eliminar imagen destacada', 'Overrides the "Remove featured image" phrase', 'bloques-transicion'),
'use_featured_image' => _x('Usar como imagen destacada', 'Overrides the "Use as featured image" phrase', 'bloques-transicion'),
'archives' => _x('Archivo de Actuaciones', 'The post type archive label', 'bloques-transicion'),
'insert_into_item' => _x('Insertar en actuación', 'Overrides the "Insert into post" phrase', 'bloques-transicion'),
'uploaded_to_this_item' => _x('Subido a esta actuación', 'Overrides the "Uploaded to this post" phrase', 'bloques-transicion'),
'filter_items_list' => _x('Filtrar lista de actuaciones', 'Screen reader text', 'bloques-transicion'),
'items_list_navigation' => _x('Navegación de actuaciones', 'Screen reader text', 'bloques-transicion'),
'items_list' => _x('Lista de actuaciones', 'Screen reader text', 'bloques-transicion'),
];
$args = [
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => false, // Lo añadimos manualmente al menú de Bloques
'query_var' => true,
'rewrite' => ['slug' => 'bloques-en-transicion/actuaciones', 'with_front' => false],
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'menu_icon' => 'dashicons-location-alt',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'revisions'],
'show_in_rest' => true,
'taxonomies' => ['iniciativa', 'linea_trabajo'],
];
register_post_type('actuacion', $args);
}
/**
* CPT: Recursos
*/
private static function register_recurso()
{
$labels = [
'name' => _x('Recursos', 'Post type general name', 'bloques-transicion'),
'singular_name' => _x('Recurso', 'Post type singular name', 'bloques-transicion'),
'menu_name' => _x('Recursos', 'Admin Menu text', 'bloques-transicion'),
'name_admin_bar' => _x('Recurso', 'Add New on Toolbar', 'bloques-transicion'),
'add_new' => __('Añadir nuevo', 'bloques-transicion'),
'add_new_item' => __('Añadir nuevo Recurso', 'bloques-transicion'),
'new_item' => __('Nuevo Recurso', 'bloques-transicion'),
'edit_item' => __('Editar Recurso', 'bloques-transicion'),
'view_item' => __('Ver Recurso', 'bloques-transicion'),
'all_items' => __('Todos los Recursos', 'bloques-transicion'),
'search_items' => __('Buscar Recursos', 'bloques-transicion'),
'parent_item_colon' => __('Recurso padre:', 'bloques-transicion'),
'not_found' => __('No se encontraron recursos.', 'bloques-transicion'),
'not_found_in_trash' => __('No hay recursos en la papelera.', 'bloques-transicion'),
'featured_image' => _x('Imagen del recurso', 'Overrides the "Featured Image" phrase', 'bloques-transicion'),
'set_featured_image' => _x('Establecer imagen', 'Overrides the "Set featured image" phrase', 'bloques-transicion'),
'remove_featured_image' => _x('Eliminar imagen', 'Overrides the "Remove featured image" phrase', 'bloques-transicion'),
'use_featured_image' => _x('Usar como imagen', 'Overrides the "Use as featured image" phrase', 'bloques-transicion'),
'archives' => _x('Archivo de Recursos', 'The post type archive label', 'bloques-transicion'),
'insert_into_item' => _x('Insertar en recurso', 'Overrides the "Insert into post" phrase', 'bloques-transicion'),
'uploaded_to_this_item' => _x('Subido a este recurso', 'Overrides the "Uploaded to this post" phrase', 'bloques-transicion'),
'filter_items_list' => _x('Filtrar lista de recursos', 'Screen reader text', 'bloques-transicion'),
'items_list_navigation' => _x('Navegación de recursos', 'Screen reader text', 'bloques-transicion'),
'items_list' => _x('Lista de recursos', 'Screen reader text', 'bloques-transicion'),
];
$args = [
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => false,
'query_var' => true,
'rewrite' => ['slug' => 'bloques-en-transicion/recursos', 'with_front' => false],
'capability_type' => 'post',
'has_archive' => false, // Desactivado para usar la página de Divi
'hierarchical' => false,
'menu_position' => null,
'menu_icon' => 'dashicons-media-document',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'revisions'],
'show_in_rest' => true,
'taxonomies' => ['iniciativa', 'linea_trabajo'],
];
register_post_type('recurso_bloques', $args);
}
/**
* CPT: Eventos
*/
private static function register_evento()
{
$labels = [
'name' => _x('Eventos', 'Post type general name', 'bloques-transicion'),
'singular_name' => _x('Evento', 'Post type singular name', 'bloques-transicion'),
'menu_name' => _x('Eventos', 'Admin Menu text', 'bloques-transicion'),
'name_admin_bar' => _x('Evento', 'Add New on Toolbar', 'bloques-transicion'),
'add_new' => __('Añadir nuevo', 'bloques-transicion'),
'add_new_item' => __('Añadir nuevo Evento', 'bloques-transicion'),
'new_item' => __('Nuevo Evento', 'bloques-transicion'),
'edit_item' => __('Editar Evento', 'bloques-transicion'),
'view_item' => __('Ver Evento', 'bloques-transicion'),
'all_items' => __('Todos los Eventos', 'bloques-transicion'),
'search_items' => __('Buscar Eventos', 'bloques-transicion'),
'parent_item_colon' => __('Evento padre:', 'bloques-transicion'),
'not_found' => __('No se encontraron eventos.', 'bloques-transicion'),
'not_found_in_trash' => __('No hay eventos en la papelera.', 'bloques-transicion'),
'featured_image' => _x('Imagen del evento', 'Overrides the "Featured Image" phrase', 'bloques-transicion'),
'set_featured_image' => _x('Establecer imagen', 'Overrides the "Set featured image" phrase', 'bloques-transicion'),
'remove_featured_image' => _x('Eliminar imagen', 'Overrides the "Remove featured image" phrase', 'bloques-transicion'),
'use_featured_image' => _x('Usar como imagen', 'Overrides the "Use as featured image" phrase', 'bloques-transicion'),
'archives' => _x('Archivo de Eventos', 'The post type archive label', 'bloques-transicion'),
'insert_into_item' => _x('Insertar en evento', 'Overrides the "Insert into post" phrase', 'bloques-transicion'),
'uploaded_to_this_item' => _x('Subido a este evento', 'Overrides the "Uploaded to this post" phrase', 'bloques-transicion'),
'filter_items_list' => _x('Filtrar lista de eventos', 'Screen reader text', 'bloques-transicion'),
'items_list_navigation' => _x('Navegación de eventos', 'Screen reader text', 'bloques-transicion'),
'items_list' => _x('Lista de eventos', 'Screen reader text', 'bloques-transicion'),
];
$args = [
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => false,
'query_var' => true,
'rewrite' => ['slug' => 'bloques-en-transicion/eventos', 'with_front' => false],
'capability_type' => 'post',
'has_archive' => false, // Desactivado para usar la página de Divi
'hierarchical' => false,
'menu_position' => null,
'menu_icon' => 'dashicons-calendar-alt',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'revisions'],
'show_in_rest' => true,
'taxonomies' => ['iniciativa', 'linea_trabajo', 'tipo_evento'],
];
register_post_type('evento_bloques', $args);
}
/**
* Obtener todos los CPTs del plugin
*/
public static function get_post_types()
{
return ['actuacion', 'recurso_bloques', 'evento_bloques'];
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,164 @@
<?php
/**
* Registro de Taxonomías personalizadas
*
* @package Bloques_Transicion
*/
if (!defined('ABSPATH')) {
exit;
}
class Bloques_Taxonomies {
/**
* Registrar todas las taxonomías
*/
public static function register() {
self::register_iniciativa();
self::register_linea_trabajo();
self::register_tipo_evento();
}
/**
* Taxonomía: Iniciativas
*/
private static function register_iniciativa() {
$labels = [
'name' => _x('Iniciativas', 'taxonomy general name', 'bloques-transicion'),
'singular_name' => _x('Iniciativa', 'taxonomy singular name', 'bloques-transicion'),
'search_items' => __('Buscar Iniciativas', 'bloques-transicion'),
'popular_items' => __('Iniciativas populares', 'bloques-transicion'),
'all_items' => __('Todas las Iniciativas', 'bloques-transicion'),
'parent_item' => __('Iniciativa padre', 'bloques-transicion'),
'parent_item_colon' => __('Iniciativa padre:', 'bloques-transicion'),
'edit_item' => __('Editar Iniciativa', 'bloques-transicion'),
'view_item' => __('Ver Iniciativa', 'bloques-transicion'),
'update_item' => __('Actualizar Iniciativa', 'bloques-transicion'),
'add_new_item' => __('Añadir nueva Iniciativa', 'bloques-transicion'),
'new_item_name' => __('Nombre de nueva Iniciativa', 'bloques-transicion'),
'separate_items_with_commas' => __('Separar iniciativas con comas', 'bloques-transicion'),
'add_or_remove_items' => __('Añadir o eliminar iniciativas', 'bloques-transicion'),
'choose_from_most_used' => __('Elegir de las más usadas', 'bloques-transicion'),
'not_found' => __('No se encontraron iniciativas.', 'bloques-transicion'),
'no_terms' => __('No hay iniciativas', 'bloques-transicion'),
'menu_name' => __('Iniciativas', 'bloques-transicion'),
'items_list_navigation' => __('Navegación de iniciativas', 'bloques-transicion'),
'items_list' => __('Lista de iniciativas', 'bloques-transicion'),
'back_to_items' => __('← Volver a Iniciativas', 'bloques-transicion'),
];
$args = [
'labels' => $labels,
'hierarchical' => true, // Como categorías
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => false,
'show_in_rest' => true,
'rewrite' => ['slug' => 'bloques/iniciativa', 'with_front' => false],
'query_var' => true,
];
// Asociar a todos los CPTs de Bloques
$post_types = ['actuacion', 'recurso_bloques', 'evento_bloques'];
register_taxonomy('iniciativa', $post_types, $args);
}
/**
* Taxonomía: Líneas de Trabajo
*/
private static function register_linea_trabajo() {
$labels = [
'name' => _x('Líneas de Trabajo', 'taxonomy general name', 'bloques-transicion'),
'singular_name' => _x('Línea de Trabajo', 'taxonomy singular name', 'bloques-transicion'),
'search_items' => __('Buscar Líneas de Trabajo', 'bloques-transicion'),
'popular_items' => __('Líneas de Trabajo populares', 'bloques-transicion'),
'all_items' => __('Todas las Líneas de Trabajo', 'bloques-transicion'),
'parent_item' => __('Línea de Trabajo padre', 'bloques-transicion'),
'parent_item_colon' => __('Línea de Trabajo padre:', 'bloques-transicion'),
'edit_item' => __('Editar Línea de Trabajo', 'bloques-transicion'),
'view_item' => __('Ver Línea de Trabajo', 'bloques-transicion'),
'update_item' => __('Actualizar Línea de Trabajo', 'bloques-transicion'),
'add_new_item' => __('Añadir nueva Línea de Trabajo', 'bloques-transicion'),
'new_item_name' => __('Nombre de nueva Línea de Trabajo', 'bloques-transicion'),
'separate_items_with_commas' => __('Separar líneas con comas', 'bloques-transicion'),
'add_or_remove_items' => __('Añadir o eliminar líneas', 'bloques-transicion'),
'choose_from_most_used' => __('Elegir de las más usadas', 'bloques-transicion'),
'not_found' => __('No se encontraron líneas de trabajo.', 'bloques-transicion'),
'no_terms' => __('No hay líneas de trabajo', 'bloques-transicion'),
'menu_name' => __('Líneas de Trabajo', 'bloques-transicion'),
'items_list_navigation' => __('Navegación de líneas', 'bloques-transicion'),
'items_list' => __('Lista de líneas', 'bloques-transicion'),
'back_to_items' => __('← Volver a Líneas de Trabajo', 'bloques-transicion'),
];
$args = [
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => false,
'show_in_rest' => true,
'rewrite' => ['slug' => 'bloques/linea-trabajo', 'with_front' => false],
'query_var' => true,
];
$post_types = ['actuacion', 'recurso_bloques', 'evento_bloques'];
register_taxonomy('linea_trabajo', $post_types, $args);
}
/**
* Taxonomía: Tipo de Evento
*/
private static function register_tipo_evento() {
$labels = [
'name' => _x('Tipos de Evento', 'taxonomy general name', 'bloques-transicion'),
'singular_name' => _x('Tipo de Evento', 'taxonomy singular name', 'bloques-transicion'),
'search_items' => __('Buscar Tipos', 'bloques-transicion'),
'popular_items' => __('Tipos populares', 'bloques-transicion'),
'all_items' => __('Todos los Tipos', 'bloques-transicion'),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __('Editar Tipo', 'bloques-transicion'),
'view_item' => __('Ver Tipo', 'bloques-transicion'),
'update_item' => __('Actualizar Tipo', 'bloques-transicion'),
'add_new_item' => __('Añadir nuevo Tipo', 'bloques-transicion'),
'new_item_name' => __('Nombre del nuevo Tipo', 'bloques-transicion'),
'separate_items_with_commas' => __('Separar tipos con comas', 'bloques-transicion'),
'add_or_remove_items' => __('Añadir o eliminar tipos', 'bloques-transicion'),
'choose_from_most_used' => __('Elegir de los más usados', 'bloques-transicion'),
'not_found' => __('No se encontraron tipos.', 'bloques-transicion'),
'no_terms' => __('No hay tipos', 'bloques-transicion'),
'menu_name' => __('Tipos de Evento', 'bloques-transicion'),
'items_list_navigation' => __('Navegación de tipos', 'bloques-transicion'),
'items_list' => __('Lista de tipos', 'bloques-transicion'),
'back_to_items' => __('← Volver a Tipos', 'bloques-transicion'),
];
$args = [
'labels' => $labels,
'hierarchical' => false, // Como etiquetas (permite múltiple selección)
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => false,
'show_in_rest' => true,
'rewrite' => ['slug' => 'bloques/tipo-evento', 'with_front' => false],
'query_var' => true,
];
register_taxonomy('tipo_evento', ['evento_bloques'], $args);
}
/**
* Obtener todas las taxonomías del plugin
*/
public static function get_taxonomies() {
return ['iniciativa', 'linea_trabajo', 'tipo_evento'];
}
}