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

如何通过REST API获取WooCommerce产品数据?PHP代码异常求助

如何通过REST API获取WooCommerce产品数据及PHP数据库查询问题修复

一、使用WooCommerce REST API获取产品数据

直接查询数据库不是WooCommerce推荐的方式,官方提供的REST API更稳定,还能兼容版本更新,步骤如下:

1. 启用API并获取认证密钥

  • 登录WordPress后台,进入「WooCommerce → 设置 → 高级 → REST API」
  • 点击「添加密钥」,填写描述、选择关联用户、设置权限(读/读写),然后生成密钥
  • 保存好生成的consumer_key和consumer_secret,这是后续请求的认证凭据

2. PHP调用API示例

方法1:WordPress环境内使用(推荐)

利用WordPress内置的wp_remote_get函数,无需额外依赖:

// 替换为你的实际信息
$consumer_key = '你的consumer_key';
$consumer_secret = '你的consumer_secret';
$site_url = 'https://你的站点域名';

// 构建API请求URL,这里获取所有已发布产品
$api_url = $site_url . '/wp-json/wc/v3/products?status=publish';

// 设置认证请求头
$headers = array(
    'Authorization' => 'Basic ' . base64_encode( $consumer_key . ':' . $consumer_secret )
);

// 发送请求
$response = wp_remote_get( $api_url, array( 'headers' => $headers ) );

// 处理响应
if ( is_wp_error( $response ) ) {
    echo '请求错误:' . $response->get_error_message();
} else {
    $products = json_decode( wp_remote_retrieve_body( $response ), true );
    // 格式化输出JSON,保留中文编码
    echo json_encode( $products, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );
}

方法2:独立PHP脚本使用cURL

如果是在WordPress环境外运行脚本,可以用cURL:

// 替换为你的实际信息
$consumer_key = '你的consumer_key';
$consumer_secret = '你的consumer_secret';
$site_url = 'https://你的站点域名';

$api_url = $site_url . '/wp-json/wc/v3/products?status=publish';

$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $api_url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Basic ' . base64_encode( $consumer_key . ':' . $consumer_secret )
) );

$response = curl_exec( $ch );
curl_close( $ch );

if ( $response === false ) {
    echo 'cURL请求失败';
} else {
    $products = json_decode( $response, true );
    echo json_encode( $products, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );
}

3. 常用API过滤参数

  • status=publish:仅获取已发布产品
  • per_page=100:设置每页返回数量(最大100)
  • category=分类ID:按产品分类过滤
  • sku=产品SKU:精准查询单个产品

二、修复你的PHP数据库查询代码

直接查询WooCommerce数据库表容易受版本更新或表前缀修改影响,但我还是帮你排查并修复了问题:

1. 原代码的核心问题

  • 硬编码表前缀:你写死了wp_前缀,但很多站点会自定义前缀,导致表不存在
  • GROUP BY语法错误:MySQL严格模式下,SELECT中的非聚合列必须出现在GROUP BY里,你的pi.meta_value不符合要求
  • 缺少错误捕获:执行SQL后没有检查错误,无法快速定位问题
  • 图片获取逻辑缺陷:一个产品可能有多个附件,原查询会随机返回一个,逻辑不严谨

2. 修复后的代码(独立PHP脚本版)

// 替换为你的数据库信息
define('DB_HOST', 'localhost');
define('DB_USER', '你的数据库用户名');
define('DB_PASS', '你的数据库密码');
define('DB_NAME', '你的数据库名');
define('TABLE_PREFIX', 'wp_'); // 替换为你的实际表前缀

$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 

// 检查数据库连接
if (mysqli_connect_errno()) { 
    echo "数据库连接失败: " . mysqli_connect_error(); 
    die(); 
} 

// 修正SQL,解决GROUP BY问题,同时用聚合函数处理附件路径
$query = "
    SELECT 
        p.ID, p.post_title, p.post_status, p.post_name,
        pp.min_price, pp.max_price,
        MAX(pi.meta_value) AS product_image
    FROM `" . TABLE_PREFIX . "posts` p
    INNER JOIN `" . TABLE_PREFIX . "wc_product_meta_lookup` pp ON pp.product_id = p.ID
    LEFT JOIN `" . TABLE_PREFIX . "postmeta` pi ON pi.post_id = p.ID AND pi.meta_key = '_wp_attached_file'
    WHERE p.post_status = 'publish' AND p.post_type = 'product'
    GROUP BY p.ID, p.post_title, p.post_status, p.post_name, pp.min_price, pp.max_price
";

$stmt = $conn->prepare($query);
if (!$stmt) {
    echo "SQL准备失败: " . $conn->error;
    die();
}

$stmt->execute();

// 检查SQL执行错误
if ($stmt->errno) {
    echo "SQL执行失败: " . $stmt->error;
    die();
}

$result = $stmt->get_result();
$courses = array();

while ($row = $result->fetch_assoc()) {
    $courses[] = $row;
}

// 输出JSON,保留中文编码
echo json_encode($courses, JSON_UNESCAPED_UNICODE);

// 关闭资源
$stmt->close();
$conn->close();

3. 修复说明

  • 用变量控制表前缀,适配不同站点配置
  • 修正GROUP BY语法,符合MySQL严格模式要求
  • 添加了SQL执行错误检查,方便快速定位问题
  • 用MAX()聚合函数获取产品的第一个附件路径,避免随机返回的问题

内容的提问来源于stack exchange,提问作者Asif Mehmood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:43:45