// Nueva asociación
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* FUNCION COMENTARIZADA QUE ASIGNA CAATEGORIAS
NOTA: al menu se agergan de modo manual
function gestionar_categorias_producto($producto_syscom) {
static $categoria_cache = array(); // Cache estática para toda la ejecución
$categorias_wp = array();
if (empty($producto_syscom['categorias'])) {
error_log('[CVA] Producto ' . ($producto_syscom['producto_id'] ?? '') . ' no tiene categorías definidas');
return $categorias_wp;
}
// Organizar categorías por nivel
$categorias_por_nivel = array();
foreach ($producto_syscom['categorias'] as $categoria) {
if (!isset($categoria['nivel']) || !isset($categoria['nombre'])) continue;
$categorias_por_nivel[(int)$categoria['nivel']] = $categoria;
}
// Procesar solo hasta el nivel 2 (ignorar nivel 3)
$parent_id = 0;
for ($nivel = 1; $nivel <= 2; $nivel++) {
if (!isset($categorias_por_nivel[$nivel])) continue;
$cat_syscom = $categorias_por_nivel[$nivel];
$nombre_categoria = $cat_syscom['nombre']; // Nombre sin ID (solo palabras)
$id_categoria = isset($cat_syscom['id']) ? $cat_syscom['id'] : 0;
$slug_categoria = $id_categoria ? $id_categoria : sanitize_title($nombre_categoria); // Slug = ID de Syscom
$cache_key = md5($nombre_categoria . '|' . $parent_id . '|' . $id_categoria);
// Verificar cache primero
if (isset($categoria_cache[$cache_key])) {
$term_id = $categoria_cache[$cache_key];
} else {
// Primero buscar por meta field (ID Syscom)
$term = false;
if ($id_categoria) {
$terms = get_terms(array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_query' => array(
array(
'key' => 'syscom_category_id',
'value' => $id_categoria,
'compare' => '='
)
)
));
if (!empty($terms) && !is_wp_error($terms)) {
foreach ($terms as $possible_term) {
if ($possible_term->parent == $parent_id) {
$term = $possible_term;
break;
}
}
}
}
// Si no se encontró por ID, buscar por nombre y parent
if (!$term) {
$term = get_term_by('name', $nombre_categoria, 'product_cat');
// Verificar si el término encontrado tiene el parent correcto
if ($term && $term->parent != $parent_id) {
$term = false;
}
}
// Si no existe, crear la categoría
if (!$term) {
$new_term = wp_insert_term(
$nombre_categoria, // Nombre sin ID
'product_cat',
array(
'slug' => $slug_categoria, // Slug = ID de Syscom
'parent' => $parent_id
)
);
if (!is_wp_error($new_term)) {
// Guardar metadatos con el ID de Syscom si está disponible
if ($id_categoria) {
update_term_meta($new_term['term_id'], 'syscom_category_id', $id_categoria);
}
$term_id = $new_term['term_id'];
$categoria_cache[$cache_key] = $term_id; // Almacenar en cache
} else {
error_log('[CVA] Error al crear categoría: ' . $new_term->get_error_message());
continue;
}
} else {
$term_id = $term->term_id;
$categoria_cache[$cache_key] = $term_id; // Almacenar en cache
}
}
if (!empty($term_id)) {
$categorias_wp[] = $term_id;
$parent_id = $term_id; // Establecer como padre para el siguiente nivel
}
}
return $categorias_wp;
}
*/
// Función para gestionar contador de actualizaciones (se mantiene igual)
function gestionar_contador_actualizaciones($accion = 'obtener', $incremento = 0) {
static $contador_total = 0;
if ($accion === 'incrementar') {
$contador_total += $incremento;
update_option('syscom_productos_actualizados_total', $contador_total);
} elseif ($accion === 'reset') {
$contador_total = 0;
update_option('syscom_productos_actualizados_total', $contador_total);
}
return $contador_total;
}
// Función optimizada para buscar productos por SKU
function buscar_producto_por_sku($sku) {
global $wpdb;
return $wpdb->get_var(
$wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_sku' AND meta_value = %s LIMIT 1", $sku)
);
}
// Función para obtener token de SYSCOM (se mantiene igual)
function obtener_token_syscom() {
$token_data = get_option('syscom_token_data');
if ($token_data) {
$token_data = json_decode($token_data, true);
if (time() < $token_data['expires_at']) {
return $token_data['access_token'];
}
}
$credenciales = obtener_credenciales_syscom();
$response = wp_remote_post('https://developers.syscom.mx/oauth/token', [
'body' => [
'client_id' => $credenciales['client_id'],
'client_secret' => $credenciales['client_secret'],
'grant_type' => 'client_credentials'
],
'headers' => ['Content-Type' => 'application/x-www-form-urlencoded']
]);
if (!is_wp_error($response)) {
$response_data = json_decode(wp_remote_retrieve_body($response), true);
if (isset($response_data['access_token'])) {
$token_data = [
'access_token' => $response_data['access_token'],
'expires_at' => time() + $response_data['expires_in']
];
update_option('syscom_token_data', json_encode($token_data));
return $response_data['access_token'];
}
}
return null;
}
function actualizar_precios_productos_marcas($marcas, $categorias_id_syscom = [22, 25, 26, 27, 30, 32, 37, 38, 65811, 66523, 66630]) {
global $wpdb;
error_log("[CVA] Inicio actualizar_precios_productos_marcas - Memoria usada: " . memory_get_usage() / 1024 / 1024 . " MB");
$start_time = microtime(true);
// Desactivar hooks y cache para mejor rendimiento
remove_all_actions('save_post_product');
remove_all_actions('woocommerce_update_product');
wp_suspend_cache_addition(true);
wp_defer_term_counting(true);
wp_defer_comment_counting(true);
$access_token = obtener_token_syscom();
if (!$access_token) return false;
$tipo_cambio = obtener_tipo_cambio($access_token);
if (!$tipo_cambio) return false;
$productos_por_pagina = 900;
$multiplicador = 1.26;
$total_actualizados = 0;
$categorias_cache = array(); // Cache para categorías ya procesadas
foreach ($marcas as $id_marca) {
foreach ($categorias_id_syscom as $categoria_id_syscom) {
$pagina_actual = 1;
do {
$url = 'https://developers.syscom.mx/api/v1/productos?' . http_build_query([
'categoria' => $categoria_id_syscom,
'marca' => $id_marca,
'pagina' => $pagina_actual,
'limit' => $productos_por_pagina
]);
$response = wp_remote_get($url, [
'headers' => [
'Authorization' => 'Bearer ' . $access_token,
'Content-Type' => 'application/json',
],
'timeout' => 45
]);
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200) break;
$data = json_decode(wp_remote_retrieve_body($response), true);
if (empty($data['productos'])) break;
foreach ($data['productos'] as $producto) {
$sku = sanitize_text_field($producto['producto_id']);
$product_id = buscar_producto_por_sku($sku);
if (!$product_id) continue;
// ========== SECCIÓN DE CATEGORÍAS DEFINITIVA ==========
/* $categorias_wp = array();
$categorias_por_nivel = array();
// 1. Filtrar y organizar solo categorías de nivel 1 y 2
foreach ($producto['categorias'] as $categoria) {
if (isset($categoria['nivel']) && ($categoria['nivel'] == 1 || $categoria['nivel'] == 2)) {
$categorias_por_nivel[(int)$categoria['nivel']] = array(
'id' => $categoria['id'],
'nombre' => trim($categoria['nombre']),
'nivel' => (int)$categoria['nivel']
);
}
}
// 2. Procesar jerárquicamente
$parent_id = 0;
for ($nivel = 1; $nivel <= 2; $nivel++) {
if (!isset($categorias_por_nivel[$nivel])) {
continue;
}
$cat_syscom = $categorias_por_nivel[$nivel];
$nombre_categoria = $cat_syscom['nombre'];
$id_categoria = $cat_syscom['id'];
$cache_key = 'syscom_cat_'.$id_categoria.'_parent_'.$parent_id;
// 3. Buscar en caché
if (isset($categorias_cache[$cache_key])) {
$term_id = $categorias_cache[$cache_key];
} else {
// 4. Buscar por ID Syscom (meta field)
$term = false;
$terms = get_terms(array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_query' => array(
array(
'key' => 'syscom_category_id',
'value' => $id_categoria
)
),
'parent' => $parent_id
));
if (!empty($terms) && !is_wp_error($terms)) {
$term = $terms[0];
}
// 5. Si no se encontró, buscar por nombre exacto y parent
if (!$term) {
$term = get_term_by('name', $nombre_categoria, 'product_cat');
if ($term && $term->parent != $parent_id) {
$term = false;
}
}
// 6. Crear categoría si no existe
if (!$term) {
$new_term = wp_insert_term(
$nombre_categoria,
'product_cat',
array(
'slug' => $id_categoria, // Usamos el ID de Syscom como slug
'parent' => $parent_id
)
);
if (!is_wp_error($new_term)) {
update_term_meta($new_term['term_id'], 'syscom_category_id', $id_categoria);
$term_id = $new_term['term_id'];
error_log('[CVA] Categoría creada: ID '.$term_id.' - '.$nombre_categoria.' (Syscom ID: '.$id_categoria.')');
} else {
error_log('[CVA] Error al crear categoría: '.$new_term->get_error_message());
continue;
}
} else {
$term_id = $term->term_id;
// Actualizar meta si no estaba registrado
if (!get_term_meta($term_id, 'syscom_category_id', true)) {
update_term_meta($term_id, 'syscom_category_id', $id_categoria);
}
}
$categorias_cache[$cache_key] = $term_id;
}
if (!empty($term_id)) {
$categorias_wp[] = $term_id;
$parent_id = $term_id;
}
}
// 7. Asignar categorías al producto
if (!empty($categorias_wp)) {
wp_set_object_terms($product_id, $categorias_wp, 'product_cat', false);
error_log('[CVA] Asignadas categorías a producto '.$product_id.': '.implode(', ', $categorias_wp).' | Origen: N1-'.$categorias_por_nivel[1]['id'].' N2-'.($categorias_por_nivel[2]['id'] ?? 'N/A'));
} else {
error_log('[CVA] Producto '.$product_id.' no tiene categorías válidas de nivel 1-2');
}
// ========== FIN SECCIÓN CATEGORÍAS ==========
*/
// Resto del código para actualizar precios y stock...
$precio_final = floatval($producto['precios']['precio_descuento'] ?? 0) * $tipo_cambio * $multiplicador;
$precio_regular = floatval($producto['precios']['precio_lista'] ?? 0) * $tipo_cambio * $multiplicador;
$total_existencia = intval($producto['total_existencia'] ?? 0);
$estado = ($total_existencia > 0) ? 'publish' : 'private';
update_post_meta($product_id, '_regular_price', $precio_regular);
update_post_meta($product_id, '_sale_price', $precio_final);
update_post_meta($product_id, '_price', $precio_final);
$wpdb->query($wpdb->prepare(
"UPDATE {$wpdb->postmeta} SET meta_value = %d WHERE post_id = %d AND meta_key = '_stock'",
$total_existencia,
$product_id
));
$wpdb->query($wpdb->prepare(
"UPDATE {$wpdb->posts} SET post_status = %s WHERE ID = %d",
$estado,
$product_id
));
wp_set_object_terms($product_id, 'productos-procesados', 'product_shipping_class');
$categorias_log = isset($producto['categorias']) ? json_encode($producto['categorias']) : '[]';
error_log(sprintf(
'[%s] [CVA] Actualizado - ID: %d, SKU: %s, Precio: %.2f, Stock: %d, Estado: %s, Categorías: %s',
current_time('d-M-Y H:i:s'),
$product_id,
$sku,
$precio_final,
$total_existencia,
$estado,
$categorias_log
));
$total_actualizados++;
}
$pagina_actual++;
sleep(1); // Pequeña pausa entre páginas
} while ($pagina_actual <= 100);
}
}
// Reactivar todo lo desactivado
wp_suspend_cache_addition(false);
wp_defer_term_counting(false);
wp_defer_comment_counting(false);
wp_cache_flush();
// Actualizar contador
gestionar_contador_actualizaciones('incrementar', $total_actualizados);
error_log("[CVA] Fin actualizar_precios_productos_marcas - Tiempo: " . (microtime(true) - $start_time) . " seg - Memoria: " . memory_get_peak_usage() / 1024 / 1024 . " MB");
return true;
}
// Función para obtener tipo de cambio (optimizada)
function obtener_tipo_cambio($access_token) {
$response = wp_remote_get('https://developers.syscom.mx/api/v1/tipocambio', [
'headers' => [
'Authorization' => 'Bearer ' . $access_token,
'Content-Type' => 'application/json',
],
'timeout' => 10
]);
if (!is_wp_error($response)) {
$data = json_decode(wp_remote_retrieve_body($response), true);
return $data['un_mes'] ?? null;
}
return null;
}
// Función para obtener credenciales (mejorada para seguridad)
function obtener_credenciales_syscom() {
return [
'client_id' => defined('SYSCOM_CLIENT_ID') ? SYSCOM_CLIENT_ID : 'o2b8DQbsbOeiZDW3JQkXA77qwzPvpsiR',
'client_secret' => defined('SYSCOM_CLIENT_SECRET') ? SYSCOM_CLIENT_SECRET : 'MRT9ixv4N4iBT9cuTgZi9UiUOAAWPwr3efszhbTM'
];
}
// ==============================================
// NUEVA ESTRUCTURA DE EVENTOS - LOTES PEQUEÑOS
// ==============================================
// Grupos de marcas (2 marcas por evento)
function actualizar_productos_grupo_1() {
$marcas = array('linkedpro', 'linkedprobyfiberhome');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_2() {
$marcas = array('westerndigitalwd', 'epcomproaudio');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_3() {
$marcas = array('epcomprofessional', 'honeywellanalytics');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_4() {
$marcas = array('honeywellfarenhytseries', 'honeywellpava');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_5() {
$marcas = array('siemon', 'winlandelectronics');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_6() {
$marcas = array('jabra', 'bea');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_7() {
$marcas = array('condumex', 'zktecoaccesspro');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_8() {
$marcas = array('zktecogreenlabel', 'accessproindustrial');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_9() {
$marcas = array('3cx', '3icorporation');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_10() {
$marcas = array('abloy', 'acti');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_11() {
$marcas = array('actisense', 'adata');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_12() {
$marcas = array('alarmcontrolsassaabloy', 'altalabs');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_13() {
$marcas = array('altaitechnologies', 'altronix');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_14() {
$marcas = array('alvarado', 'alvarion');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_15() {
$marcas = array('amancowavin', 'americanearthanchors');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_16() {
$marcas = array('amphenol', 'amprobe');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_17() {
$marcas = array('andrew', 'aoc');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_18() {
$marcas = array('aplicacionestecnologicas', 'apollo');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_19() {
$marcas = array('arduinollc', 'assaabloy');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_20() {
$marcas = array('astron', 'aten');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_21() {
$marcas = array('asus', 'ugreen');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_22() {
$marcas = array('epcom', 'aufit');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_23() {
$marcas = array('bcdvideo', 'beeelectronicsinc');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_24() {
$marcas = array('belden', 'brilliant');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_25() {
$marcas = array('brukenassaabloy', 'bunkerseguridad');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_26() {
$marcas = array('cadexelectronicsinc', 'charofil');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_27() {
$marcas = array('camesa', 'century');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_28() {
$marcas = array('chint', 'cobra');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_29() {
$marcas = array('commscopeandrew', 'compustar');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_30() {
$marcas = array('comunello', 'concox');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_31() {
$marcas = array('cosmiconn', 'cresco');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_32() {
$marcas = array('crescend', 'crow');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_33() {
$marcas = array('davidclark', 'dbspectra');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_34() {
$marcas = array('digifort', 'dji');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_35() {
$marcas = array('dmt', 'dormakaba');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_36() {
$marcas = array('ecoflow', 'egiaudiosolutions');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_37() {
$marcas = array('ditek', 'emrcorporation');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_38() {
$marcas = array('endura', 'enforcersecolarm');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_39() {
$marcas = array('engenius', 'epever');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_40() {
$marcas = array('ezviz', 'firstalert');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_41() {
$marcas = array('federalsignalindustrial', 'good2go');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_42() {
$marcas = array('fiberhome', 'gemeco');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_43() {
$marcas = array('google', 'guestinternet');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_44() {
$marcas = array('rfindustriesltd', 'rhon');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_45() {
$marcas = array('rosslaresecurityproducts', 'ruggear');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_46() {
$marcas = array('ruijie', 'rule');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_47() {
$marcas = array('ruptela', 'safefiredetectioninc');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_48() {
$marcas = array('sanddisk', 'safesignal');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_49() {
$marcas = array('ritron', 'wago');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_50() {
$marcas = array('witek', 'wilsonproweboost');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_51() {
$marcas = array('winsted', 'xtralis');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_52() {
$marcas = array('yaleassaabloy', 'yamaha');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_53() {
$marcas = array('yonusa', 'zetron');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_54() {
$marcas = array('thorsman', 'timesmicrowave');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_55() {
$marcas = array('totalground', 'tplink');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_56() {
$marcas = array('tplcommunications', 'pryme');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_57() {
$marcas = array('rawelt', 'pulselarsenantennas');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_58() {
$marcas = array('qlight', 'raco');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_59() {
$marcas = array('radiowaves', 'ramsey');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_60() {
$marcas = array('rangersecuritydetectors', 'rbtec');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_61() {
$marcas = array('rcidormakaba', 'rfelements');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_62() {
$marcas = array('prostar', 'optoelectronics');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_63() {
$marcas = array('otto', 'panasonic');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_64() {
$marcas = array('pctel', 'perko');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_65() {
$marcas = array('phillipsassaabloy', 'phox');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_66() {
$marcas = array('pima', 'planet');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_67() {
$marcas = array('plp', 'politec');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_68() {
$marcas = array('polyphaser', 'powerproducts');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_69() {
$marcas = array('precision', 'makita');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_70() {
$marcas = array('mcdisecurityproductsinc', 'meanwell');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_71() {
$marcas = array('meitrack', 'mercusys');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_72() {
$marcas = array('mfj', 'microlab');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_73() {
$marcas = array('microsoftcorporation', 'indiana');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_74() {
$marcas = array('iss', 'jasco');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_75() {
$marcas = array('jirous', 'jupiter');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_76() {
$marcas = array('jvckenwood', 'keenon');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_77() {
$marcas = array('kester', 'keyscandormakaba');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_78() {
$marcas = array('khomp', 'kidde');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_79() {
$marcas = array('kleintools', 'firelite');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_80() {
$marcas = array('fluke', 'flukenetworks');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_81() {
$marcas = array('freedomcommunicationtechnologies', 'garmin');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_82() {
$marcas = array('genesis', 'gewiss');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_83() {
$marcas = array('andrewcommscope', 'atlona');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_84() {
$marcas = array('birdtechnologies', 'cambiumnetworks');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_85() {
$marcas = array('honeywell', 'honeywellbms');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_86() {
$marcas = array('honeywellhomeresideo', 'syscom');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_87() {
$marcas = array('epcomindustrial', 'epcomindustrialsignaling');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_88() {
$marcas = array('epcompowerline', 'epcomtitanium');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_89() {
$marcas = array('alliedtelesis', 'anclo');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_90() {
$marcas = array('came', 'cyberpower');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_91() {
$marcas = array('dksdoorking', 'ecco');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_92() {
$marcas = array('faac', 'fanvil');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_93() {
$marcas = array('federalsignal', 'grandstream');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_94() {
$marcas = array('growatt', 'hanwhatechwinwisenet');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_95() {
$marcas = array('hid', 'hikmicro');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_96() {
$marcas = array('hiksemibyhikvision', 'hilookbyhikvision');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_97() {
$marcas = array('hoffman', 'hoymiles');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_98() {
$marcas = array('huawei', 'hubbell');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_99() {
$marcas = array('hubbellburndy', 'hubbellkillark');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_100() {
$marcas = array('hustler', 'hyperspike');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_101() {
$marcas = array('hysecurity', 'ibernex');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_102() {
$marcas = array('ict', 'idemiamorpho');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_103() {
$marcas = array('identytech', 'idp');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_104() {
$marcas = array('index', 'kocom');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_105() {
$marcas = array('l3harris', 'laird');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_106() {
$marcas = array('lenovo', 'liftpro');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_107() {
$marcas = array('littlegiantladdersystems', 'lock');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_108() {
$marcas = array('louroeelectronics', 'lowrance');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_109() {
$marcas = array('lumitec', 'lutroncasetawireless');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_110() {
$marcas = array('lutronelectronics', 'lutronradiora3');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_111() {
$marcas = array('m2mservices', 'macurcoaerionics');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_112() {
$marcas = array('mikrotik', 'milesight');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_113() {
$marcas = array('milestonesystemsinc', 'mimosanetworks');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_114() {
$marcas = array('minicircuits', 'morningstar');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_115() {
$marcas = array('nedap', 'netonix');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_116() {
$marcas = array('netpoint', 'nexetalk');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_117() {
$marcas = array('notifier', 'nuctech');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_118() {
$marcas = array('nxradio', 'optex');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_119() {
$marcas = array('sti', 'suprema');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_120() {
$marcas = array('surtek', 'synology');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_121() {
$marcas = array('syscomparts', 'syscomvideo');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_122() {
$marcas = array('systemsensor', 'tamron');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_123() {
$marcas = array('tassta', 'samlex');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_124() {
$marcas = array('samsungelectronics', 'sdi');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_125() {
$marcas = array('seetronic', 'sensear');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_126() {
$marcas = array('sfire', 'shakespeare');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_127() {
$marcas = array('shelly', 'signalpro');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_128() {
$marcas = array('siklu', 'silentknightbyhoneywell');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_129() {
$marcas = array('silimex', 'simrad');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_130() {
$marcas = array('sinclair', 'somfy');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_131() {
$marcas = array('technitool', 'syscomtowers');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_132() {
$marcas = array('telewaveinc', 'telex');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_133() {
$marcas = array('telosystems', 'teltonika');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_134() {
$marcas = array('tempo', 'trambrowning');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_135() {
$marcas = array('transtector', 'truaudio');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_136() {
$marcas = array('trylon', 'tulmex');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_137() {
$marcas = array('twr', 'txrxsystemsinc');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_138() {
$marcas = array('ubiquitinetworks', 'uniden');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_139() {
$marcas = array('unitedparts', 'urrea');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_140() {
$marcas = array('txpro', 'vsol');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_141() {
$marcas = array('vertexstandard', 'victorinox');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_142() {
$marcas = array('victronenergy', 'vssl');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_143() {
$marcas = array('ww', 'hakko');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_144() {
$marcas = array('hochiki', 'ademco');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_145() {
$marcas = array('ademcohoneywell', 'advancetecindustriesinc');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_146() {
$marcas = array('aea', 'afore');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_147() {
$marcas = array('airbus', 'airmar');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_148() {
$marcas = array('airx', 'akubela');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_149() {
$marcas = array('akuvox', 'opendeskpro');
actualizar_precios_productos_marcas($marcas);
}
function actualizar_productos_grupo_150() {
$marcas = array('ritchie', 'powersonic');
actualizar_precios_productos_marcas($marcas);
}
// Funciones especiales para marcas con muchos productos (Hikvision, LinkedProByEpcom, Panduit)
function actualizar_productos_hikvision_parte1() {
actualizar_precios_productos_marcas(array('hikvision'), array(22));
}
function actualizar_productos_hikvision_parte2() {
actualizar_precios_productos_marcas(array('hikvision'), array(25, 26, 27));
}
function actualizar_productos_hikvision_parte3() {
actualizar_precios_productos_marcas(array('hikvision'), array(30, 32, 37));
}
function actualizar_productos_hikvision_parte4() {
actualizar_precios_productos_marcas(array('hikvision'), array(38, 65811, 66523, 66630));
}
function actualizar_productos_linkedprobyepcom_parte1() {
actualizar_precios_productos_marcas(array('linkedprobyepcom'), array(22, 25, 26));
}
function actualizar_productos_linkedprobyepcom_parte2() {
actualizar_precios_productos_marcas(array('linkedprobyepcom'), array(27, 30, 32));
}
function actualizar_productos_linkedprobyepcom_parte3() {
actualizar_precios_productos_marcas(array('linkedprobyepcom'), array(37, 38, 65811, 66523, 66630));
}
function actualizar_productos_panduit_parte1() {
actualizar_precios_productos_marcas(array('panduit'), array(22, 25, 26));
}
function actualizar_productos_panduit_parte2() {
actualizar_precios_productos_marcas(array('panduit'), array(27, 30, 32));
}
function actualizar_productos_panduit_parte3() {
actualizar_precios_productos_marcas(array('panduit'), array(37, 38, 65811, 66523, 66630));
}
// Función para resetear contador y mostrar resumen
function actualizar_productos_resumen_final() {
gestionar_contador_actualizaciones('reset');
$marcas = array('powersonic');
actualizar_precios_productos_marcas($marcas);
$total_actualizado = gestionar_contador_actualizaciones();
error_log("=== RESUMEN FINAL DE ACTUALIZACIONES ===");
error_log("Total acumulado de productos actualizados en todos los crons: " . $total_actualizado);
error_log("========================================");
}
// ==============================================
// PROGRAMACIÓN DE EVENTOS CRON (7 minutos entre cada grupo)
// ==============================================
add_action('init', 'programar_tareas_cron_actualizar_productos');
function programar_tareas_cron_actualizar_productos() {
$intervalo_minutos = 8; // Intervalo entre ejecuciones
$hora_inicio = strtotime('today 1:00 AM'); // Comienza a la 1:00 AM
// Programar los 150 grupos principales
for ($i = 1; $i <= 150; $i++) {
$timestamp = $hora_inicio + (($i-1) * $intervalo_minutos * 60);
// Si ya pasó la hora de inicio, programar para el día siguiente
if ($timestamp <= time()) {
$timestamp += 86400; // 24 horas en segundos
}
if (!wp_next_scheduled('actualizar_productos_grupo_' . $i)) {
wp_schedule_event($timestamp, 'daily', 'actualizar_productos_grupo_' . $i);
}
}
// Programar las marcas especiales (Hikvision, LinkedProByEpcom, Panduit)
// Hikvision (4 partes)
$timestamp_hikvision = $hora_inicio + (150 * $intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_hikvision_parte1')) {
wp_schedule_event($timestamp_hikvision, 'daily', 'actualizar_productos_hikvision_parte1');
}
$timestamp_hikvision_p2 = $timestamp_hikvision + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_hikvision_parte2')) {
wp_schedule_event($timestamp_hikvision_p2, 'daily', 'actualizar_productos_hikvision_parte2');
}
$timestamp_hikvision_p3 = $timestamp_hikvision_p2 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_hikvision_parte3')) {
wp_schedule_event($timestamp_hikvision_p3, 'daily', 'actualizar_productos_hikvision_parte3');
}
$timestamp_hikvision_p4 = $timestamp_hikvision_p3 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_hikvision_parte4')) {
wp_schedule_event($timestamp_hikvision_p4, 'daily', 'actualizar_productos_hikvision_parte4');
}
// LinkedProByEpcom (3 partes)
$timestamp_linkedpro = $timestamp_hikvision_p4 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_linkedprobyepcom_parte1')) {
wp_schedule_event($timestamp_linkedpro, 'daily', 'actualizar_productos_linkedprobyepcom_parte1');
}
$timestamp_linkedpro_p2 = $timestamp_linkedpro + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_linkedprobyepcom_parte2')) {
wp_schedule_event($timestamp_linkedpro_p2, 'daily', 'actualizar_productos_linkedprobyepcom_parte2');
}
$timestamp_linkedpro_p3 = $timestamp_linkedpro_p2 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_linkedprobyepcom_parte3')) {
wp_schedule_event($timestamp_linkedpro_p3, 'daily', 'actualizar_productos_linkedprobyepcom_parte3');
}
// Panduit (3 partes)
$timestamp_panduit = $timestamp_linkedpro_p3 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_panduit_parte1')) {
wp_schedule_event($timestamp_panduit, 'daily', 'actualizar_productos_panduit_parte1');
}
$timestamp_panduit_p2 = $timestamp_panduit + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_panduit_parte2')) {
wp_schedule_event($timestamp_panduit_p2, 'daily', 'actualizar_productos_panduit_parte2');
}
$timestamp_panduit_p3 = $timestamp_panduit_p2 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_panduit_parte3')) {
wp_schedule_event($timestamp_panduit_p3, 'daily', 'actualizar_productos_panduit_parte3');
}
// Resumen final
$timestamp_resumen = $timestamp_panduit_p3 + ($intervalo_minutos * 60);
if (!wp_next_scheduled('actualizar_productos_resumen_final')) {
wp_schedule_event($timestamp_resumen, 'daily', 'actualizar_productos_resumen_final');
}
// Registrar todos los hooks para los grupos principales
for ($i = 1; $i <= 150; $i++) {
add_action('actualizar_productos_grupo_' . $i, 'actualizar_productos_grupo_' . $i);
}
// Registrar hooks para marcas especiales
add_action('actualizar_productos_hikvision_parte1', 'actualizar_productos_hikvision_parte1');
add_action('actualizar_productos_hikvision_parte2', 'actualizar_productos_hikvision_parte2');
add_action('actualizar_productos_hikvision_parte3', 'actualizar_productos_hikvision_parte3');
add_action('actualizar_productos_hikvision_parte4', 'actualizar_productos_hikvision_parte4');
add_action('actualizar_productos_linkedprobyepcom_parte1', 'actualizar_productos_linkedprobyepcom_parte1');
add_action('actualizar_productos_linkedprobyepcom_parte2', 'actualizar_productos_linkedprobyepcom_parte2');
add_action('actualizar_productos_linkedprobyepcom_parte3', 'actualizar_productos_linkedprobyepcom_parte3');
add_action('actualizar_productos_panduit_parte1', 'actualizar_productos_panduit_parte1');
add_action('actualizar_productos_panduit_parte2', 'actualizar_productos_panduit_parte2');
add_action('actualizar_productos_panduit_parte3', 'actualizar_productos_panduit_parte3');
add_action('actualizar_productos_resumen_final', 'actualizar_productos_resumen_final');
}
// Función para desactivar todas las tareas cron al desactivar el plugin/tema
function desactivar_tareas_cron_actualizar_productos() {
// Eliminar los 150 grupos principales
for ($i = 1; $i <= 150; $i++) {
wp_clear_scheduled_hook('actualizar_productos_grupo_' . $i);
}
// Eliminar las marcas especiales
wp_clear_scheduled_hook('actualizar_productos_hikvision_parte1');
wp_clear_scheduled_hook('actualizar_productos_hikvision_parte2');
wp_clear_scheduled_hook('actualizar_productos_hikvision_parte3');
wp_clear_scheduled_hook('actualizar_productos_hikvision_parte4');
wp_clear_scheduled_hook('actualizar_productos_linkedprobyepcom_parte1');
wp_clear_scheduled_hook('actualizar_productos_linkedprobyepcom_parte2');
wp_clear_scheduled_hook('actualizar_productos_linkedprobyepcom_parte3');
wp_clear_scheduled_hook('actualizar_productos_panduit_parte1');
wp_clear_scheduled_hook('actualizar_productos_panduit_parte2');
wp_clear_scheduled_hook('actualizar_productos_panduit_parte3');
wp_clear_scheduled_hook('actualizar_productos_resumen_final');
}
register_deactivation_hook(__FILE__, 'desactivar_tareas_cron_actualizar_productos');
function identificar_tipo_producto($sku, $producto = null) {
// 1. Primero verificar si es producto SYSCOM (solo números en SKU)
if (preg_match('/^\d+$/', $sku)) {
return 'syscom';
}
// 2. Intentar verificar con API CVA
$test_data = [
'paqueteria' => 4,
'cp' => '44790', // CP de prueba
'cp_sucursal' => '45640',
'productos' => [['clave' => $sku, 'cantidad' => 1]]
];
$response = wp_remote_post('https://www.grupocva.com/api/paqueteria_service/', [
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode($test_data),
'timeout' => 5 // Tiempo corto para no afectar rendimiento
]);
// 3. Si hay CUALQUIER error, asignar envío fijo
if (is_wp_error($response)) {
return 'envio_fijo';
}
// 4. Si la API respondió pero con error
$body = json_decode(wp_remote_retrieve_body($response), true);
if (!isset($body['result']) || $body['result'] !== 'success') {
return 'envio_fijo';
}
// 5. Si todo está bien, es producto CVA normal
return 'cva';
}
function analizar_carrito() {
$resultado = [
'peso_syscom' => 0,
'productos_cva' => [],
'productos_envio_fijo' => 0,
'tiene_cva' => false,
'tiene_syscom' => false,
'tiene_envio_fijo' => false,
'errores_api' => [] // Para registrar errores si necesitamos depurar
];
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$sku = $product->get_sku();
$peso = (float)$product->get_weight();
$cantidad = $cart_item['quantity'];
$tipo_producto = identificar_tipo_producto($sku, $product);
switch ($tipo_producto) {
case 'envio_fijo':
$resultado['productos_envio_fijo'] += $cantidad;
$resultado['tiene_envio_fijo'] = true;
break;
case 'syscom':
$resultado['peso_syscom'] += ($peso > 0 ? $peso * $cantidad : 0);
$resultado['tiene_syscom'] = true;
break;
case 'cva':
$resultado['productos_cva'][] = [
'sku' => $sku,
'cantidad' => $cantidad,
'peso' => $peso
];
$resultado['tiene_cva'] = true;
break;
}
}
return $resultado;
}
function manejar_envios_obligatorios($rates, $package) {
if (is_admin() && !defined('DOING_AJAX')) return $rates;
$analisis = analizar_carrito();
$rates = []; // Limpiamos todas las tarifas existentes
$costo_total = 0;
$descripciones = [];
$destino = WC()->customer->get_shipping_postcode() ?: WC()->customer->get_billing_postcode();
// 1. Calcular envíos fijos (140 c/u)
if ($analisis['tiene_envio_fijo']) {
$costo_fijo = $analisis['productos_envio_fijo'] * 140;
$costo_total += $costo_fijo;
$descripciones[] = sprintf('%d producto(s) especial(es) - $%d',
$analisis['productos_envio_fijo'],
$costo_fijo);
}
// 2. Calcular envío SYSCOM (1200 si >35kg)
if ($analisis['tiene_syscom']) {
$envio_syscom = ($analisis['peso_syscom'] > 35) ? 1200 : 0;
$costo_total += $envio_syscom;
if ($envio_syscom > 0) {
$descripciones[] = sprintf('SYSCOM (%.2f kg) - $%d',
$analisis['peso_syscom'],
$envio_syscom);
} else {
$descripciones[] = 'SYSCOM (Envío gratis)';
}
}
// 3. Calcular envío CVA (cotización API)
if ($analisis['tiene_cva'] && $destino) {
$cotizacion = obtener_cotizacion_envio_cva($destino, $analisis['productos_cva']);
if ($cotizacion && isset($cotizacion['montoTotal'])) {
$costo_total += $cotizacion['montoTotal'];
$descripciones[] = sprintf('CVA Express - $%.2f', $cotizacion['montoTotal']);
} else {
// Si falla la cotización, agregar estos productos a envío fijo
$productos_fallidos = count($analisis['productos_cva']);
$costo_fijo_adicional = $productos_fallidos * 140;
$costo_total += $costo_fijo_adicional;
$descripciones[] = sprintf('%d producto(s) sin cotización - $%d',
$productos_fallidos,
$costo_fijo_adicional);
}
}
// Solo crear UN método de envío con el total y desglose
if (!empty($descripciones)) {
$rates['envio_combinado'] = new WC_Shipping_Rate(
'envio_combinado',
'Total', // Título principal
$costo_total,
[],
'envio_combinado'
);
// Añadir el desglose como meta datos para mostrarlo en el checkout
$rates['envio_combinado']->add_meta_data('desglose', implode(' | ', $descripciones));
} else {
// Si no hay métodos, mostrar opción de contacto
$rates['contacto'] = new WC_Shipping_Rate(
'contacto',
'Contactar para opciones de envío',
0,
[],
'contacto'
);
}
return $rates;
}
add_filter('woocommerce_package_rates', 'manejar_envios_obligatorios', 20, 2);
/*
///////////////////////////////////////////////////////
codigo agega titulos a los slugs de manera organica
///////////////////////
function normalizar_slugs_categorias_woocommerce() {
// Verificar si WooCommerce está activo
if (!class_exists('WooCommerce')) {
return;
}
// Obtener todas las categorías de productos
$taxonomy = 'product_cat';
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
));
// Procesar cada categoría
foreach ($terms as $term) {
$nombre_original = $term->name;
// Limpiar el nombre para crear un slug amigable
$slug_nuevo = sanitize_title($nombre_original);
// Eliminar prefijos comunes como "--" o números al inicio
$slug_nuevo = preg_replace('/^[-0-9]+/', '', $slug_nuevo);
// Reemplazar caracteres especiales y múltiples guiones
$slug_nuevo = preg_replace('/[^a-z0-9\-]/', '-', $slug_nuevo);
$slug_nuevo = preg_replace('/-+/', '-', $slug_nuevo);
$slug_nuevo = trim($slug_nuevo, '-');
// Si el slug nuevo es diferente al actual, actualizarlo
if ($slug_nuevo !== $term->slug && !empty($slug_nuevo)) {
wp_update_term($term->term_id, $taxonomy, array(
'slug' => $slug_nuevo
));
// Registrar el cambio (opcional)
error_log("Slug actualizado: {$term->slug} -> {$slug_nuevo} (Categoría: {$nombre_original})");
}
}
}
// Ejecutar la función al activar el script (puedes llamarla de otra forma si prefieres)
add_action('init', 'normalizar_slugs_categorias_woocommerce');
*/
/**
* Función para generar enlaces automáticos en descripciones de categoría
*/
function generar_enlaces_gabinetes($category_description) {
// Solo aplicar en la categoría de Gabinetes
if (!is_product_category('gabinetes')) {
return $category_description;
}
// Obtener todos los productos de la categoría
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'gabinetes',
),
),
);
$products = new WP_Query($args);
// Mapeo de palabras clave a productos
$keyword_map = array();
while ($products->have_posts()) {
$products->the_post();
$product = wc_get_product(get_the_ID());
$product_url = get_permalink();
$product_title = get_the_title();
// Extraer atributos para enlazar
$attributes = $product->get_attributes();
// Mapear por tipo de torre
if (isset($attributes['pa_tipo-de-torre'])) {
$tipos_torre = wc_get_product_terms($product->get_id(), 'pa_tipo-de-torre', array('fields' => 'names'));
foreach ($tipos_torre as $tipo) {
$keyword_map[sanitize_title($tipo)] = array(
'url' => $product_url,
'text' => $product_title,
'keyword' => $tipo
);
}
}
// Mapear por marca
if (isset($attributes['pa_marca'])) {
$marcas = wc_get_product_terms($product->get_id(), 'pa_marca', array('fields' => 'names'));
foreach ($marcas as $marca) {
$keyword_map[sanitize_title($marca)] = array(
'url' => $product_url,
'text' => $product_title,
'keyword' => $marca
);
}
}
// Mapear características especiales
if (strpos($product->get_description(), 'RGB') !== false) {
$keyword_map['rgb'] = array(
'url' => $product_url,
'text' => $product_title,
'keyword' => 'RGB'
);
}
if (strpos($product->get_description(), 'Cristal Templado') !== false) {
$keyword_map['cristal-templado'] = array(
'url' => $product_url,
'text' => $product_title,
'keyword' => 'Cristal Templado'
);
}
// Mapear modelos específicos
$modelo = $product->get_sku(); // Usamos SKU como identificador
$keyword_map[sanitize_title($modelo)] = array(
'url' => $product_url,
'text' => $product_title,
'keyword' => $modelo
);
}
wp_reset_postdata();
// Reemplazar palabras clave con enlaces
foreach ($keyword_map as $key => $link_data) {
$category_description = str_replace(
$link_data['keyword'],
'' . $link_data['keyword'] . ' ',
$category_description
);
}
return $category_description;
}
add_filter('category_description', 'generar_enlaces_gabinetes');
/**
* Shortcode para productos relacionados por atributos
*/
add_shortcode('productos_relacionados_gabinetes', function($atts) {
global $product;
if (!is_product()) return '';
$atts = shortcode_atts(array(
'attribute' => 'pa_tipo-de-torre',
'limit' => 4
), $atts);
$output = '';
$current_id = $product->get_id();
$attributes = $product->get_attributes();
if (isset($attributes[$atts['attribute']])) {
$terms = wc_get_product_terms($product->get_id(), $atts['attribute'], array('fields' => 'slugs'));
if (!empty($terms)) {
$args = array(
'post_type' => 'product',
'posts_per_page' => $atts['limit'],
'post__not_in' => array($current_id),
'tax_query' => array(
array(
'taxonomy' => $atts['attribute'],
'field' => 'slug',
'terms' => $terms,
),
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'gabinetes',
)
),
);
$loop = new WP_Query($args);
if ($loop->have_posts()) {
$output .= '
';
}
wp_reset_postdata();
}
}
return $output;
});
/**
* CSS para mejorar la presentación
*/
function gabinetes_css() {
if (is_product_category('gabinetes') || (is_product() && has_term('gabinetes', 'product_cat'))) {
echo '';
}
}
add_action('wp_head', 'gabinetes_css');
/**
* Mejora Internal Link Juicer Free para WooCommerce
*/
add_filter('internal_link_juicer_linkable_attributes', function() {
return array(
'pa_tipo-de-torre', // Atributo de tipo de torre
'pa_marca', // Atributo de marca
'pa_fuente', // Atributo de fuente de poder
'pa_panel' // Atributo de tipo de panel
);
});
// Prioriza enlaces a productos con stock
add_filter('internal_link_juicer_link_priority', function($priority, $post) {
$product = wc_get_product($post->ID);
if ($product && $product->is_in_stock()) {
return 100; // Máxima prioridad
}
return 50; // Prioridad normal
}, 10, 2);
Cable adaptador usb para terminal facial de 50 mm DSK1T331W,DSK1T341AMF / DS-K1T341CMFW Modelo:101510438 - PcVirtual
Saltar al contenido
“Frente de calle IP 2 Megapixel para Videoportero Modular / PoE / Angulo 146° / Ultra Baja Iluminación / Exterior IP65 / WDR 120 dB” se ha añadido a tu carrito.
Ver carrito
Oferta
Cable adaptador usb para terminal facial de 50 mm DSK1T331W,DSK1T341AMF / DS-K1T341CMFW Modelo:101510438 $ 72.26 El precio original era: $72.26. $ 46.05El precio actual es: $46.05. IVA Incluido
Calidad superior Pago seguro Envíos a todo Mexico Pago seguro garantizado
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Más información
Rechazar
Aceptar
Privacidad
Valoraciones
No hay valoraciones aún.