调用WooCommerce REST API时GET参数被忽略,无法获取全部分类
解决WooCommerce API忽略per_page参数的问题
看起来你遇到了WooCommerce API分页参数被忽略的问题,结合你的环境(同服务器NGINX+跨子域名部署),我整理了几个最容易踩的坑和对应的解决方向:
1. 检查NGINX配置是否漏传查询参数
这是跨子域名调用API时最常见的问题——如果你的CRM是通过NGINX转发请求到WooCommerce站点,很可能没把URL里的查询参数完整传递过去。
- 打开
crm.example.com的NGINX配置文件,找到反向代理的location块,确保proxy_pass后面加上$request_uri,这样会完整传递URL和所有查询参数:
server { server_name crm.example.com; location / { # 替换成你WooCommerce站点的实际本地地址(比如端口或unix socket) proxy_pass http://localhost:8080$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
- 同时检查
example.com的NGINX配置,处理WP REST API的location块要保留查询参数:
location /wp-json/ { try_files $uri $uri/ /index.php?$args; }
这里的?$args会把所有GET参数传递给WordPress,确保WooCommerce能接收到per_page。
2. 确认API请求真的带上了per_page参数
有时候代码看起来加了参数,但实际请求URL里并没有。你可以在发送请求前打印完整的请求URL来验证:
$request = $client->get('products/categories', ['per_page' => 100]); // 打印出来看看参数是否存在 var_dump($request->getUrl());
正常应该输出类似https://example.com/wp-json/wc/v3/products/categories?per_page=100。如果看不到per_page,说明你用HttpClient的方式不对,再核对一下WooCommerce PHP客户端的文档,确认查询参数是通过第二个数组参数传递的。
3. 检查WooCommerce的API分页限制
WooCommerce REST API默认允许的最大per_page是100,你的43个分类完全在范围内,但也有可能被自定义代码修改了限制:
- 去主题的
functions.php或者自定义插件里搜搜有没有woocommerce_rest_collection_params这个钩子,如果有代码修改了per_page的上限,确保数值大于等于43。 - 要是找不到修改的地方,直接恢复默认设置就行。
4. 排查NGINX缓存的影响
如果你的NGINX开启了缓存,有可能缓存了不带per_page参数的请求结果,导致新请求一直返回旧的10条数据:
- 可以先临时关掉缓存测试一下,如果恢复正常,那就是缓存的问题。
- 或者修改缓存键,把查询字符串包含进去,这样不同参数的请求会生成不同的缓存:
proxy_cache_key "$scheme$request_method$host$request_uri";
5. 直接请求API做排除测试
绕过CRM,直接用浏览器或者Postman请求https://example.com/wp-json/wc/v3/products/categories?per_page=100:
- 如果能返回全部43个分类,说明问题出在CRM的请求构造或者NGINX的转发配置上;
- 如果还是只返回10个,那问题就出在WooCommerce本身的配置或者自定义代码上。
内容的提问来源于stack exchange,提问作者david pugatcsh
相关产品推荐
相关产品推荐

