如何使用Symfony与Guzzle通过API更新WooCommerce产品价格
解决方法
你遇到的问题是参数传递格式、请求方法和WooCommerce API字段规则不匹配导致的,按以下步骤修正即可:
核心错误点
- Guzzle的
post/put方法仅支持2个入参:请求地址、配置数组,你把价格参数单独放在第三个参数的写法是无效的,Guzzle不会读取该位置的参数 - WooCommerce REST API 接收JSON格式的请求载荷,不支持
form_params对应的表单编码格式,需要用json配置项传递参数 - 更新已存在的WooCommerce产品,官方要求使用
PUT请求,部分版本POST请求不会触发更新逻辑 - WooCommerce的产品价格字段为
regular_price,仅传price字段在多数版本中不会生效
修正后完整代码
$endpoint = 'products/12'; $handler = new \GuzzleHttp\Handler\CurlHandler(); $stack = \GuzzleHttp\HandlerStack::create($handler); $middleware = new \GuzzleHttp\Subscriber\Oauth\Oauth1([ 'consumer_key' => $this->consumer_key, 'consumer_secret' => $this->consumer_secret, 'token_secret' => '', 'token' => '', 'request_method' => Oauth1::REQUEST_METHOD_QUERY, 'signature_method' => Oauth1::SIGNATURE_METHOD_HMAC ]); $stack->push($middleware); $client = new \GuzzleHttp\Client([ 'base_uri' => $this->url . $this->api, 'handler' => $stack, // 可选配置:默认返回JSON格式响应 'headers' => [ 'Accept' => 'application/json' ] ]); // 用PUT请求,所有参数都放在第二个配置数组中 $response = $client->put($endpoint, [ 'auth' => 'oauth', 'json' => [ 'regular_price' => '21' // 必须用regular_price字段,促销价可额外加sale_price字段 ] ]); // 打印响应内容排查问题 var_dump(json_decode($response->getBody(), true)); /* 原有正常的GET逻辑保留即可 $response = $client->get( $endpoint, [ 'auth' => 'oauth' ] ); return array( 'status' => $response->getStatusCode(), 'header' => $response->getHeaderLine('content-type'), 'body' => json_decode($response->getBody()) ); */
额外验证项
如果修改后仍然不生效,可以先排查两个点:
- 确认你的API密钥拥有产品的读写权限,不是只读权限
- 检查WooCommerce后台是否开启了REST API权限,对应用户角色有编辑产品的权限
内容的提问来源于stack exchange,提问作者Bradmage
相关产品推荐
相关产品推荐

