Arquitectura del Plugin
Esta sección proporciona una visión técnica completa del Conector NewBytes, incluyendo su estructura, componentes principales y flujo de funcionamiento.
🏗️ Estructura General
Organización de Archivos
woocommerce-newbytes/
├── woocommerce-newbytes.php # Archivo principal del plugin
├── assets/ # Recursos estáticos
│ └── icon-128x128.png # Icono del plugin
├── includes/ # Archivos PHP del core
│ ├── admin-hooks.php # Hooks de administración
│ ├── cron-hooks.php # Sistema de cron jobs
│ ├── logs-manager.php # Gestión de logs JSON
│ ├── logs-page.php # Interfaz de logs
│ ├── modals.php # Componentes de interfaz
│ ├── product-delete.php # Eliminación de productos
│ ├── product-sync.php # Sincronización de productos
│ ├── rest-api.php # Endpoints REST API
│ ├── settings.php # Página de configuración
│ └── utils.php # Funciones utilitarias
├── logs-sync-nb/ # Directorio de logs (creado automáticamente)
└── README.md # Documentación básica
woocommerce-newbytes/
├── woocommerce-newbytes.php # Archivo principal del plugin
├── assets/ # Recursos estáticos
│ └── icon-128x128.png # Icono del plugin
├── includes/ # Archivos PHP del core
│ ├── admin-hooks.php # Hooks de administración
│ ├── cron-hooks.php # Sistema de cron jobs
│ ├── logs-manager.php # Gestión de logs JSON
│ ├── logs-page.php # Interfaz de logs
│ ├── modals.php # Componentes de interfaz
│ ├── product-delete.php # Eliminación de productos
│ ├── product-sync.php # Sincronización de productos
│ ├── rest-api.php # Endpoints REST API
│ ├── settings.php # Página de configuración
│ └── utils.php # Funciones utilitarias
├── logs-sync-nb/ # Directorio de logs (creado automáticamente)
└── README.md # Documentación básica
Archivo Principal
El archivo woocommerce-newbytes.php
actúa como punto de entrada y define:
<?php
/*
Plugin Name: Conector NewBytes
Description: Sincroniza los productos del catálogo de NewBytes con WooCommerce.
Author: NewBytes
Author URI: https://nb.com.ar
Version: 0.1.8
*/
// Constantes globales
define('API_URL_NB', 'https://api.nb.com.ar/v1');
define('VERSION_NB', '0.1.8');
// Inclusión de archivos core
require_once plugin_dir_path(__FILE__) . 'includes/admin-hooks.php';
require_once plugin_dir_path(__FILE__) . 'includes/cron-hooks.php';
// ... otros includes
// Hooks de activación/desactivación
register_activation_hook(__FILE__, 'nb_activation');
register_deactivation_hook(__FILE__, 'nb_deactivation');
<?php
/*
Plugin Name: Conector NewBytes
Description: Sincroniza los productos del catálogo de NewBytes con WooCommerce.
Author: NewBytes
Author URI: https://nb.com.ar
Version: 0.1.8
*/
// Constantes globales
define('API_URL_NB', 'https://api.nb.com.ar/v1');
define('VERSION_NB', '0.1.8');
// Inclusión de archivos core
require_once plugin_dir_path(__FILE__) . 'includes/admin-hooks.php';
require_once plugin_dir_path(__FILE__) . 'includes/cron-hooks.php';
// ... otros includes
// Hooks de activación/desactivación
register_activation_hook(__FILE__, 'nb_activation');
register_deactivation_hook(__FILE__, 'nb_deactivation');
🔧 Componentes Principales
1. Sistema de Autenticación
Archivo: includes/utils.php
Función principal: nb_get_token()
function nb_get_token()
{
$args = array(
'headers' => array('Content-Type' => 'application/json'),
'body' => json_encode(array(
'user' => get_option('nb_user'),
'password' => get_option('nb_password'),
'mode' => 'wp-extension',
'domain' => home_url()
)),
'timeout' => '5',
'blocking' => true,
);
$response = wp_remote_post(API_URL_NB . '/auth/login', $args);
// Procesamiento de respuesta...
}
function nb_get_token()
{
$args = array(
'headers' => array('Content-Type' => 'application/json'),
'body' => json_encode(array(
'user' => get_option('nb_user'),
'password' => get_option('nb_password'),
'mode' => 'wp-extension',
'domain' => home_url()
)),
'timeout' => '5',
'blocking' => true,
);
$response = wp_remote_post(API_URL_NB . '/auth/login', $args);
// Procesamiento de respuesta...
}
Características:
- Autenticación JWT con validación de dominio
- Tokens temporales para cada operación
- Manejo de errores y timeouts
- Validación de credenciales en tiempo real
2. Sistema de Cron Jobs
Archivo: includes/cron-hooks.php
Funciones principales:
nb_cron_interval()
: Define intervalos personalizadosnb_update_cron_schedule()
: Actualiza programaciónnb_callback()
: Ejecuta sincronización
function nb_cron_interval($schedules)
{
$user_interval = intval(get_option('nb_sync_interval', 3600));
$schedules['custom_user_interval'] = array(
'interval' => $user_interval,
'display' => __("NewBytes: Intervalo personalizado para cada {$user_interval_in_min} minutos")
);
return $schedules;
}
function nb_cron_interval($schedules)
{
$user_interval = intval(get_option('nb_sync_interval', 3600));
$schedules['custom_user_interval'] = array(
'interval' => $user_interval,
'display' => __("NewBytes: Intervalo personalizado para cada {$user_interval_in_min} minutos")
);
return $schedules;
}
Características:
- Intervalos configurables desde 1 minuto
- Gestión automática de programación
- Recuperación ante fallos
- Optimización de recursos
3. Sincronización de Productos
Archivo: includes/cron-hooks.php
(función nb_callback
)
Flujo de sincronización:
graph TD
A[Inicio Sincronización] --> B[Obtener Token]
B --> C[Consultar API NewBytes]
C --> D[Procesar Productos]
D --> E[Crear/Actualizar Productos]
E --> F[Eliminar Productos Obsoletos]
F --> G[Generar Log]
G --> H[Fin]
graph TD
A[Inicio Sincronización] --> B[Obtener Token]
B --> C[Consultar API NewBytes]
C --> D[Procesar Productos]
D --> E[Crear/Actualizar Productos]
E --> F[Eliminar Productos Obsoletos]
F --> G[Generar Log]
G --> H[Fin]
Proceso detallado:
- Autenticación: Obtención de token JWT
- Consulta API: Recuperación de catálogo completo
- Procesamiento: Análisis de productos nuevos/existentes
- Operaciones CRUD: Crear, actualizar, eliminar productos
- Logging: Registro detallado de operaciones
4. Gestión de Logs
Archivo: includes/logs-manager.php
Clase principal: NB_Logs_Manager
class NB_Logs_Manager
{
private static $logs_dir;
public static function create_log($api_data, $sync_stats = [], $sync_type = 'auto')
{
$log_data = array(
'timestamp' => current_time('mysql'),
'sync_type' => $sync_type,
'api_data' => $api_data,
'sync_stats' => $sync_stats,
'wordpress_info' => array(
'wp_version' => get_bloginfo('version'),
'wc_version' => WC()->version,
'plugin_version' => VERSION_NB
)
);
// Guardar en archivo JSON...
}
}
class NB_Logs_Manager
{
private static $logs_dir;
public static function create_log($api_data, $sync_stats = [], $sync_type = 'auto')
{
$log_data = array(
'timestamp' => current_time('mysql'),
'sync_type' => $sync_type,
'api_data' => $api_data,
'sync_stats' => $sync_stats,
'wordpress_info' => array(
'wp_version' => get_bloginfo('version'),
'wc_version' => WC()->version,
'plugin_version' => VERSION_NB
)
);
// Guardar en archivo JSON...
}
}
Características:
- Logs en formato JSON estructurado
- Información completa de cada sincronización
- Interfaz web para visualización
- Herramientas de limpieza y descarga
🔄 Flujo de Datos
Sincronización Automática
sequenceDiagram
participant WP as WordPress Cron
participant Plugin as Conector NB
participant API as NewBytes API
participant WC as WooCommerce
participant DB as Base de Datos
WP->>Plugin: Ejecutar nb_cron_sync_event
Plugin->>API: POST /auth/login
API-->>Plugin: JWT Token
Plugin->>API: GET /products (con token)
API-->>Plugin: Catálogo de productos
Plugin->>WC: Crear/Actualizar productos
Plugin->>DB: Guardar log de sincronización
Plugin-->>WP: Sincronización completada
sequenceDiagram
participant WP as WordPress Cron
participant Plugin as Conector NB
participant API as NewBytes API
participant WC as WooCommerce
participant DB as Base de Datos
WP->>Plugin: Ejecutar nb_cron_sync_event
Plugin->>API: POST /auth/login
API-->>Plugin: JWT Token
Plugin->>API: GET /products (con token)
API-->>Plugin: Catálogo de productos
Plugin->>WC: Crear/Actualizar productos
Plugin->>DB: Guardar log de sincronización
Plugin-->>WP: Sincronización completada
Sincronización Manual
sequenceDiagram
participant User as Usuario
participant Admin as Panel Admin
participant Plugin as Conector NB
participant API as NewBytes API
User->>Admin: Clic "Sincronizar Manualmente"
Admin->>Plugin: AJAX nb_manual_sync
Plugin->>API: Proceso de sincronización
API-->>Plugin: Datos de productos
Plugin-->>Admin: Respuesta JSON con resultados
Admin-->>User: Mostrar estadísticas
sequenceDiagram
participant User as Usuario
participant Admin as Panel Admin
participant Plugin as Conector NB
participant API as NewBytes API
User->>Admin: Clic "Sincronizar Manualmente"
Admin->>Plugin: AJAX nb_manual_sync
Plugin->>API: Proceso de sincronización
API-->>Plugin: Datos de productos
Plugin-->>Admin: Respuesta JSON con resultados
Admin-->>User: Mostrar estadísticas
🗄️ Estructura de Base de Datos
Opciones de WordPress
El plugin utiliza la tabla wp_options
para almacenar configuraciones:
Opción | Descripción | Tipo | Ejemplo |
---|---|---|---|
nb_user | Usuario NewBytes | string | "mi-usuario" |
nb_password | Contraseña NewBytes | string | "mi-password" |
nb_token | Token JWT actual | string | "eyJ0eXAiOiJKV1Q..." |
nb_prefix | Prefijo SKU | string | "NB-" |
nb_sync_no_iva | Sincronizar sin IVA | boolean | "1" |
nb_sync_usd | Sincronizar en USD | boolean | "0" |
nb_description | Descripción personalizada | text | "Producto NewBytes..." |
nb_sync_interval | Intervalo en segundos | integer | "1800" |
nb_last_update | Última sincronización | datetime | "2024-01-15 14:30:25" |
Metadatos de Productos
Los productos sincronizados incluyen metadatos específicos:
// Metadatos estándar de WooCommerce
update_post_meta($product_id, '_sku', $prefixed_sku);
update_post_meta($product_id, '_price', $price);
update_post_meta($product_id, '_regular_price', $price);
update_post_meta($product_id, '_stock', $stock);
update_post_meta($product_id, '_manage_stock', 'yes');
// Metadatos específicos del plugin
update_post_meta($product_id, '_nb_product_id', $nb_product_id);
update_post_meta($product_id, '_nb_last_sync', current_time('mysql'));
update_post_meta($product_id, '_nb_original_price', $original_price);
// Metadatos estándar de WooCommerce
update_post_meta($product_id, '_sku', $prefixed_sku);
update_post_meta($product_id, '_price', $price);
update_post_meta($product_id, '_regular_price', $price);
update_post_meta($product_id, '_stock', $stock);
update_post_meta($product_id, '_manage_stock', 'yes');
// Metadatos específicos del plugin
update_post_meta($product_id, '_nb_product_id', $nb_product_id);
update_post_meta($product_id, '_nb_last_sync', current_time('mysql'));
update_post_meta($product_id, '_nb_original_price', $original_price);
🔌 Sistema de Hooks
Hooks de Acción
// Hooks principales del plugin
add_action('nb_cron_sync_event', 'nb_callback');
add_action('admin_menu', 'nb_menu');
add_action('admin_init', 'nb_register_settings');
add_action('wp_ajax_nb_manual_sync', 'nb_manual_sync');
add_action('wp_ajax_nb_update_description_products', 'nb_update_description_products');
add_action('wp_ajax_nb_delete_products', 'nb_delete_products');
// Hooks principales del plugin
add_action('nb_cron_sync_event', 'nb_callback');
add_action('admin_menu', 'nb_menu');
add_action('admin_init', 'nb_register_settings');
add_action('wp_ajax_nb_manual_sync', 'nb_manual_sync');
add_action('wp_ajax_nb_update_description_products', 'nb_update_description_products');
add_action('wp_ajax_nb_delete_products', 'nb_delete_products');
Hooks de Filtro
// Filtros para personalización
add_filter('cron_schedules', 'nb_cron_interval');
add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'nb_plugin_action_links');
// Filtros personalizados para desarrolladores
apply_filters('nb_before_product_sync', $product_data);
apply_filters('nb_after_product_sync', $product_id, $product_data);
apply_filters('nb_sync_price_calculation', $price, $product_data);
// Filtros para personalización
add_filter('cron_schedules', 'nb_cron_interval');
add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'nb_plugin_action_links');
// Filtros personalizados para desarrolladores
apply_filters('nb_before_product_sync', $product_data);
apply_filters('nb_after_product_sync', $product_id, $product_data);
apply_filters('nb_sync_price_calculation', $price, $product_data);
🛡️ Seguridad
Medidas Implementadas
Autenticación Segura
- Tokens JWT con expiración
- Validación de dominio
- Credenciales encriptadas
Validación de Datos
php// Sanitización de entradas $user = sanitize_text_field($_POST['nb_user']); $password = sanitize_text_field($_POST['nb_password']); // Verificación de nonces check_ajax_referer('nb_manual_sync_nonce', 'nonce'); // Validación de permisos if (!current_user_can('manage_options')) { wp_die(__('No tienes permisos suficientes.')); }
// Sanitización de entradas $user = sanitize_text_field($_POST['nb_user']); $password = sanitize_text_field($_POST['nb_password']); // Verificación de nonces check_ajax_referer('nb_manual_sync_nonce', 'nonce'); // Validación de permisos if (!current_user_can('manage_options')) { wp_die(__('No tienes permisos suficientes.')); }
Protección contra Ataques
- Rate limiting en API calls
- Timeouts configurables
- Validación de tipos de datos
- Escape de salidas HTML
Mejores Prácticas Implementadas
- Principio de menor privilegio: Solo permisos necesarios
- Validación de entrada: Todos los datos son sanitizados
- Escape de salida: Prevención de XSS
- Nonces: Protección CSRF en formularios AJAX
- Capabilities: Verificación de permisos de usuario
🚀 Optimización de Rendimiento
Estrategias Implementadas
Gestión de Memoria
php// Configuración dinámica de límites ini_set('max_execution_time', '1800'); // 30 minutos ini_set('memory_limit', '2048M'); // 2 GB
// Configuración dinámica de límites ini_set('max_execution_time', '1800'); // 30 minutos ini_set('memory_limit', '2048M'); // 2 GB
Procesamiento Eficiente
- Procesamiento por lotes de productos
- Consultas optimizadas a la base de datos
- Caché de tokens de autenticación
- Limpieza automática de logs antiguos
Manejo de Errores
phptry { // Operación de sincronización } catch (Exception $e) { error_log('Error en sincronización: ' . $e->getMessage()); // Recuperación graceful }
try { // Operación de sincronización } catch (Exception $e) { error_log('Error en sincronización: ' . $e->getMessage()); // Recuperación graceful }
🔧 Configuración Avanzada
Variables de Entorno
// Configuraciones avanzadas (wp-config.php)
define('NB_DEBUG_MODE', true);
define('NB_API_TIMEOUT', 30);
define('NB_MAX_PRODUCTS_PER_BATCH', 100);
define('NB_LOG_RETENTION_DAYS', 30);
// Configuraciones avanzadas (wp-config.php)
define('NB_DEBUG_MODE', true);
define('NB_API_TIMEOUT', 30);
define('NB_MAX_PRODUCTS_PER_BATCH', 100);
define('NB_LOG_RETENTION_DAYS', 30);
Personalización para Desarrolladores
// Hook para modificar datos antes de sincronizar
add_filter('nb_before_product_sync', function($product_data) {
// Personalizar datos del producto
$product_data['custom_field'] = 'valor_personalizado';
return $product_data;
});
// Hook para acciones post-sincronización
add_action('nb_after_product_sync', function($product_id, $product_data) {
// Acciones personalizadas después de sincronizar
update_post_meta($product_id, '_custom_meta', 'valor');
});
// Hook para modificar datos antes de sincronizar
add_filter('nb_before_product_sync', function($product_data) {
// Personalizar datos del producto
$product_data['custom_field'] = 'valor_personalizado';
return $product_data;
});
// Hook para acciones post-sincronización
add_action('nb_after_product_sync', function($product_id, $product_data) {
// Acciones personalizadas después de sincronizar
update_post_meta($product_id, '_custom_meta', 'valor');
});
Esta arquitectura modular permite extensibilidad y mantenimiento eficiente, siguiendo las mejores prácticas de desarrollo de plugins para WordPress.
💡 Para Desarrolladores
El plugin está diseñado para ser extensible. Utiliza los hooks y filtros proporcionados para personalizar el comportamiento sin modificar el código core.
⚠️ Modificaciones del Core
Evita modificar directamente los archivos del plugin. Las actualizaciones sobrescribirán tus cambios. Usa hooks, filtros y plugins complementarios para personalizaciones.