You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:48:01