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.