Skip to content

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
<?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()

php
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 personalizados
  • nb_update_cron_schedule(): Actualiza programación
  • nb_callback(): Ejecuta sincronización
php
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:

mermaid
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:

  1. Autenticación: Obtención de token JWT
  2. Consulta API: Recuperación de catálogo completo
  3. Procesamiento: Análisis de productos nuevos/existentes
  4. Operaciones CRUD: Crear, actualizar, eliminar productos
  5. Logging: Registro detallado de operaciones

4. Gestión de Logs

Archivo: includes/logs-manager.php

Clase principal: NB_Logs_Manager

php
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

mermaid
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

mermaid
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ónDescripciónTipoEjemplo
nb_userUsuario NewBytesstring"mi-usuario"
nb_passwordContraseña NewBytesstring"mi-password"
nb_tokenToken JWT actualstring"eyJ0eXAiOiJKV1Q..."
nb_prefixPrefijo SKUstring"NB-"
nb_sync_no_ivaSincronizar sin IVAboolean"1"
nb_sync_usdSincronizar en USDboolean"0"
nb_descriptionDescripción personalizadatext"Producto NewBytes..."
nb_sync_intervalIntervalo en segundosinteger"1800"
nb_last_updateÚltima sincronizacióndatetime"2024-01-15 14:30:25"

Metadatos de Productos

Los productos sincronizados incluyen metadatos específicos:

php
// 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

php
// 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

php
// 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

  1. Autenticación Segura

    • Tokens JWT con expiración
    • Validación de dominio
    • Credenciales encriptadas
  2. 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.'));
    }
  3. 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

  1. 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
  2. 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
  3. Manejo de Errores

    php
    try {
        // 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

php
// 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

php
// 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.