// 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); Jabra PanaCast 50, cámara 4K con vídeo panorámico auto ajustable, conteo de personas, movimiento por detección de voz, ideal para salas de reunión pequeñas (8200-232) - PcVirtual

Jabra PanaCast 50, cámara 4K con vídeo panorámico auto ajustable, conteo de personas, movimiento por detección de voz, ideal para salas de reunión pequeñas (8200-232)

El precio original era: $62,962.56.El precio actual es: $30,797.41. IVA Incluido

SKU: 198747 Categorías: , Etiqueta:

42 disponibles

  • Calidad superior
  • Pago seguro
  • Envíos a todo Mexico
Pago seguro garantizado
Peso 0.2 kg
Marca

JABRA

Producto ID

198747

Modelo

PANACAST50-BK

Valoraciones

No hay valoraciones aún.

Sé el primero en valorar “Jabra PanaCast 50, cámara 4K con vídeo panorámico auto ajustable, conteo de personas, movimiento por detección de voz, ideal para salas de reunión pequeñas (8200-232)”

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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
Privacidad