/** * Plugin Name: ronin CRM Link * Plugin URI: https://www.ronins.org/ * Description: Shortcode [enlace_crm] para enlaces salientes al CRM, con registro de leads en un CPT propio y aviso por correo. El seguimiento usa navigator.sendBeacon contra un endpoint REST del plugin, así que no depende de formularios de Elementor. * Version: 3.5.0 * Author: ronin * Author URI: https://www.ronincreativos.com * Ronin Module: yes * Requires at least: 5.0 * Requires PHP: 8.0 * License: GPLv2 or later * * El historial de versiones vive en changelog.md. */ defined( 'ABSPATH' ) || exit; // Ya no hay que mantener nada en sync: la version sale del header, que es la // unica fuente de verdad. La constante escrita a mano ya se habia quedado atras // (3.4.4 frente a 3.4.4.1 del header), y como alimenta el cache busting del JS // del tracker, los navegadores seguian sirviendo la version vieja del script. define( 'RCL_VERSION', get_file_data( __FILE__, [ 'Version' => 'Version' ] )['Version'] ?: '0.0.0' ); define( 'RCL_FILE', __FILE__ ); define( 'RCL_PATH', plugin_dir_path( __FILE__ ) ); define( 'RCL_URL', plugin_dir_url( __FILE__ ) ); define( 'RCL_OPTION', 'ronin_crm_link' ); // Clave unica de la option (array). define( 'RCL_CPT', 'rcl_lead' ); // Custom post type donde viven los leads. require_once RCL_PATH . 'includes/shortcode.php'; require_once RCL_PATH . 'includes/class-rcl-settings.php'; require_once RCL_PATH . 'includes/class-rcl-cpt.php'; require_once RCL_PATH . 'includes/class-rcl-admin.php'; require_once RCL_PATH . 'includes/class-rcl-mailer.php'; require_once RCL_PATH . 'includes/class-rcl-rest.php'; require_once RCL_PATH . 'includes/class-rcl-tracker.php'; add_action( 'plugins_loaded', function () { new RCL_Settings(); new RCL_CPT(); new RCL_Admin(); new RCL_Rest(); new RCL_Tracker(); } ); /** * En activacion registramos el CPT y refrescamos reglas. No es publico (no tiene * rewrite), pero es buena practica dejar el menu/listado consistente. */ register_activation_hook( __FILE__, function () { RCL_CPT::register_post_type(); flush_rewrite_rules(); } ); register_deactivation_hook( __FILE__, 'flush_rewrite_rules' ); /** * Menu padre compartido "Ronin". Convencion del ecosistema: el primero en * definir RONIN_PARENT_MENU registra el parent; los demas se cuelgan de el. * Prioridad 9 (antes 5): Ronin Plugins Hub se engancha en 1 y gana siempre la * carrera, los submenus propios van en 20. * * La callback dejo de ser la funcion global ronin_hub_page() y pasa a ser un * closure. Esa funcion sin prefijo era el origen de una colision con el propio * Hub, que tuvo que renombrar la suya; con el closure el nombre desaparece del * espacio global y el conflicto no puede repetirse. */ add_action( 'admin_menu', function () { if ( defined( 'RONIN_PARENT_MENU' ) ) { return; } define( 'RONIN_PARENT_MENU', 'ronin' ); add_menu_page( 'Ronin Plugins', 'Ronin', 'manage_options', 'ronin', function () { echo '
Selecciona un plugin del menu lateral.