function pim_assign_product_collection($product_id_es, $collection_ref, &$collection_cache, &$errors) { global $sitepress; if (!function_exists('icl_object_id') || !$sitepress || !class_exists('WooCommerce')) { $errors[] = "WPML, WooCommerce o alguna de sus funciones no están activos o disponibles."; return false; } $lang_es = 'es'; $lang_en = 'en'; $taxonomy_col = 'product_collection'; $sl_ref_meta_key_col = 'pim_code'; if (!$product_id_es) { $errors[] = "[ERROR] ID de producto ES no proporcionado."; return false; } $product_es = wc_get_product($product_id_es); if (!$product_es) { $errors[] = "[ERROR] No se encontró producto ES con ID: {$product_id_es}."; return false; } if (empty($collection_ref)) { $errors[] = "[WARN] Referencia de colección vacía. Se eliminarán las colecciones asignadas."; wp_set_post_terms($product_id_es, [], $taxonomy_col, false); $product_id_en = icl_object_id($product_id_es, 'product', false, $lang_en); if ($product_id_en) { wp_set_post_terms($product_id_en, [], $taxonomy_col, false); } return true; } $term_ids_col = ['es' => null, 'en' => null]; if (isset($collection_cache[$collection_ref])) { $term_ids_col = $collection_cache[$collection_ref]; } else { $term_id_found_col = pim_get_term_id_by_meta($taxonomy_col, $sl_ref_meta_key_col, $collection_ref); if ($term_id_found_col) { $term_id_found_col = (int) $term_id_found_col; $term_language_details = $sitepress->get_element_language_details($term_id_found_col, 'tax_' . $taxonomy_col); if ($term_language_details && $term_language_details->language_code == $lang_es) { $term_ids_col['es'] = $term_id_found_col; $term_id_en_col = icl_object_id($term_id_found_col, $taxonomy_col, false, $lang_en); $term_ids_col['en'] = $term_id_en_col ? (int)$term_id_en_col : null; $errors[] = "[DEBUG] Colección: Encontrado término ES {$term_ids_col['es']} por meta. EN es " . ($term_ids_col['en'] ?? 'NULL'); } elseif ($term_language_details && $term_language_details->language_code == $lang_en) { $errors[] = "[WARN] Colección: Encontrado término EN {$term_id_found_col} por meta para {$collection_ref}. Buscando traducción ES."; $term_ids_col['en'] = $term_id_found_col; $term_id_es_col_translated = icl_object_id($term_id_found_col, $taxonomy_col, false, $lang_es); $term_ids_col['es'] = $term_id_es_col_translated ? (int)$term_id_es_col_translated : null; $errors[] = "[DEBUG] Colección: Encontrada traducción ES: " . ($term_ids_col['es'] ?? 'NULL'); if (!$term_ids_col['es']) { $errors[] = "[ERROR] Colección: No se encuentra la traducción ES para el término EN {$term_ids_col['en']}."; } } else { $lang_found = $term_language_details ? $term_language_details->language_code : 'desconocido'; $errors[] = "[ERROR] Colección: Término {$term_id_found_col} encontrado por meta para {$collection_ref}, pero su idioma es '{$lang_found}'. No se pueden determinar IDs ES/EN correctos."; $term_ids_col['es'] = null; $term_ids_col['en'] = null; } if (!$term_ids_col['en'] && $term_ids_col['es']) { $errors[] = "[INFO] Colección '{$collection_ref}': No se encontró traducción EN para el término ES ID {$term_ids_col['es']}."; } } else { $errors[] = "[WARN] Colección: No se encontró término para PIM Code '{$collection_ref}' en la taxonomía '{$taxonomy_col}'."; $term_ids_col = ['es' => null, 'en' => null]; } $collection_cache[$collection_ref] = $term_ids_col; } if ($term_ids_col['es']) { wp_set_post_terms($product_id_es, [(int)$term_ids_col['es']], $taxonomy_col, false); $errors[] = "[SUCCESS] Colección ES asignada al producto ID {$product_id_es}: Término ID {$term_ids_col['es']}"; } else { wp_set_post_terms($product_id_es, [], $taxonomy_col, false); $errors[] = "[WARN] No se asignó colección ES para PIM Code '{$collection_ref}' (Producto ID: {$product_id_es})."; } $product_id_en = icl_object_id($product_id_es, 'product', false, $lang_en); if ($product_id_en) { if ($term_ids_col['en']) { wp_set_post_terms($product_id_en, [(int)$term_ids_col['en']], $taxonomy_col, false); $errors[] = "[SUCCESS] Colección EN asignada al producto ID {$product_id_en}: Término ID {$term_ids_col['en']}"; } else { wp_set_post_terms($product_id_en, [], $taxonomy_col, false); if (!empty($collection_ref) && $term_ids_col['es']) { $errors[] = "[WARN] No se asignó colección EN para PIM Code '{$collection_ref}' (Producto ID: {$product_id_en}). No se encontró traducción."; } } } return true; } function pim_sync_product_collections() { global $sitepress; if (!function_exists('icl_object_id') || !$sitepress) { return ['success' => false, 'message' => 'WPML no está activo o configurado.']; } if (!class_exists('WooCommerce')) { return ['success' => false, 'message' => 'WooCommerce no está activo.']; } $products_sl = pim_connect_to_saleslayer_api_products(); if (empty($products_sl)) { return ['success' => false, 'message' => 'No se pudieron cargar los datos de productos desde el JSON.']; } $processed_count = 0; $updated_count = 0; $skipped_count = 0; $error_count = 0; $errors = []; $collection_cache = []; foreach ($products_sl as $prod_sl_item) { $processed_count++; $prod_sl_data = $prod_sl_item['data'] ?? null; $sl_id = $prod_sl_item['ID'] ?? null; if (!$prod_sl_data) { $errors[] = "[ERROR] Datos de producto vacíos para item SL ID: {$sl_id}."; $error_count++; continue; } $smart_code = $prod_sl_data['smart_code'] ?? null; if (empty($smart_code)) { $errors[] = "[ERROR] Producto SL ID {$sl_id} omitido: Falta 'smart_code'."; $error_count++; continue; } $collection_ref_raw = $prod_sl_data['collection'] ?? null; $collection_ref = null; if (is_array($collection_ref_raw) && !empty($collection_ref_raw)) { $collection_ref = reset($collection_ref_raw); } elseif (is_string($collection_ref_raw) && !empty($collection_ref_raw)) { $collection_ref = $collection_ref_raw; } $product_id_es = get_product_id_by_sku_and_lang($smart_code, 'es'); if (!$product_id_es) { $errors[] = "[WARN] Producto '{$smart_code}' no encontrado en ES. No se asignará colección."; $skipped_count++; continue; } $result = pim_assign_product_collection($product_id_es, $collection_ref, $collection_cache, $errors); if ($result === true) { $updated_count++; } else { $error_count++; } if ($processed_count % 50 == 0) { wp_cache_flush(); } } $message = sprintf( 'Sincronización de colecciones completada. Procesados: %d, Actualizados: %d, Sin cambios: %d, Errores: %d.', $processed_count, $updated_count, $skipped_count, $error_count ); return [ 'success' => ($error_count == 0), 'message' => $message, 'errors' => array_unique($errors), 'stats' => [ 'processed' => $processed_count, 'updated' => $updated_count, 'skipped' => $skipped_count, 'errors' => $error_count ] ]; } function pim_ajax_refresh_products_collections() { if (!current_user_can('manage_options')) { wp_send_json_error(['message' => 'No tienes permisos para realizar esta acción.']); return; } pim_connect_to_saleslayer_api(); $result = pim_sync_product_collections(); $response = [ 'message' => $result['message'], 'details' => $result['errors'] ?? [], 'stats' => $result['stats'] ?? null ]; if ($result['success']) { wp_send_json_success($response); } else { wp_send_json_error($response); } } add_action('wp_ajax_pim_refresh_products_collections', 'pim_ajax_refresh_products_collections');