2026-02-13 13:13:06 +01:00
< ? php
/**
* Plugin Name: Bloques en Transición
* Plugin URI: https://tangente.coop/bloques
* Description: Gestión de contenidos para el microsite "Bloques en Transición" - Actuaciones, Entidades, Recursos y Eventos con taxonomías personalizadas.
* Version: 1.0.0
* Author: Freepress Coop
* Author URI: https://freepress.coop
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: bloques-transicion
* Domain Path: /languages
* Requires at least: 6.0
* Requires PHP: 8.0
*/
// Si se accede directamente, salir
if ( ! defined ( 'ABSPATH' )) {
exit ;
}
// Constantes del plugin
define ( 'BLOQUES_VERSION' , '1.0.0' );
define ( 'BLOQUES_PLUGIN_DIR' , plugin_dir_path ( __FILE__ ));
define ( 'BLOQUES_PLUGIN_URL' , plugin_dir_url ( __FILE__ ));
define ( 'BLOQUES_PLUGIN_BASENAME' , plugin_basename ( __FILE__ ));
/**
* Clase principal del plugin
*/
final class Bloques_Transicion {
/**
* Instancia única del plugin
*/
private static $instance = null ;
/**
* Obtener instancia única (Singleton)
*/
public static function get_instance () {
if ( null === self :: $instance ) {
self :: $instance = new self ();
}
return self :: $instance ;
}
/**
* Constructor privado
*/
private function __construct () {
$this -> load_dependencies ();
$this -> init_hooks ();
}
/**
* Cargar dependencias
*/
private function load_dependencies () {
// Core
require_once BLOQUES_PLUGIN_DIR . 'includes/class-post-types.php' ;
require_once BLOQUES_PLUGIN_DIR . 'includes/class-taxonomies.php' ;
require_once BLOQUES_PLUGIN_DIR . 'includes/class-acf-fields.php' ;
require_once BLOQUES_PLUGIN_DIR . 'includes/class-admin-menu.php' ;
require_once BLOQUES_PLUGIN_DIR . 'includes/class-shortcodes.php' ;
require_once BLOQUES_PLUGIN_DIR . 'includes/class-data-seeder.php' ;
}
/**
* Inicializar hooks
*/
private function init_hooks () {
// Activación y desactivación
register_activation_hook ( __FILE__ , [ $this , 'activate' ]);
register_deactivation_hook ( __FILE__ , [ $this , 'deactivate' ]);
// Inicialización
add_action ( 'init' , [ $this , 'init' ], 0 );
add_action ( 'plugins_loaded' , [ $this , 'load_textdomain' ]);
// Admin
if ( is_admin ()) {
add_action ( 'admin_enqueue_scripts' , [ $this , 'admin_assets' ]);
}
// Frontend
add_action ( 'wp_enqueue_scripts' , [ $this , 'frontend_assets' ]);
}
/**
* Inicializar componentes
*/
public function init () {
// Registrar CPTs y taxonomías
Bloques_Post_Types :: register ();
Bloques_Taxonomies :: register ();
// Registrar campos ACF
if ( class_exists ( 'ACF' )) {
Bloques_ACF_Fields :: register ();
}
// Registrar menú admin
Bloques_Admin_Menu :: register ();
// Registrar shortcodes
Bloques_Shortcodes :: register ();
}
/**
* Cargar traducciones
*/
public function load_textdomain () {
load_plugin_textdomain (
'bloques-transicion' ,
false ,
dirname ( BLOQUES_PLUGIN_BASENAME ) . '/languages/'
);
}
/**
* Assets del admin
*/
public function admin_assets ( $hook ) {
$screen = get_current_screen ();
2026-02-14 18:21:10 +01:00
if ( ! $screen ) {
return ;
}
// Cargar en páginas del plugin y también en editor de entradas (post)
$is_bloques_page = strpos ( $screen -> id , 'bloques' ) !== false ||
in_array ( $screen -> post_type , [ 'actuacion' , 'recurso_bloques' , 'evento_bloques' ]);
$is_post_editor = $screen -> post_type === 'post' && in_array ( $hook , [ 'post.php' , 'post-new.php' ]);
if ( $is_bloques_page || $is_post_editor ) {
2026-02-13 13:13:06 +01:00
wp_enqueue_style (
'bloques-admin' ,
BLOQUES_PLUGIN_URL . 'assets/css/admin.css' ,
[],
BLOQUES_VERSION
);
wp_enqueue_script (
'bloques-admin' ,
BLOQUES_PLUGIN_URL . 'assets/js/admin.js' ,
[ 'jquery' ],
BLOQUES_VERSION ,
true
);
2026-02-14 18:21:10 +01:00
// Datos para el JS del admin
if ( $is_post_editor ) {
// Obtener los IDs de las categorías "bloques-en-transicion" y "bloques"
$bloques_cat_ids = [];
$bloques_cat = get_term_by ( 'slug' , 'bloques-en-transicion' , 'category' );
if ( $bloques_cat ) {
$bloques_cat_ids [] = $bloques_cat -> term_id ;
}
$bloques_cat2 = get_term_by ( 'slug' , 'bloques' , 'category' );
if ( $bloques_cat2 ) {
$bloques_cat_ids [] = $bloques_cat2 -> term_id ;
}
wp_localize_script ( 'bloques-admin' , 'bloquesAdminData' , [
'isPostEditor' => true ,
'bloquesCatIds' => $bloques_cat_ids ,
]);
}
2026-02-13 13:13:06 +01:00
}
}
/**
* Assets del frontend
*/
public function frontend_assets () {
wp_enqueue_style (
'bloques-frontend' ,
BLOQUES_PLUGIN_URL . 'assets/css/frontend.css' ,
[],
BLOQUES_VERSION
);
wp_enqueue_script (
'bloques-frontend' ,
BLOQUES_PLUGIN_URL . 'assets/js/frontend.js' ,
[ 'jquery' ],
BLOQUES_VERSION ,
true
);
wp_localize_script ( 'bloques-frontend' , 'bloquesData' , [
'ajaxUrl' => admin_url ( 'admin-ajax.php' ),
'nonce' => wp_create_nonce ( 'bloques_nonce' ),
'pluginUrl' => BLOQUES_PLUGIN_URL ,
]);
// Añadir CSS personalizado
$custom_css = get_option ( 'bloques_custom_css' , '' );
if ( ! empty ( $custom_css )) {
wp_add_inline_style ( 'bloques-frontend' , $custom_css );
}
}
/**
* Activación del plugin
*/
public function activate () {
// Registrar CPTs y taxonomías
Bloques_Post_Types :: register ();
Bloques_Taxonomies :: register ();
// Flush rewrite rules
flush_rewrite_rules ();
// Marcar como activado
update_option ( 'bloques_transicion_activated' , true );
update_option ( 'bloques_transicion_version' , BLOQUES_VERSION );
}
/**
* Desactivación del plugin
*/
public function deactivate () {
flush_rewrite_rules ();
}
}
/**
* Iniciar el plugin
*/
function bloques_transicion () {
return Bloques_Transicion :: get_instance ();
}
// Arrancar
bloques_transicion ();