使用Python调用WooCommerce API无法移除产品的未分类分类
问题分析与修复方案
你的代码存在几个关键问题导致功能失效,逐一拆解并修复:
核心问题点
- 分类数量判断逻辑错误:
catCount初始值设为1,遍历分类时又累加,导致计数比实际分类数多1。而且你的需求是只处理拥有2个及以上分类的产品,但代码里判断catCount >=1等于所有产品都处理,不符合需求。
- 移除分类的方式错误:
- 直接用
multiCat.remove({"id": uncategorized})无效,因为列表中的字典和你新建的{"id":15}是两个不同的对象,Python无法匹配删除。需要遍历列表找到对应ID的元素再移除。
- 直接用
- 未处理分页数据:
- 你计算了总页数
amountOfPages,但实际只请求了第一页的产品,剩下的产品根本没处理。
- 你计算了总页数
- 变量重置不严谨:
catCount在循环外初始化,容易出现计数混乱,应该放到每个产品的循环内初始化。
修复后的完整代码
import math from woocommerce import API # 配置参数 UNCATEGORIZED_ID = 15 PER_PAGE = 100 wcapi = API( url="你的店铺URL", consumer_key="你的consumer key", consumer_secret="你的consumer secret", version="wc/v3", timeout=50, # verify_ssl=False, 如果是本地测试可以打开 ) # 获取产品总数并计算总页数 total_resp = wcapi.get("reports/products/totals").json() total_products = int(total_resp[2]["total"]) print(f"产品总数: {total_products}") total_pages = math.ceil(total_products / PER_PAGE) print(f"总页数: {total_pages}") # 遍历所有分页的产品 for page in range(1, total_pages + 1): print(f"正在处理第 {page}/{total_pages} 页...") products = wcapi.get(f"products?per_page={PER_PAGE}&page={page}").json() for product in products: product_id = product["id"] categories = product["categories"] cat_count = len(categories) # 只处理拥有2个及以上分类的产品 if cat_count >= 2: # 筛选掉未分类的ID,保留其他分类 updated_categories = [cat for cat in categories if cat["id"] != UNCATEGORIZED_ID] # 如果确实移除了未分类,才发起更新请求 if len(updated_categories) != cat_count: update_data = {"categories": updated_categories} resp = wcapi.put(f"products/{product_id}", update_data).json() # 打印更新结果(方便排查错误) if "id" in resp: print(f"产品ID {product_id} 更新成功,已移除未分类") else: print(f"产品ID {product_id} 更新失败: {resp.get('message', '未知错误')}") else: print(f"产品ID {product_id} 未包含未分类,跳过") else: print(f"产品ID {product_id} 分类数不足2个,跳过") print(f"SKU: {product['sku']} | 价格: {product['price']}\n")
代码说明
- 用列表推导式
[cat for cat in categories if cat["id"] != UNCATEGORIZED_ID]直接筛选掉未分类,比遍历删除更简洁可靠。 - 增加了分页遍历逻辑,确保所有产品都能被处理。
- 只在确实移除了未分类的情况下才发起API请求,减少不必要的请求。
- 增加了错误信息打印,方便排查更新失败的原因。
内容的提问来源于stack exchange,提问作者Fatbas Boyee
相关产品推荐
相关产品推荐

