WooCommerce REST API无法获取全部产品问题求助
解决方案
一、获取全部草稿产品
- 验证密钥权限:确认你的WooCommerce消费者密钥已授予
read_private_products和read_products权限,无此权限无法读取未发布的草稿、待审核或私有产品。 - 优化API参数:
- 显式指定状态参数:将
status=any替换为status=publish,draft,pending,private,覆盖所有未发布+已发布状态,避免默认逻辑遗漏部分状态。 - 提高每页获取数量:将
per_page设为最大值100(WooCommerce API允许的上限),减少分页请求次数,提升效率。
- 显式指定状态参数:将
二、获取WPML翻译产品
WPML(WooCommerce Multilingual)需通过专属参数获取多语言产品:
- 按语言单独请求:在API URL中添加
lang参数,传入对应语言代码(如en、fr、de,根据你的网店实际语言配置调整)。 - 批量遍历所有语言:循环遍历你的4种语言代码,分别请求各语言的产品列表后合并结果。
- 关联翻译产品:若需获取产品及其所有翻译版本,可添加
include_translations=true参数(需确保WooCommerce Multilingual插件为最新版本)。
修改后的PowerShell代码
Clear-Host $ConsumerKey = "ck_blablahalblah" $CustomerKey = "cs_somethingelse" $BaseURL = "https://www.mywebshopurl.nl" $ProductsEndpoint = "/wp-json/wc/v3/products" $Headers = @{Authorization = "Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $ConsumerKey, $CustomerKey))) } # 替换为你的4种实际语言代码 $langs = @("nl", "en", "fr", "de") [Int]$PerPage = 100 $ArrayWithProducts = @() foreach ($lang in $langs) { [Int]$Page = 1 Write-Host "=== 获取语言 [$lang] 的产品 ===" Do { Write-Host "读取第 $Page 页" $requestUri = "$BaseURL$ProductsEndpoint?page=$Page&per_page=$PerPage&status=publish,draft,pending,private&orderby=id&order=asc&catalog_visibility=any&lang=$lang" $AllProducts = Invoke-RestMethod -Method Get -Uri $requestUri -Headers $Headers Write-Host " --> 第 $Page 页共 $($AllProducts.Count) 个产品" If (-not $AllProducts) {Break} $ArrayWithProducts += $AllProducts $Page++ } While ($True) } Write-Host "`nAPI共获取到 $($ArrayWithProducts.Count) 个产品(包含所有语言和状态)。"
额外注意事项
- 确保WooCommerce Multilingual插件为最新版本,旧版本可能不支持
lang参数或翻译产品的API访问。 - 若需去重同一产品的多语言版本,可通过产品的
original_id字段(WPML自动添加)或meta_data中的WPML标识区分原产品与翻译产品。 - 可添加
try/catch块处理API请求异常,避免脚本意外中断。
内容的提问来源于stack exchange,提问作者TheStingPilot
相关产品推荐
相关产品推荐

