Configuración SMTP nativa y sin dependencias en WordPress con SMTP Indaga

Valencia, 30/10/2026, G.B.
Hoy quiero hablaros de un nuevo añadido que ya forma parte de casa en Indaga.net: el plugin SMTP Indaga. Si habéis seguido otros desarrollos por aquí, ya sabéis cómo me gusta plantear las cosas: herramientas 100% nativas, sin dependencias externas pesadas y con los datos guardados de forma segura en nuestra propia base de datos.

Gestionar el correo electrónico en WordPress suele ser un quebradero de cabeza en muchos hostings compartidos, donde las funciones por defecto fallan o los mensajes acaban directamente en la carpeta de SPAM. Para solucionar esto y mantener un control absoluto, he desarrollado este plugin que intercepta wp_mail() mediante filtros nativos para enrutar los correos a través de cualquier servidor SMTP de forma limpia y transparente.

¿Por qué desarrollar un plugin SMTP propio?

Podría haber recurrido a opciones masivas del repositorio oficial, pero la experiencia nos dice que suelen venir sobrecargadas de opciones comerciales o llamadas innecesarias. Con SMTP Indaga busco mantener la filosofía de la casa:

  • Cero dependencias externas: Todo se apoya exclusivamente en el motor PHPMailer que WordPress incluye de serie
  • Máximo rendimiento: El plugin solo registra los filtros de envío si realmente está habilitado en los ajustes. Si se desactiva, WordPress opera con total normalidad sin consumo extra
  • Seguridad e independencia: Almacenamiento seguro de credenciales mediante la API de opciones y validación estricta de cada parámetro

¿Cómo funciona por dentro?

A nivel técnico, la arquitectura es muy directa y aprovecha los ganchos nativos que nos ofrece WordPress:

  • El filtro phpmailer_init: Modifica el objeto PHPMailer antes de cada envío para configurar el servidor, el puerto, la seguridad (SSL o TLS), el usuario y la contraseña.
  • Forzado de remitente: Mediante wp_mail_from y wp_mail_from_name aseguramos que el correo visible coincida con la cuenta autenticada, evitando rechazos por políticas anti-spoofing.
  • Flujo seguro PRG (Post/Redirect/Get): El panel de administración protege cada guardado y prueba de envío mediante nonces de seguridad (wp_nonce_field) y control de capacidades (manage_options).

Guía de Uso Rápido

  1. Accede a tu panel de administración de WordPress y busca SMTP Indaga dentro del menú de Ajustes
  2. Introduce los datos facilitados por tu proveedor de correo (servidor host, puerto, usuario y contraseña)
  3. Marca la casilla para habilitar el SMTP personalizado y guarda los cambios.
  4. Utiliza la pestaña de prueba de envío para verificar que la conexión funciona correctamente

Ficha Técnica

  • Nombre del plugin: SMTP Indaga
  • Versión: 1.0.0
  • Autor: Guillermo Beltrán Pilato (Indaga.net)
  • Dependencias: 100% nativo (PHP puro, API de WordPress, PHPMailer integrado)
  • Seguridad: Sanitización estricta de variables, nonces de verificación contra ataques CSRF y control de capacidades manage_options
  • Acceso en administración: Ajustes > SMTP Indaga (options-general.php?page=indaga-smtp)


Descargar de mi cuenta de pCloud

Qué es el patrón Singleton y porqué se usa en el plugin CRR

Valencia, 30/10/2026, G.B.
El patrón Singleton garantiza que una clase tenga una única instancia en toda la aplicación y ofrece un punto de acceso global a ella. A raíz de la preparación del cuaderno técnico del plugin Control y Reserva de Recursos (CRR), que publicaré en breve, cuento que, a diferencia de otros desarrollos anteriores como Agenda Indaga, en el CRR no utilizo una clase con patrón Singleton, sino un conjunto de funciones planas con el prefijo crr_ en un único archivo. Vamos a ver qué es este patrón y por qué decidí prescindir de él en este plugin.

Pero, ¿qué es eso del patrón Singleton?

El patrón Singleton (o patrón de instancia única) es un patrón de diseño de software pensado para que una clase tenga una sola instancia y para dar acceso global a ella.

Normalmente, en PHP puedes crear tantos objetos de una clase como quieras con la palabra clave new. El Singleton restringe esto con tres reglas clave:

  1. Constructor privado (private function __construct): impide que cualquier código externo cree nuevos objetos con new MiClase().
  2. Propiedad estática (private static $instance): almacena dentro de la propia clase la única instancia permitida.
  3. Método de acceso público estático (public static function get_instance()): es el único punto de entrada. Si la instancia no existe, la crea; si ya existe, devuelve la que estaba guardada.
class Mi_Plugin_Singleton {
    private static $instance = null;

    // 1. Constructor privado para evitar instanciación externa
    private function __construct() {
        // Inicialización del plugin (ganchos, acciones, etc.)
    }

    // 2. Método global para obtener la única instancia
    public static function get_instance() {
        if ( self::$instance === null ) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

// Arranque del plugin
Mi_Plugin_Singleton::get_instance();

Por qué se usa habitualmente en WordPress

  • Organización orientada a objetos: permite agrupar la lógica, las propiedades y los métodos del plugin en una estructura limpia y encapsulada
  • Ayuda a evitar duplicidades: reduce el riesgo de que los ganchos de WordPress (add_action, add_filter) se registren más de una vez si la clase se carga en distintos puntos del ciclo de vida
  • Punto de acceso único: cualquier parte del plugin puede obtener el mismo objeto con get_instance(), sin pasarlo de un sitio a otro

Por qué decidí no usarlo en el CRR

En el plugin Control y Reserva de Recursos (CRR) opté por un enfoque más directo: un conjunto de funciones con el prefijo único crr_ dentro de un único archivo. Así se ve el arranque en el código real del plugin:

function crr_instalar() {
    // Creación de las tablas con dbDelta, versión de la base de datos, etc.
}
register_activation_hook( __FILE__, 'crr_instalar' );

function crr_comprobar_actualizacion_db() {
    if ( get_option( 'crr_db_version' ) !== CRR_VERSION ) {
        crr_instalar();
    }
}
add_action( 'plugins_loaded', 'crr_comprobar_actualizacion_db' );
  • Simplicidad y legibilidad: se trata de un sistema autocontenido, centrado en la gestión de recursos y reservas mediante formularios e inventario. Un único archivo de funciones se lee de arriba abajo, sin saltar entre clases, y es fácil de mantener
  • Colisiones de nombres prácticamente eliminadas: al usar el prefijo crr_ en todas las funciones y constantes, el riesgo de choque con WordPress o con otros plugins activos es mínimo. No es una garantía absoluta, pero en la práctica basta

Los inconvenientes del Singleton

Conviene ser honestos: el Singleton tampoco está libre de críticas, y muchos desarrolladores lo consideran un antipatrón. Introduce estado global, dificulta las pruebas automatizadas y aumenta el acoplamiento entre componentes. Que sea habitual en WordPress no significa que sea siempre la mejor opción.

Cuándo sí y cuándo no

  • Singleton (o clases en general): si el plugin crece, tiene estado compartido o se compone de varios componentes que deben colaborar
  • Funciones planas con prefijo: si el plugin es pequeño, autocontenido y no necesita compartir estado entre piezas

Este post es, en sí, un apunte técnico; la primera parte del cuaderno técnico del CRR llegará en breve.

Singleton explicado en Refactoring Guru

Cuaderno Técnico: Plugin «Agenda Indaga» (v1.3.0), parte 2

Entrega 2: El Panel de Administración y la Gestión Multinstancia

En la primera entrega vimos los cimientos del plugin: la estructura principal con la clase IndagaAgenda, la seguridad inicial para bloquear accesos directos y la creación nativa de la tabla en la base de datos.

En este segundo bloque me centro en cómo está construido el panel de administración en el backend de WordPress (ubicado en Ajustes > Agenda Indaga), explicando el menú nativo, la estructura modular por pestañas y el control de las distintas instancias o grupos de eventos.

1. Registro del menú en el panel de administración

Para integrar la interfaz dentro del escritorio de WordPress sin cargar librerías adicionales, utilizo la API nativa de menús a través del gancho admin_menu:

public function registrar_menu_admin() {
    add_menu_page(
        'Agenda Indaga',              // Título de la página
        'Agenda Indaga',              // Título del menú
        'manage_options',             // Capacidad / Permiso requerido
        'indaga-agenda',              // Slug único del menú
        array( $this, 'renderizar_panel_admin' ), // Función de callback
        'dashicons-calendar-alt',     // Icono nativo de Dashicons
        6                             // Posición en la barra lateral
    );
}

Puntos clave:

  • manage_options: Garantizo que solo las cuentas con perfil de administración puedan acceder a este panel de control.
  • dashicons-calendar-alt: Aprovecho la librería de iconos nativa de WordPress (Dashicons), manteniendo el plugin sin dependencias externas.

2. Estructura modular por pestañas

Para que la experiencia de uso sea limpia e intuitiva, organizo el panel de administración en tres pestañas bien diferenciadas usando la navegación nativa de WordPress (nav-tab-wrapper):

  1. Gestión e Instancias: Control global de los eventos y de las instancias creadas.
  2. Instrucciones y Shortcodes: Guía rápida para saber cómo insertar los shortcodes.
  3. Ficha Técnica: Resumen de especificaciones del desarrollo.

El cambio entre pestañas se gestiona capturando el parámetro tab mediante la URL (p. ej., ?page=indaga-agenda&tab=instrucciones), sanitizándolo adecuadamente:

$tab = isset( $_GET['tab'] ) ? sanitize_text_field( $_GET['tab'] ) : 'gestion';
?>
<h2 class="nav-tab-wrapper">
    <a href="?page=indaga-agenda&tab=gestion" class="nav-tab <?php echo $tab === 'gestion' ? 'nav-tab-active' : ''; ?>">Gestión e Instancias</a>
    <a href="?page=indaga-agenda&tab=instrucciones" class="nav-tab <?php echo $tab === 'instrucciones' ? 'nav-tab-active' : ''; ?>">Instrucciones y Shortcodes</a>
    <a href="?page=indaga-agenda&tab=tecnica" class="nav-tab <?php echo $tab === 'tecnica' ? 'nav-tab-active' : ''; ?>">Ficha Técnica</a>
</h2>

3. Procesamiento seguro de acciones (eliminación con nonces)

Antes de pintar la vista o consultar los datos, verifico si se ha enviado alguna petición desde los formularios de administración (por ejemplo, para eliminar un evento suelto o una instancia completa).

La seguridad aquí descansa en dos pilares: comprobación de permisos y validación de Nonce para evitar ataques CSRF:

if ( isset( $_POST['indaga_agenda_nonce'] ) && wp_verify_nonce( $_POST['indaga_agenda_nonce'], 'indaga_agenda_admin_action' ) ) {
    
    // Eliminación de un evento individual
    if ( isset( $_POST['accion'] ) && $_POST['accion'] === 'eliminar_evento' && !empty( $_POST['evento_id'] ) ) {
        $evento_id = absint( $_POST['evento_id'] );
        $wpdb->delete( $tabla, array( 'id' => $evento_id ), array( '%d' ) );
        $mensaje = '<div class="updated notice"><p>Evento eliminado correctamente.</p></div>';
    
    // Eliminación de una instancia completa (y todos sus eventos asociados)
    } elseif ( isset( $_POST['accion'] ) && $_POST['accion'] === 'eliminar_instancia' && !empty( $_POST['grupo_id'] ) ) {
        $grupo_id = sanitize_text_field( $_POST['grupo_id'] );
        $wpdb->delete( $tabla, array( 'grupo_id' => $grupo_id ), array( '%s' ) );
        $mensaje = '<div class="updated notice"><p>Instancia completa y todos sus eventos asociados eliminados correctamente.</p></div>';
    }
}
  • wp_verify_nonce(): Garantiza que la petición se ha originado legítimamente dentro del panel y por un usuario autorizado.
  • absint() y sanitize_text_field(): Aseguran que los datos recibidos sean enteros positivos o cadenas limpias sin código malicioso.

4. Consulta agrupada para la gestión multinstancia

El valor diferencial de la versión 1.3.0 es el soporte multinstancia. Mediante una consulta SQL optimizada con agrupamiento (GROUP BY), obtengo la lista de todas las agendas o grupos existentes en la base de datos sin necesidad de tablas auxiliares:

$instancias = $wpdb->get_results( 
    "SELECT grupo_id, COUNT(*) as total_eventos, MIN(fecha_inicio) as primer_evento 
     FROM $tabla 
     GROUP BY grupo_id 
     ORDER BY grupo_id ASC" 
);

Con esto puedo renderizar una tabla clara que indica el nombre del grupo, cuántos eventos almacena y qué shortcode exacto debe copiarse para mostrar esa agenda concreta en el frontend:

<?php foreach ( $instancias as $inst ): ?>
    <tr>
        <td><strong><?php echo esc_html( $inst->grupo_id ); ?></strong></td>
        <td><?php echo esc_html( $inst->total_eventos ); ?> evento(s)</td>
        <td><code>

Acceso restringido: necesitas permisos de administrador para gestionar esta agenda. Iniciar sesión

</code></td> <td><code>

</code></td> <td> <form method="POST" style="display:inline;" onsubmit="return confirm('¿Estás seguro de eliminar esta instancia completa y todos sus eventos?');"> <?php wp_nonce_field( 'indaga_agenda_admin_action', 'indaga_agenda_nonce' ); ?> <input type="hidden" name="accion" value="eliminar_instancia"> <input type="hidden" name="grupo_id" value="<?php echo esc_attr( $inst->grupo_id ); ?>"> <button type="submit" class="button button-small button-link-delete">Eliminar Instancia</button> </form> </td> </tr> <?php endforeach; ?>

Con esto queda cubierto todo el funcionamiento del panel de administración y el control multinstancia desde el backend.

En la siguiente entrega abordaremos la tercera parte del cuaderno técnico: los Shortcodes de Frontend (indaga_agenda y calendario_agenda) (entre corchetes), analizando el formulario de alta de eventos y el calendario mensual interactivo programado en JavaScript nativo.

Hasta pronto!

Gestión de instrucciones y envíos: plugin Indaga Instrucciones

Valencia, 22/10/2026, G.B.
Os presento un nuevo plugin para la gestión de instrucciones y envíos por email. Se trata de Indaga Instrucciones y sirve para enviar instrucciones, como por ejemplo el acceso y uso a una intranet, a los usuarios que registramos directamente desde el panel de control del plugin. Además, permite mantener varias plantillas distintas, cada una con su propio contenido y sus propios destinatarios adicionales, y elegir la que corresponda en cada alta.

Descripción del Plugin

Este desarrollo nativo para Indaga.net automatiza el alta segura de direcciones de correo electrónico, enviando una confirmación individual al usuario y a los destinatarios adicionales de la plantilla elegida, con un documento de instrucciones en PDF, formateado estrictamente en tamaño A4, adjunto.

Permite mantener varias plantillas independientes, de modo que guardar una nunca sobrescribe las demás, y restringir el uso tanto a administradores como a usuarios específicos mediante sus IDs de WordPress, ofreciendo versatilidad tanto en el panel de control como en páginas públicas mediante shortcode.

Guía de Uso

  1. Panel de Administración: Accede a Indaga Instrucciones desde el menú lateral de WordPress para dar de alta correos.
  2. Plantillas: En la pestaña Plantillas puedes crear, editar, duplicar y eliminar tantas plantillas como necesites. Cada una lleva sus propios emails adicionales de confirmación y admite etiquetas dinámicas como {email}, {fecha} o {sitio} para inyectar información de forma automática. Siempre hay una plantilla predeterminada, que no se puede eliminar.
  3. Alta de un email: Al dar de alta una dirección eliges la plantilla. Se usan su contenido y sus destinatarios adicionales, y el registro recuerda qué plantilla se utilizó.
  4. Reenviar PDF: Desde la tabla de registros recientes dispones de un botón rápido con verificación de seguridad para reenviar el documento de manera individual al usuario de esa fila, con la plantilla de su alta y sin avisar de nuevo a los destinatarios adicionales.
  5. Shortcode para Frontend: Inserta el shortcode (entre corchetes) indaga_instrucciones en cualquier página o entrada para que los usuarios con permisos debidamente logueados puedan realizar altas directamente desde la web pública, eligiendo plantilla. La gestión de las plantillas se hace desde el panel de administración.

Ficha Técnica

  • Versión del Plugin: 1.1.0
  • Autor: Guillermo Beltrán Pilato (Indaga.net)
  • Dependencias: 100% Nativo (Cero dependencias externas, librerías de terceros o CDNs. El PDF se genera en PHP puro).
  • Base de datos: Dos tablas propias, una de registros y otra de plantillas, con actualización incremental mediante dbDelta. Al actualizar desde versiones anteriores, la plantilla y los emails existentes se migran sin pérdidas a la primera plantilla.
  • Seguridad: Sanitización completa de variables (sanitize_email, sanitize_text_field, wp_unslash), nonces de verificación dinámicos por elemento (reenvío, duplicado y borrado) contra ataques CSRF, control de capacidades y consultas preparadas con $wpdb.
  • Shortcode: (entre corchetes) indaga_instrucciones

Descarga del plugin: Descargar Indaga Instrucciones v1.1.0

Plugin Resúmenes Indaga

Ya lo explicaré. aquí va el shortcode. Las  cinco últimas entradas publicadas en Indaga.net.

Últimas entradas

Cuaderno Técnico: Plugin «Agenda Indaga» (v1.3.0), parte I

Valencia, 21/10/2026, G.B.
Empiezo una serie de cuadernos técnicos para explicar paso a paso los plugins de Indaga.net. Es una forma práctica de documentar el proceso, compartir el aprendizaje y, de paso, ver de un vistazo qué se puede mejorar o dónde falló algo en su día. Aquí va la primera parte del plugin Agenda Indaga.

Bloque 1: Cabecera, Seguridad y Estructura de la Clase Principal

Todo buen plugin de WordPress empieza con una cabecera limpia y un pequeño control de seguridad para evitar que nadie acceda al archivo directamente desde el navegador.

1. Cabecera del Plugin e Identificación

En las primeras líneas definimos los metadatos que lee WordPress en el listado de plugins. Destaca el uso del dominio de texto (indaga-agenda) y la especificación de autoría de Indaga.net:

<?php
/**
* Plugin Name: Agenda Indaga
* Plugin URI: https://indaga.net
* Description: Plugin nativo de agenda y eventos con soporte multinstancia avanzada...
* Version: 1.3.0
* Author: Guillermo Beltrán Pilato (Indaga.net)
* Author URI: https://indaga.net
* License: GPLv2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: indaga-agenda
*/

2. Bloqueo de Acceso Directo

La seguridad en WordPress empieza por proteger los archivos individuales frente a peticiones HTTP directas que no pasen por el núcleo del CMS. Si la constante global ABSPATH no está definida, abortamos la ejecución de inmediato:

if ( ! defined( 'ABSPATH' ) ) {
exit; // Seguridad: Evitar acceso directo
}

3. Patrón Singleton (IndagaAgenda)

Para evitar duplicidad de instancias y mantener el código ordenado y eficiente en memoria, implementamos el patrón Singleton. Esto garantiza que la clase solo se cargue una vez:

class IndagaAgenda {
private static $instance = null;

public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}

private function __construct() {
// Aquí engancharemos nuestros hooks de activación, menús y shortcodes
register_activation_hook( __FILE__, array( $this, 'activar_plugin' ) );
add_action( 'admin_menu', array( $this, 'registrar_menu_admin' ) );
add_shortcode( 'indaga_agenda', array( $this, 'renderizar_shortcode_agenda' ) );
add_shortcode( 'calendario_agenda', array( $this, 'renderizar_shortcode_calendario' ) );
}
}

// Inicializamos el plugin
IndagaAgenda::get_instance();

Bloque 2: Creación Nativa de la Base de Datos (activar_plugin)

Una de las premisas clave de los plugins en Indaga.net es cero dependencias externas: toda la información reside en nuestras propias tablas optimizadas dentro de la base de datos de WordPress.

Cuando el usuario activa el plugin por primera vez, se dispara el gancho (register_activation_hook) que ejecuta el siguiente método:

public function activar_plugin() {
global $wpdb;
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

$tabla = $wpdb->prefix . 'indaga_agenda';
$charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE $tabla (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
grupo_id varchar(50) DEFAULT 'default' NOT NULL,
titulo varchar(255) NOT NULL,
descripcion text NOT NULL,
fecha_inicio datetime NOT NULL,
fecha_fin datetime NOT NULL,
categoria varchar(50) DEFAULT 'general' NOT NULL,
observaciones text DEFAULT '',
PRIMARY KEY (id),
KEY user_id (user_id),
KEY grupo_id (grupo_id),
KEY fecha_inicio (fecha_inicio)
) $charset_collate;";

dbDelta( $sql );
update_option( 'indaga_agenda_version', '1.3.0' );
}

¿Qué ocurre paso a paso en este método?

  1. global $wpdb;: Cargamos la clase global de WordPress para interactuar de forma segura con la base de datos.

  2. $wpdb->prefix: Añadimos el prefijo personalizado de las tablas de tu instalación de WordPress (por defecto solía ser wp_, resultando en wp_indaga_agenda), garantizando compatibilidad con cualquier entorno.

  3. dbDelta( $sql );: Es la función nativa recomendada de WordPress. Compara si la tabla ya existe o si necesita actualizar su esquema sin destruir los datos ya almacenados.

  4. Campos clave (grupo_id): Este campo es el corazón del soporte multinstancia avanzada, ya que nos permite filtrar y agrupar múltiples agendas independientes dentro de una misma tabla.

Continuaré…

Plugin para tener tu propia agenda dentro de tu WordPress: Agenda Indaga

NOTA: Corrijo bugs de la versión y añado funcionalidades (comentar en Cuadernos Técnicos y en el foro). Versión actual: 1.3.1

Valencia, 19/10/2026, G.B.
Hoy quiero hablaros de un nuevo añadido que ya forma parte de casa en Indaga.net: el plugin de Agenda. Si habéis seguido otros desarrollos por aquí (como el de contabilidad casera o el control de reservas), ya sabéis cómo me gusta plantear las cosas: herramientas 100% nativas, sin dependencias externas pesadas y con los datos guardados de forma segura en nuestra propia base de datos.

Tras darle unas cuantas vueltas para que el calendario mensual en JavaScript fuera fluido, permitiera ver las fichas de los eventos al instante y ofreciera una gestión limpia de altas, modificaciones y borrados desde el propio panel, el resultado final ya está funcionando a la perfección. Os dejo su ficha técnica.

Ficha Técnica del Plugin: Agenda Indaga

  • Nombre del Plugin: Agenda Indaga
  • Versión Actual: 1.3.1
  • Autor: Guillermo Beltrán Pilato (Indaga.net)
  • Licencia: GPLv2 o posterior (Software libre)
  • Descripción: Gestión centralizada de agenda, eventos y citas personales o institucionales con soporte multinstancia por pestañas, vistas de calendario mensual interactivo nativo con fichas modales emergentes y panel de administración seguro.
  • Acceso: Ajustes > Agenda Indaga (wp-admin/options-general.php?page=indaga-agenda)
  • Shortcodes Disponibles:
    • indaga_agenda id="default" — Despliega el formulario seguro de alta, edición y listado de gestión de eventos.
    • calendario_agenda id="default" — Renderiza el calendario mensual interactivo nativo en JavaScript vanilla, con fichas modales emergentes al hacer clic en los eventos.
  • Arquitectura de Base de Datos: Tabla nativa independiente {prefix}indaga_agenda con soporte para multi-instancias (grupo_id), gestión de fechas/horas, categorías y control de usuarios.
  • Dependencias: 100% nativo (PHP Vanilla, WordPress WPDB API, Options API y JavaScript/CSS nativos sin librerías externas).
  • Seguridad y Permisos: Sanitización completa de entradas (sanitize_text_field, sanitize_textarea_field, absint), escapado estricto en salidas (esc_html, esc_attr), protección Anti-CSRF mediante nonces de WordPress, consultas preparadas ($wpdb->prepare) y restricción de administración a la capacidad manage_options.
  • Descarga: Agenda Indaga

Ejemplo:

Acceso restringido: necesitas permisos de administrador para gestionar esta agenda. Iniciar sesión

Control y Reserva de Recursos (CRR): un sistema para la gestión de salas, equipos y servicios en WordPress

Valencia, 14/10/2026, G.B.
Os presento la versión 1.12.0 de mi plugin Control y Reserva de Recursos (CRR) para WordPress
. Una solución 100% nativa y completa diseñada para la gestión integral de inventarios, control de disponibilidad en tiempo real y reserva de espacios, materiales y servicios de forma sencilla e intuitiva desde la web.

Aquí va un ejemplo del sistema principal:

Debes iniciar sesión para realizar, editar o gestionar tus reservas.

Para ver la ocupación mensual en la vista de calendario:

« Anterior

Noviembre 2026

Siguiente »
Lun
Mar
Mié
Jue
Vie
Sáb
Dom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
×

Ficha de Reserva

Recurso:
Solicitante:
Fechas:
Horario:
Cantidad:
Precio Estimado:
Observaciones:

Acerca de CRR

La gestión eficiente de espacios compartidos, equipamiento de alta gama o servicios especializados suele requerir herramientas complejas o plataformas de terceros que escapan al control directo del sitio web. Con el objetivo de mantener una solución 100% nativa, ligera y sin dependencias externas, nace Control y Reserva de Recursos (CRR), un plugin diseñado a medida para centralizar todo el ciclo de reservas de forma independiente y segura.

¿Qué ofrece Control y Reserva de Recursos (CRR)?

Este desarrollo unifica en un único paquete todo lo necesario para que tanto los usuarios como los administradores gestionen la disponibilidad de recursos de manera fluida:

1. Gestión de Inventario y tipologías flexibles

El administrador cuenta con un panel completo de inventario integrado directamente en la base de datos de WordPress. Los recursos se pueden clasificar en tres grandes categorías (ampliables):

  • Espacios / Salas

  • Material / Equipamiento

  • Servicios Cada recurso incluye control de stock o capacidad simultánea, precio por hora configurable y un correo electrónico asignado para el responsable directo del recurso.

2. Selector inteligente con buscador y filtros en tiempo real

A la hora de solicitar una reserva, los usuarios disfrutan de un selector visual moderno. Permite filtrar los recursos por tipo mediante botones interactivos y refinar la búsqueda al instante escribiendo en un cajón de texto inteligente que filtra por nombre o tipología sin necesidad de recargar la página.

3. Cálculo automático de presupuestos y notificaciones

El sistema calcula de manera automática el coste estimado de la reserva en función de los días, las horas exactas de inicio/fin y la cantidad seleccionada. Además, envía de forma automatizada correos de confirmación y actualización tanto al solicitante como al responsable del recurso, incluyendo opcionalmente el desglose detallado del presupuesto.

4. Vista de calendario mensual interactiva

Mediante el shortcode crr_calendario, cualquier página de la web puede transformarse en un calendario de ocupación mensual. Las reservas se listan ordenadas por horario y, al hacer clic sobre cualquiera de ellas, se despliega una ficha flotante de detalles con toda la información clave de la reserva.

5. Panel de control frontend para usuarios autorizados

No todo depende del panel de administración de WordPress. El plugin permite definir en los ajustes generales una lista de correos electrónicos autorizados. Estos usuarios, sin necesidad de ser administradores, podrán acceder desde el frontal a un Panel de Gestión Avanzado que incluye:

  • Filtros por rango de fechas (Desde / Hasta).

  • Filtro por categorías de recursos.

  • Búsqueda de texto libre compatible con comodines (por ejemplo, utilizando asteriscos como *proyector* o Servicio de*).

6. Exportación dual: Excel y CSV

Para la labor administrativa y de reporting, el panel incluye opciones de exportación instantánea (tanto de todo el histórico como de los datos filtrados en pantalla). El usuario puede elegir entre:

  • 📊 Excel (.csv optimizado): Formato configurado con delimitador de punto y coma (;) y codificación UTF-8 con BOM, garantizando que tildes, eñes y caracteres especiales se abran perfectamente al hacer doble clic en Microsoft Excel o LibreOffice Calc.

  • 📄 CSV estándar: Para integraciones universales.

Compromiso técnico de desarrollo

Siguiendo las directrices de desarrollo nativo de Indaga.net, CRR destaca por:

  • Cero dependencias externas: Sin librerías JavaScript pesadas ni llamadas a APIs de terceros.

  • Seguridad rigurosa: Uso estricto de consultas preparadas ($wpdb), sanitización de entradas, escapado de salidas y validación mediante Nonces de WordPress.

  • Experiencia de usuario optimizada: Incorporación de persistencia de scroll mediante sessionStorage, evitando los molestos saltos al principio de la página tras enviar formularios o aplicar filtros.

  • 📋 Ficha Técnica del Plugin

    • Nombre del Plugin: Control y Reserva de Recursos (CRR)

    • Versión: 1.12.0

    • Autor: Guillermo Beltrán Pilato

    • Sitio Web: Indaga.net

    • Compatibilidad WordPress: 6.0 o superior

    • Licencia: Software libre / Independiente

    • Descripción Breve: Sistema completo e independiente para la gestión y reserva de recursos, salas y servicios con presupuestos automáticos, vista de calendario interactiva, selector avanzado por categorías con buscador instantáneo, panel frontal de filtrado dinámico y exportación dual (Excel optimizado o CSV estándar).

    • Shortcodes Disponibles:

      • crr_reservas (entre corchetes []): Muestra el formulario de solicitud, inventario y panel de gestión frontal.

      • crr_calendario (entre corchetes []): Renderiza la vista de calendario mensual de ocupación.

  • Descargar plugin

Plugin para contabilidad casera y control de pasos diarios

NOTA: Actualizo a la versión 1.7.9

Valencia, 17/10/2026, G.B.
Este plugin para WordPress permite llevar una gestión clara del presupuesto familiar y el patrimonio, ofreciendo balances por períodos, gráficos visuales de ingresos y gastos, y un historial sencillo para el registro de pasos diarios.

Ficha Técnica del Plugin

Contabilidad Casera Indaga

  • Nombre del Plugin: Contabilidad Casera Indaga
  • Versión actual: 1.7.9
  • Autor: Guillermo Beltrán Pilato (Indaga.net)
  • Sitio Web del Autor: https://indaga.net
  • Licencia: GPL-2.0+
  • Texto de Dominio: contabilidad-casera-indaga
  • Enlace de Descarga: Descargar v.1.7.9

Descripción General

Sistema de contabilidad casera privado, ligero, seguro y 100% nativo en WordPress. Diseñado bajo los estándares de desarrollo de Indaga.net, opera sin dependencias externas ni servicios de terceros, garantizando la absoluta privacidad de los datos financieros, presupuestarios y de actividad física del usuario.

Actualización: Contabilidad Casera Indaga v1.7.9

Te presento la nueva versión 1.7.9 de Contabilidad Casera Indaga, mi plugin privado de gestión doméstica, presupuestos y control de actividad física. En esta iteración he incorporado importantes mejoras enfocadas en la flexibilidad de los registros y en la optimización de las herramientas de consulta y edición diaria.

Las principales novedades e implementaciones de esta versión son:

Edición y Gestión Avanzada del Registro de Pasos

  • Edición directa en la interfaz: He añadido un soporte completo para modificar registros de pasos anteriores de forma intuitiva, permitiendo que al pulsar el botón de edición en la tabla de actividad, los datos se carguen automáticamente en el formulario superior para su actualización.

  • Control de unicidad por fecha: He reforzado la lógica de guardado y actualización para evitar duplicidades de fechas en los registros diarios, incorporando avisos claros en caso de conflicto.

Buscador de Conceptos Dedicado

  • Búsqueda multicriterio: Se mantiene y consolida el bloque de búsqueda independiente en la pestaña de Gestión Financiera, permitiendo filtrar instantáneamente los movimientos contables por descripción, concepto o categoría mediante consultas seguras con comodines (LIKE).

Presupuestos Mensuales y Categorías Flexibles

  • Selector y edición libre: El sistema de presupuestos sigue permitiendo seleccionar categorías existentes desde un menú desplegable dinámico o introducir nombres personalizados (como Gastos fantasma, Ocio, etc.) para un control granular de los límites mensuales.

Exportación Completa a CSV

  • Compatibilidad optimizada con Excel: Continúa disponible la descarga directa y segura del histórico contable y de actividad física en formato CSV con codificación UTF-8 con BOM y separadores por punto y coma (;).

Arquitectura, Privacidad y Seguridad

  • Desarrollo 100% nativo: Siguiendo la filosofía de Indaga.net, el plugin opera de forma completamente autónoma, sin dependencias externas, librerías de terceros ni llamadas a servicios o APIs de pago en la nube.

  • Actualización transparente: Mediante el control de versión de base de datos (cci_comprobar_version_db() y dbDelta), las tablas se actualizan de forma segura al cargar el plugin sin comprometer ni alterar los datos previos.

  • Seguridad integral: He reforzado la validación de permisos administrativos (manage_options), la sanitización rigurosa de entradas y la protección estricta contra ataques CSRF mediante Nonces.

Actualización del plugin Mis Plugins (control de plugins de Indaga.net)

Valencia, 09/10/2026, G.B.
Llevo ya unos cuantos plugins a medida y, como pasa siempre, llega un momento en que pierdes la cuenta de cuál tiene qué versión, aunque los subo todos a mi cuenta de pCloud. Así que hice lo que haría cualquiera: otro plugin. Se llama Mis Plugins (Control de Plugins Propios) y es el catálogo donde apunto todos los demás. Puedes descargarlo desde mi cuenta de pCloud.

Qué hace

Guarda en su propia tabla de la base de datos una ficha por cada plugin, con estos campos:

  • Fecha, solo mes y año
  • Nombre y versión
  • Autor
  • Descripción
  • Tags, separados por comas
  • Enlace de descarga

Desde el panel de administración se crean, editan y eliminan fichas con un formulario sencillo. Y si me equivoco al rellenarlo, el formulario conserva lo que había escrito — antes me lo vaciaba y tocaba empezar de cero, que escuece.

El shortcode

Para enseñarlo en cualquier página o entrada basta con insertar (entre corchetes, []):

mis_plugins

Por defecto muestra diez plugins por página. Si quieres otra cifra (lo mismo, entre corchetes):

mis_plugins por_pagina="10"

El visitante puede buscar por nombre, versión, autor, descripción o tags, y ordenar el listado por fecha, nombre, versión o autor. La paginación funciona con parámetros por URL, sin recargas raras.

De tabla a bloques

La primera versión mostraba todo en una tabla, con una columna por campo. En el papel quedaba muy ordenado, pero en pantalla no había quien lo leyera: descripciones apretadas, tags cortados y en el móvil, ni hablar.

Ahora cada plugin es un bloque independiente: arriba el nombre y la versión, debajo la fecha y el autor, luego la descripción, los tags y el botón de descarga. Como ya no hay cabeceras de columna, el orden se elige con una barra «Ordenar por» encima del listado. De paso arreglé que la versión se ordenara como texto, así que 1.10.0 ya no aparece antes que 1.9.0.

Actualizar sin que WordPress se líe

Aquí viene la parte con anécdota. Para que WordPress reconozca el fichero como una actualización y no como un plugin nuevo, la cabecera tiene que conservar el nombre, la descripción y el autor tal cual, y lo único que cambia es el número de versión. A la primera entrega le había añadido una frase a la descripción, y eso ya basta para liarla.

Luego, al activarlo, me saltó un error fatal. Mi sospecha principal es que WordPress identifica un plugin por la ruta del fichero y no por su nombre. Si la ruta no coincide con la de la versión anterior, quedan los dos cargados a la vez y las funciones se declaran dos veces. La segunda posibilidad era un detalle de sintaxis que no le gusta a las versiones de PHP anteriores a la 7.1. Corregí lo segundo, comprobé que no hubiera dos copias activas y a partir de ahí funcionó. Moraleja: antes de actualizar, mira cómo se llama el fichero que ya tienes instalado.

Porqué así

Como en el resto de plugins, la idea es la misma: un único fichero PHP, sin librerías externas, consultas preparadas, nonces y el patrón POST/Redirect/GET. La estructura de la tabla no cambió entre versiones, así que no se pierde ni un dato al actualizar, que es una promesa que me tomo en serio.

Puedes ver cómo queda en la página de Control de Plugins.