Skip to content

Hooks y Filtros

Esta sección documenta todos los hooks de acción y filtros disponibles en el Conector NewBytes para desarrolladores que deseen extender o personalizar su funcionalidad.

🎣 Hooks de Acción (Actions)

Hooks del Sistema Principal

nb_before_sync

Descripción: Se ejecuta antes de iniciar cualquier sincronización.

Parámetros:

  • $sync_type (string): Tipo de sincronización ('manual', 'automatic', 'description')

Ejemplo:

php
add_action('nb_before_sync', function($sync_type) {
    // Preparar sistema antes de sincronizar
    if ($sync_type === 'manual') {
        // Lógica específica para sincronización manual
        error_log('Iniciando sincronización manual');
    }
    
    // Limpiar caché si es necesario
    wp_cache_flush();
});
add_action('nb_before_sync', function($sync_type) {
    // Preparar sistema antes de sincronizar
    if ($sync_type === 'manual') {
        // Lógica específica para sincronización manual
        error_log('Iniciando sincronización manual');
    }
    
    // Limpiar caché si es necesario
    wp_cache_flush();
});

nb_after_sync

Descripción: Se ejecuta después de completar una sincronización.

Parámetros:

  • $sync_type (string): Tipo de sincronización
  • $sync_stats (array): Estadísticas de la sincronización
  • $sync_result (array): Resultado completo de la sincronización

Ejemplo:

php
add_action('nb_after_sync', function($sync_type, $sync_stats, $sync_result) {
    // Enviar notificación por email si hay errores
    if (!empty($sync_result['errors'])) {
        $admin_email = get_option('admin_email');
        wp_mail(
            $admin_email,
            'Error en sincronización NewBytes',
            'Se detectaron errores: ' . implode(', ', $sync_result['errors'])
        );
    }
    
    // Actualizar estadísticas personalizadas
    update_option('my_custom_sync_count', get_option('my_custom_sync_count', 0) + 1);
});
add_action('nb_after_sync', function($sync_type, $sync_stats, $sync_result) {
    // Enviar notificación por email si hay errores
    if (!empty($sync_result['errors'])) {
        $admin_email = get_option('admin_email');
        wp_mail(
            $admin_email,
            'Error en sincronización NewBytes',
            'Se detectaron errores: ' . implode(', ', $sync_result['errors'])
        );
    }
    
    // Actualizar estadísticas personalizadas
    update_option('my_custom_sync_count', get_option('my_custom_sync_count', 0) + 1);
});

Hooks de Productos

nb_before_product_create

Descripción: Se ejecuta antes de crear un nuevo producto.

Parámetros:

  • $product_data (array): Datos del producto desde NewBytes
  • $nb_product_id (string): ID del producto en NewBytes

Ejemplo:

php
add_action('nb_before_product_create', function($product_data, $nb_product_id) {
    // Log personalizado de creación de productos
    error_log("Creando producto NewBytes ID: {$nb_product_id}");
    
    // Preparar datos adicionales
    if (isset($product_data['category']) && $product_data['category'] === 'electronics') {
        // Lógica específica para electrónicos
    }
});
add_action('nb_before_product_create', function($product_data, $nb_product_id) {
    // Log personalizado de creación de productos
    error_log("Creando producto NewBytes ID: {$nb_product_id}");
    
    // Preparar datos adicionales
    if (isset($product_data['category']) && $product_data['category'] === 'electronics') {
        // Lógica específica para electrónicos
    }
});

nb_after_product_create

Descripción: Se ejecuta después de crear un producto exitosamente.

Parámetros:

  • $product_id (int): ID del producto en WordPress
  • $product_data (array): Datos del producto
  • $nb_product_id (string): ID del producto en NewBytes

Ejemplo:

php
add_action('nb_after_product_create', function($product_id, $product_data, $nb_product_id) {
    // Asignar categorías personalizadas
    $custom_category = get_term_by('slug', 'newbytes-products', 'product_cat');
    if ($custom_category) {
        wp_set_post_terms($product_id, array($custom_category->term_id), 'product_cat', true);
    }
    
    // Añadir metadatos personalizados
    update_post_meta($product_id, '_custom_source', 'newbytes');
    update_post_meta($product_id, '_import_date', current_time('mysql'));
});
add_action('nb_after_product_create', function($product_id, $product_data, $nb_product_id) {
    // Asignar categorías personalizadas
    $custom_category = get_term_by('slug', 'newbytes-products', 'product_cat');
    if ($custom_category) {
        wp_set_post_terms($product_id, array($custom_category->term_id), 'product_cat', true);
    }
    
    // Añadir metadatos personalizados
    update_post_meta($product_id, '_custom_source', 'newbytes');
    update_post_meta($product_id, '_import_date', current_time('mysql'));
});

nb_before_product_update

Descripción: Se ejecuta antes de actualizar un producto existente.

Parámetros:

  • $product_id (int): ID del producto en WordPress
  • $product_data (array): Nuevos datos del producto
  • $old_data (array): Datos anteriores del producto

Ejemplo:

php
add_action('nb_before_product_update', function($product_id, $product_data, $old_data) {
    // Detectar cambios significativos de precio
    $old_price = floatval($old_data['price'] ?? 0);
    $new_price = floatval($product_data['price'] ?? 0);
    
    if (abs($old_price - $new_price) > ($old_price * 0.1)) { // Cambio > 10%
        // Notificar cambio significativo de precio
        update_post_meta($product_id, '_price_change_alert', current_time('mysql'));
    }
});
add_action('nb_before_product_update', function($product_id, $product_data, $old_data) {
    // Detectar cambios significativos de precio
    $old_price = floatval($old_data['price'] ?? 0);
    $new_price = floatval($product_data['price'] ?? 0);
    
    if (abs($old_price - $new_price) > ($old_price * 0.1)) { // Cambio > 10%
        // Notificar cambio significativo de precio
        update_post_meta($product_id, '_price_change_alert', current_time('mysql'));
    }
});

nb_after_product_update

Descripción: Se ejecuta después de actualizar un producto.

Parámetros:

  • $product_id (int): ID del producto en WordPress
  • $product_data (array): Datos actualizados
  • $changes (array): Lista de campos que cambiaron

Ejemplo:

php
add_action('nb_after_product_update', function($product_id, $product_data, $changes) {
    // Log de cambios específicos
    if (in_array('stock', $changes)) {
        $new_stock = get_post_meta($product_id, '_stock', true);
        error_log("Stock actualizado para producto {$product_id}: {$new_stock}");
    }
    
    // Invalidar caché específico del producto
    wp_cache_delete("product_data_{$product_id}", 'woocommerce');
});
add_action('nb_after_product_update', function($product_id, $product_data, $changes) {
    // Log de cambios específicos
    if (in_array('stock', $changes)) {
        $new_stock = get_post_meta($product_id, '_stock', true);
        error_log("Stock actualizado para producto {$product_id}: {$new_stock}");
    }
    
    // Invalidar caché específico del producto
    wp_cache_delete("product_data_{$product_id}", 'woocommerce');
});

nb_before_product_delete

Descripción: Se ejecuta antes de eliminar un producto.

Parámetros:

  • $product_id (int): ID del producto a eliminar
  • $product_sku (string): SKU del producto

Ejemplo:

php
add_action('nb_before_product_delete', function($product_id, $product_sku) {
    // Crear backup del producto antes de eliminar
    $product_data = array(
        'id' => $product_id,
        'sku' => $product_sku,
        'title' => get_the_title($product_id),
        'deleted_at' => current_time('mysql')
    );
    
    $backups = get_option('nb_deleted_products_backup', array());
    $backups[] = $product_data;
    update_option('nb_deleted_products_backup', $backups);
});
add_action('nb_before_product_delete', function($product_id, $product_sku) {
    // Crear backup del producto antes de eliminar
    $product_data = array(
        'id' => $product_id,
        'sku' => $product_sku,
        'title' => get_the_title($product_id),
        'deleted_at' => current_time('mysql')
    );
    
    $backups = get_option('nb_deleted_products_backup', array());
    $backups[] = $product_data;
    update_option('nb_deleted_products_backup', $backups);
});

Hooks de Autenticación

nb_before_auth

Descripción: Se ejecuta antes de intentar autenticación con NewBytes.

Parámetros:

  • $credentials (array): Credenciales de autenticación

Ejemplo:

php
add_action('nb_before_auth', function($credentials) {
    // Log de intentos de autenticación
    error_log('Intentando autenticación NewBytes para usuario: ' . $credentials['user']);
});
add_action('nb_before_auth', function($credentials) {
    // Log de intentos de autenticación
    error_log('Intentando autenticación NewBytes para usuario: ' . $credentials['user']);
});

nb_auth_success

Descripción: Se ejecuta cuando la autenticación es exitosa.

Parámetros:

  • $token (string): Token JWT obtenido
  • $user_info (array): Información del usuario

Ejemplo:

php
add_action('nb_auth_success', function($token, $user_info) {
    // Actualizar estadísticas de conexión
    update_option('nb_last_successful_auth', current_time('mysql'));
    update_option('nb_auth_attempts', 0); // Reset contador de fallos
});
add_action('nb_auth_success', function($token, $user_info) {
    // Actualizar estadísticas de conexión
    update_option('nb_last_successful_auth', current_time('mysql'));
    update_option('nb_auth_attempts', 0); // Reset contador de fallos
});

nb_auth_failed

Descripción: Se ejecuta cuando la autenticación falla.

Parámetros:

  • $error (string): Mensaje de error
  • $credentials (array): Credenciales utilizadas

Ejemplo:

php
add_action('nb_auth_failed', function($error, $credentials) {
    // Incrementar contador de fallos
    $attempts = get_option('nb_auth_attempts', 0) + 1;
    update_option('nb_auth_attempts', $attempts);
    
    // Bloquear temporalmente después de 5 fallos
    if ($attempts >= 5) {
        update_option('nb_auth_blocked_until', time() + (15 * 60)); // 15 minutos
    }
});
add_action('nb_auth_failed', function($error, $credentials) {
    // Incrementar contador de fallos
    $attempts = get_option('nb_auth_attempts', 0) + 1;
    update_option('nb_auth_attempts', $attempts);
    
    // Bloquear temporalmente después de 5 fallos
    if ($attempts >= 5) {
        update_option('nb_auth_blocked_until', time() + (15 * 60)); // 15 minutos
    }
});

🔍 Filtros (Filters)

Filtros de Datos de Producto

nb_product_data_before_sync

Descripción: Permite modificar los datos del producto antes de sincronizar.

Parámetros:

  • $product_data (array): Datos originales del producto
  • $nb_product_id (string): ID del producto en NewBytes

Retorna: Array con datos modificados del producto

Ejemplo:

php
add_filter('nb_product_data_before_sync', function($product_data, $nb_product_id) {
    // Aplicar margen de ganancia personalizado
    if (isset($product_data['price'])) {
        $margin = get_option('my_custom_margin', 1.2); // 20% margen
        $product_data['price'] = $product_data['price'] * $margin;
    }
    
    // Personalizar descripción según categoría
    if (isset($product_data['category']) && $product_data['category'] === 'electronics') {
        $product_data['description'] = '[ELECTRÓNICO] ' . $product_data['description'];
    }
    
    return $product_data;
}, 10, 2);
add_filter('nb_product_data_before_sync', function($product_data, $nb_product_id) {
    // Aplicar margen de ganancia personalizado
    if (isset($product_data['price'])) {
        $margin = get_option('my_custom_margin', 1.2); // 20% margen
        $product_data['price'] = $product_data['price'] * $margin;
    }
    
    // Personalizar descripción según categoría
    if (isset($product_data['category']) && $product_data['category'] === 'electronics') {
        $product_data['description'] = '[ELECTRÓNICO] ' . $product_data['description'];
    }
    
    return $product_data;
}, 10, 2);

nb_product_price_calculation

Descripción: Permite personalizar el cálculo de precios.

Parámetros:

  • $price (float): Precio original
  • $product_data (array): Datos completos del producto
  • $price_type (string): Tipo de precio ('regular', 'sale', 'with_tax', 'without_tax')

Retorna: Float con el precio modificado

Ejemplo:

php
add_filter('nb_product_price_calculation', function($price, $product_data, $price_type) {
    // Aplicar descuentos por volumen según stock
    $stock = intval($product_data['stock'] ?? 0);
    
    if ($stock > 100) {
        $price = $price * 0.95; // 5% descuento para productos con mucho stock
    } elseif ($stock < 10) {
        $price = $price * 1.05; // 5% incremento para productos con poco stock
    }
    
    // Redondear a .99
    $price = floor($price) + 0.99;
    
    return $price;
}, 10, 3);
add_filter('nb_product_price_calculation', function($price, $product_data, $price_type) {
    // Aplicar descuentos por volumen según stock
    $stock = intval($product_data['stock'] ?? 0);
    
    if ($stock > 100) {
        $price = $price * 0.95; // 5% descuento para productos con mucho stock
    } elseif ($stock < 10) {
        $price = $price * 1.05; // 5% incremento para productos con poco stock
    }
    
    // Redondear a .99
    $price = floor($price) + 0.99;
    
    return $price;
}, 10, 3);

nb_product_sku_generation

Descripción: Permite personalizar la generación de SKUs.

Parámetros:

  • $sku (string): SKU generado por defecto
  • $product_data (array): Datos del producto
  • $prefix (string): Prefijo configurado

Retorna: String con el SKU personalizado

Ejemplo:

php
add_filter('nb_product_sku_generation', function($sku, $product_data, $prefix) {
    // Incluir código de categoría en el SKU
    $category_codes = array(
        'electronics' => 'EL',
        'clothing' => 'CL',
        'home' => 'HM'
    );
    
    $category = $product_data['category'] ?? 'general';
    $category_code = $category_codes[$category] ?? 'GN';
    
    // Formato: NB-EL-12345
    $nb_id = $product_data['id'] ?? '';
    return $prefix . $category_code . '-' . $nb_id;
}, 10, 3);
add_filter('nb_product_sku_generation', function($sku, $product_data, $prefix) {
    // Incluir código de categoría en el SKU
    $category_codes = array(
        'electronics' => 'EL',
        'clothing' => 'CL',
        'home' => 'HM'
    );
    
    $category = $product_data['category'] ?? 'general';
    $category_code = $category_codes[$category] ?? 'GN';
    
    // Formato: NB-EL-12345
    $nb_id = $product_data['id'] ?? '';
    return $prefix . $category_code . '-' . $nb_id;
}, 10, 3);

Filtros de Configuración

nb_sync_interval_options

Descripción: Permite añadir opciones personalizadas de intervalo de sincronización.

Parámetros:

  • $intervals (array): Intervalos disponibles por defecto

Retorna: Array con intervalos modificados

Ejemplo:

php
add_filter('nb_sync_interval_options', function($intervals) {
    // Añadir intervalos personalizados
    $intervals[300] = '5 minutos';
    $intervals[900] = '15 minutos';
    $intervals[7200] = '2 horas';
    $intervals[21600] = '6 horas';
    
    return $intervals;
});
add_filter('nb_sync_interval_options', function($intervals) {
    // Añadir intervalos personalizados
    $intervals[300] = '5 minutos';
    $intervals[900] = '15 minutos';
    $intervals[7200] = '2 horas';
    $intervals[21600] = '6 horas';
    
    return $intervals;
});

nb_api_request_args

Descripción: Permite modificar argumentos de requests a la API.

Parámetros:

  • $args (array): Argumentos del request
  • $endpoint (string): Endpoint de la API
  • $method (string): Método HTTP

Retorna: Array con argumentos modificados

Ejemplo:

php
add_filter('nb_api_request_args', function($args, $endpoint, $method) {
    // Aumentar timeout para endpoints específicos
    if ($endpoint === '/products' && $method === 'GET') {
        $args['timeout'] = 60; // 60 segundos para catálogo completo
    }
    
    // Añadir headers personalizados
    $args['headers']['X-Custom-Client'] = 'WordPress-Plugin';
    $args['headers']['X-Site-Domain'] = home_url();
    
    return $args;
}, 10, 3);
add_filter('nb_api_request_args', function($args, $endpoint, $method) {
    // Aumentar timeout para endpoints específicos
    if ($endpoint === '/products' && $method === 'GET') {
        $args['timeout'] = 60; // 60 segundos para catálogo completo
    }
    
    // Añadir headers personalizados
    $args['headers']['X-Custom-Client'] = 'WordPress-Plugin';
    $args['headers']['X-Site-Domain'] = home_url();
    
    return $args;
}, 10, 3);

Filtros de Logs

nb_log_data_before_save

Descripción: Permite modificar datos del log antes de guardarlo.

Parámetros:

  • $log_data (array): Datos del log
  • $sync_type (string): Tipo de sincronización

Retorna: Array con datos de log modificados

Ejemplo:

php
add_filter('nb_log_data_before_save', function($log_data, $sync_type) {
    // Añadir información personalizada al log
    $log_data['custom_info'] = array(
        'server_load' => sys_getloadavg()[0],
        'memory_usage' => memory_get_usage(true),
        'active_plugins' => count(get_option('active_plugins', array()))
    );
    
    // Filtrar información sensible en logs automáticos
    if ($sync_type === 'automatic') {
        unset($log_data['api_data']['raw_response']);
    }
    
    return $log_data;
}, 10, 2);
add_filter('nb_log_data_before_save', function($log_data, $sync_type) {
    // Añadir información personalizada al log
    $log_data['custom_info'] = array(
        'server_load' => sys_getloadavg()[0],
        'memory_usage' => memory_get_usage(true),
        'active_plugins' => count(get_option('active_plugins', array()))
    );
    
    // Filtrar información sensible en logs automáticos
    if ($sync_type === 'automatic') {
        unset($log_data['api_data']['raw_response']);
    }
    
    return $log_data;
}, 10, 2);

nb_log_retention_days

Descripción: Permite personalizar el tiempo de retención de logs.

Parámetros:

  • $days (int): Días de retención por defecto

Retorna: Integer con días modificados

Ejemplo:

php
add_filter('nb_log_retention_days', function($days) {
    // Retener logs más tiempo en producción
    if (wp_get_environment_type() === 'production') {
        return 90; // 90 días en producción
    }
    
    return 30; // 30 días en desarrollo
});
add_filter('nb_log_retention_days', function($days) {
    // Retener logs más tiempo en producción
    if (wp_get_environment_type() === 'production') {
        return 90; // 90 días en producción
    }
    
    return 30; // 30 días en desarrollo
});

🔧 Hooks Personalizados para Extensiones

Crear Hooks Personalizados

php
// En tu plugin o tema
function my_custom_nb_extension() {
    // Ejecutar antes de cada sincronización
    add_action('nb_before_sync', 'my_pre_sync_tasks');
    
    // Modificar precios según reglas de negocio
    add_filter('nb_product_price_calculation', 'my_custom_pricing', 10, 3);
    
    // Añadir metadatos personalizados
    add_action('nb_after_product_create', 'my_add_custom_meta', 10, 3);
}
add_action('plugins_loaded', 'my_custom_nb_extension');

function my_pre_sync_tasks($sync_type) {
    // Limpiar caché personalizado
    wp_cache_delete('my_custom_cache_key');
    
    // Preparar base de datos
    global $wpdb;
    $wpdb->query("OPTIMIZE TABLE {$wpdb->postmeta}");
}

function my_custom_pricing($price, $product_data, $price_type) {
    // Aplicar descuentos por temporada
    $current_month = date('n');
    
    if (in_array($current_month, [11, 12])) { // Noviembre y Diciembre
        $price = $price * 0.9; // 10% descuento navideño
    }
    
    return $price;
}

function my_add_custom_meta($product_id, $product_data, $nb_product_id) {
    // Añadir fecha de importación
    update_post_meta($product_id, '_nb_import_date', current_time('mysql'));
    
    // Calcular y guardar margen de ganancia
    $cost = $product_data['cost'] ?? 0;
    $price = $product_data['price'] ?? 0;
    $margin = $price > 0 ? (($price - $cost) / $price) * 100 : 0;
    update_post_meta($product_id, '_profit_margin', $margin);
}
// En tu plugin o tema
function my_custom_nb_extension() {
    // Ejecutar antes de cada sincronización
    add_action('nb_before_sync', 'my_pre_sync_tasks');
    
    // Modificar precios según reglas de negocio
    add_filter('nb_product_price_calculation', 'my_custom_pricing', 10, 3);
    
    // Añadir metadatos personalizados
    add_action('nb_after_product_create', 'my_add_custom_meta', 10, 3);
}
add_action('plugins_loaded', 'my_custom_nb_extension');

function my_pre_sync_tasks($sync_type) {
    // Limpiar caché personalizado
    wp_cache_delete('my_custom_cache_key');
    
    // Preparar base de datos
    global $wpdb;
    $wpdb->query("OPTIMIZE TABLE {$wpdb->postmeta}");
}

function my_custom_pricing($price, $product_data, $price_type) {
    // Aplicar descuentos por temporada
    $current_month = date('n');
    
    if (in_array($current_month, [11, 12])) { // Noviembre y Diciembre
        $price = $price * 0.9; // 10% descuento navideño
    }
    
    return $price;
}

function my_add_custom_meta($product_id, $product_data, $nb_product_id) {
    // Añadir fecha de importación
    update_post_meta($product_id, '_nb_import_date', current_time('mysql'));
    
    // Calcular y guardar margen de ganancia
    $cost = $product_data['cost'] ?? 0;
    $price = $product_data['price'] ?? 0;
    $margin = $price > 0 ? (($price - $cost) / $price) * 100 : 0;
    update_post_meta($product_id, '_profit_margin', $margin);
}

Hooks Condicionales

php
// Ejecutar hooks solo en ciertas condiciones
add_action('nb_before_sync', function($sync_type) {
    // Solo en sincronizaciones manuales
    if ($sync_type === 'manual') {
        // Enviar notificación a administradores
        $admins = get_users(array('role' => 'administrator'));
        foreach ($admins as $admin) {
            wp_mail(
                $admin->user_email,
                'Sincronización manual iniciada',
                'Se ha iniciado una sincronización manual en ' . get_bloginfo('name')
            );
        }
    }
});

// Filtros basados en configuración
add_filter('nb_product_data_before_sync', function($product_data, $nb_product_id) {
    // Solo aplicar si está habilitada la opción personalizada
    if (get_option('my_custom_product_enhancement', false)) {
        $product_data['description'] .= "\n\nProducto importado automáticamente desde NewBytes.";
    }
    
    return $product_data;
}, 10, 2);
// Ejecutar hooks solo en ciertas condiciones
add_action('nb_before_sync', function($sync_type) {
    // Solo en sincronizaciones manuales
    if ($sync_type === 'manual') {
        // Enviar notificación a administradores
        $admins = get_users(array('role' => 'administrator'));
        foreach ($admins as $admin) {
            wp_mail(
                $admin->user_email,
                'Sincronización manual iniciada',
                'Se ha iniciado una sincronización manual en ' . get_bloginfo('name')
            );
        }
    }
});

// Filtros basados en configuración
add_filter('nb_product_data_before_sync', function($product_data, $nb_product_id) {
    // Solo aplicar si está habilitada la opción personalizada
    if (get_option('my_custom_product_enhancement', false)) {
        $product_data['description'] .= "\n\nProducto importado automáticamente desde NewBytes.";
    }
    
    return $product_data;
}, 10, 2);

📚 Ejemplos de Uso Avanzado

Sistema de Notificaciones

php
class NB_Notification_System {
    
    public function __construct() {
        add_action('nb_after_sync', array($this, 'check_sync_results'), 10, 3);
        add_action('nb_auth_failed', array($this, 'notify_auth_failure'), 10, 2);
    }
    
    public function check_sync_results($sync_type, $sync_stats, $sync_result) {
        // Notificar si hay muchos errores
        $error_count = count($sync_result['errors'] ?? array());
        $total_products = $sync_stats['products_processed'] ?? 0;
        
        if ($total_products > 0 && ($error_count / $total_products) > 0.1) {
            $this->send_alert('Alto porcentaje de errores en sincronización', array(
                'sync_type' => $sync_type,
                'errors' => $error_count,
                'total' => $total_products,
                'percentage' => round(($error_count / $total_products) * 100, 2)
            ));
        }
    }
    
    public function notify_auth_failure($error, $credentials) {
        $this->send_alert('Fallo de autenticación NewBytes', array(
            'error' => $error,
            'user' => $credentials['user'],
            'timestamp' => current_time('mysql')
        ));
    }
    
    private function send_alert($subject, $data) {
        $admin_email = get_option('admin_email');
        $message = "Alerta del Conector NewBytes:\n\n";
        $message .= print_r($data, true);
        
        wp_mail($admin_email, $subject, $message);
    }
}

new NB_Notification_System();
class NB_Notification_System {
    
    public function __construct() {
        add_action('nb_after_sync', array($this, 'check_sync_results'), 10, 3);
        add_action('nb_auth_failed', array($this, 'notify_auth_failure'), 10, 2);
    }
    
    public function check_sync_results($sync_type, $sync_stats, $sync_result) {
        // Notificar si hay muchos errores
        $error_count = count($sync_result['errors'] ?? array());
        $total_products = $sync_stats['products_processed'] ?? 0;
        
        if ($total_products > 0 && ($error_count / $total_products) > 0.1) {
            $this->send_alert('Alto porcentaje de errores en sincronización', array(
                'sync_type' => $sync_type,
                'errors' => $error_count,
                'total' => $total_products,
                'percentage' => round(($error_count / $total_products) * 100, 2)
            ));
        }
    }
    
    public function notify_auth_failure($error, $credentials) {
        $this->send_alert('Fallo de autenticación NewBytes', array(
            'error' => $error,
            'user' => $credentials['user'],
            'timestamp' => current_time('mysql')
        ));
    }
    
    private function send_alert($subject, $data) {
        $admin_email = get_option('admin_email');
        $message = "Alerta del Conector NewBytes:\n\n";
        $message .= print_r($data, true);
        
        wp_mail($admin_email, $subject, $message);
    }
}

new NB_Notification_System();

Sistema de Caché Personalizado

php
class NB_Cache_Manager {
    
    public function __construct() {
        add_action('nb_before_sync', array($this, 'clear_product_cache'));
        add_action('nb_after_product_update', array($this, 'invalidate_product_cache'), 10, 3);
        add_filter('nb_product_data_before_sync', array($this, 'maybe_use_cached_data'), 5, 2);
    }
    
    public function clear_product_cache() {
        wp_cache_delete('nb_product_list', 'newbytes');
        wp_cache_delete('nb_category_mapping', 'newbytes');
    }
    
    public function invalidate_product_cache($product_id, $product_data, $changes) {
        wp_cache_delete("nb_product_{$product_id}", 'newbytes');
        
        // Si cambió la categoría, limpiar caché de categorías
        if (in_array('category', $changes)) {
            wp_cache_delete('nb_category_mapping', 'newbytes');
        }
    }
    
    public function maybe_use_cached_data($product_data, $nb_product_id) {
        $cache_key = "nb_enhanced_product_{$nb_product_id}";
        $cached_data = wp_cache_get($cache_key, 'newbytes');
        
        if ($cached_data !== false) {
            return $cached_data;
        }
        
        // Procesar y cachear datos mejorados
        $enhanced_data = $this->enhance_product_data($product_data);
        wp_cache_set($cache_key, $enhanced_data, 'newbytes', 3600); // 1 hora
        
        return $enhanced_data;
    }
    
    private function enhance_product_data($product_data) {
        // Lógica de mejora de datos
        return $product_data;
    }
}

new NB_Cache_Manager();
class NB_Cache_Manager {
    
    public function __construct() {
        add_action('nb_before_sync', array($this, 'clear_product_cache'));
        add_action('nb_after_product_update', array($this, 'invalidate_product_cache'), 10, 3);
        add_filter('nb_product_data_before_sync', array($this, 'maybe_use_cached_data'), 5, 2);
    }
    
    public function clear_product_cache() {
        wp_cache_delete('nb_product_list', 'newbytes');
        wp_cache_delete('nb_category_mapping', 'newbytes');
    }
    
    public function invalidate_product_cache($product_id, $product_data, $changes) {
        wp_cache_delete("nb_product_{$product_id}", 'newbytes');
        
        // Si cambió la categoría, limpiar caché de categorías
        if (in_array('category', $changes)) {
            wp_cache_delete('nb_category_mapping', 'newbytes');
        }
    }
    
    public function maybe_use_cached_data($product_data, $nb_product_id) {
        $cache_key = "nb_enhanced_product_{$nb_product_id}";
        $cached_data = wp_cache_get($cache_key, 'newbytes');
        
        if ($cached_data !== false) {
            return $cached_data;
        }
        
        // Procesar y cachear datos mejorados
        $enhanced_data = $this->enhance_product_data($product_data);
        wp_cache_set($cache_key, $enhanced_data, 'newbytes', 3600); // 1 hora
        
        return $enhanced_data;
    }
    
    private function enhance_product_data($product_data) {
        // Lógica de mejora de datos
        return $product_data;
    }
}

new NB_Cache_Manager();

Esta documentación de hooks y filtros permite a los desarrolladores extender el Conector NewBytes de manera segura y eficiente, sin modificar el código core del plugin.


💡 Mejores Prácticas

Usa siempre hooks y filtros en lugar de modificar directamente el código del plugin. Esto garantiza que tus personalizaciones sobrevivan a las actualizaciones.

⚠️ Rendimiento

Ten cuidado con hooks que se ejecutan frecuentemente como nb_after_product_update. Operaciones pesadas pueden afectar el rendimiento de la sincronización.