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