// 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); Herramientas archivos - Página 3 de 7 - PcVirtual

Herramientas

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