通过WooCommerce REST API批量导入产品失败的解决方案咨询
问题解决方案
1. 增加错误捕获与重试机制
当前代码未处理请求失败的情况,一旦某个批次请求出错就会直接中断流程。必须添加异常捕获,记录错误详情并增加重试逻辑,避免单次失败导致整体中断:
$createChunks = array_chunk($creates, 90); foreach ($createChunks as $chunkIndex => $chunk) { try { $response = $this->woocommerce->post('products/batch', ['create' => $chunk]); error_log("批次 {$chunkIndex} 导入成功: " . json_encode($response)); } catch (Exception $e) { error_log("批次 {$chunkIndex} 初始请求失败: " . $e->getMessage()); // 最多重试3次,每次间隔5秒 $retryCount = 0; while ($retryCount < 3) { sleep(5); try { $response = $this->woocommerce->post('products/batch', ['create' => $chunk]); error_log("批次 {$chunkIndex} 重试第" . ($retryCount+1) . "次成功"); break; } catch (Exception $retryE) { $retryCount++; error_log("批次 {$chunkIndex} 重试第{$retryCount}次失败: " . $retryE->getMessage()); } } } sleep(2); }
2. 缩小批量处理的产品数量
90个产品的批次可能超出WooCommerce API的请求体大小限制,建议将批次大小调整为30-50个产品。每个产品的字段数量、内容长度会影响请求体积,过大的POST请求容易触发服务器500错误或超时。
3. 优化WooCommerce客户端超时设置
给WooCommerce API客户端设置更长的超时时间,避免因单批次处理耗时过长被中断:
$this->woocommerce = new Automattic\WooCommerce\Client( WC()->api_request_url(''), 'consumer_key', 'consumer_secret', [ 'version' => 'wc/v3', 'timeout' => 60, // 将超时时间设置为60秒 ] );
4. 服务器配置与日志检查
- 确认Hetzner主机的
php.ini参数:post_max_size和upload_max_filesize需足够大(建议设置为64M以上),避免因请求体过大被拦截;同时验证max_execution_time、memory_limit的设置是否实际生效。 - 查看服务器错误日志(Apache的
error.log或Nginx的error.log),500错误的具体原因(如PHP致命错误、数据库连接超时)会记录在这里,是排查核心问题的关键。 - 检查服务器防火墙、WordPress安全插件(如Wordfence)是否拦截了频繁的API请求,导致流程中途中断。
5. 降低导入过程的资源消耗
- 导入前临时禁用WooCommerce的自动库存同步、订单邮件通知等非必要功能,减少数据库负载。
- 暂时移除产品相关的钩子(如
woocommerce_new_product),避免额外的业务逻辑拖慢导入速度,导入完成后再恢复。
6. 拆分任务为 cron 分批执行
避免长时间运行的脚本被服务器强制终止,将导入任务拆分为多个小批次,用WordPress cron 调度执行:
// 保存当前处理到的批次索引 update_option('product_import_current_chunk', $chunkIndex + 1); // 1分钟后继续执行剩余批次 wp_schedule_single_event(time() + 60, 'continue_product_import');
然后在continue_product_import钩子回调中,读取保存的批次索引,继续处理剩余的产品批次。
内容的提问来源于stack exchange,提问作者user26990105
相关产品推荐
相关产品推荐

