Files
tangente-bloques-en-transicion/bloques-transicion/bloques-transicion.php
2026-02-14 18:21:10 +01:00

238 lines
6.6 KiB
PHP

<?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();
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) {
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
);
// 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,
]);
}
}
}
/**
* 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();