如何通过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
相关产品推荐
相关产品推荐

