get('products', [ 'status' => 'publish', 'per_page' => 100, '_fields' => $productFields ]); $log("Fetched products from WooCommerce", ['count' => count($products)]); // Build service maps $cuw_map = UpsellService::buildProductMap(); $log("Built CUW map"); // Get BOGO rules from Woo Discount Rules $log("Creating DiscountRulesService..."); $discountService = new DiscountRulesService(); $log("DiscountRulesService created"); $productIds = array_map(fn($p) => (int) $p->id, $products); $log("Product IDs extracted", ['count' => count($productIds)]); $log("Calling buildProductBogoMap..."); $bogo_map = $discountService->buildProductBogoMap($productIds); $log("BOGO map built", ['products_with_bogo' => count($bogo_map)]); $enriched = []; foreach ($products as $product) { $productId = (int) $product->id; $log("Product Info from WooCommerce", $product); // Get variations for variable products (only needed fields) $variation_details = []; if ($product->type === 'variable') { $variation_details = (array) $woocommerce->get( "products/{$product->id}/variations", [ 'per_page' => 50, '_fields' => $variationFields ] ); } // Combine upsell + cross-sell + CUW IDs $upsell_ids = !empty($product->upsell_ids) ? array_map('intval', (array) $product->upsell_ids) : []; $cross_sell_ids = !empty($product->cross_sell_ids) ? array_map('intval', (array) $product->cross_sell_ids) : []; $cuw_ids = $cuw_map[$productId] ?? []; $recommended_ids = array_values(array_unique(array_filter(array_merge( $upsell_ids, $cross_sell_ids, $cuw_ids )))); // Get BOGO rules for this product $bogo_rules = $bogo_map[$productId] ?? []; // Build minimal product object with only needed fields $enriched[] = [ 'id' => $productId, 'name' => $product->name, 'price' => $product->price, 'type' => $product->type, 'upsell_ids' => $upsell_ids, 'cross_sell_ids' => $cross_sell_ids, 'variation_details' => $variation_details, 'cuw_ids' => $cuw_ids, 'recommended_ids' => $recommended_ids, 'bogo_rules' => $bogo_rules, 'upsell_text' => $product->callcenter_upsell_info ]; } $log("Returning " . count($enriched) . " enriched products"); echo json_encode($enriched); } catch (Exception $e) { $log("ERROR in handleGetProducts", [ 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]); echo json_encode(['error' => $e->getMessage()]); } catch (Error $e) { $log("FATAL ERROR in handleGetProducts", [ 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]); echo json_encode(['error' => $e->getMessage()]); } }