请求协助将WordPress产品导入PHP脚本转为后台运行
问题概述
开发了一款WordPress PHP插件,功能是调用外部API获取1-10000号产品的JSON数据并导入到WooCommerce中。当前通过后台菜单的「开始导入」按钮触发执行,但仅能成功导入前100个产品后就因浏览器超时停止。已安装Composer和Action Scheduler,尝试批量处理和调度均未成功(无报错但执行异常),服务器资源充足且已调高PHP参数仍无效。
解决方案一:基于Action Scheduler实现后台批量导入
Action Scheduler是WooCommerce官方的任务调度工具,能将长任务拆分为后台批量任务,避免浏览器超时。以下是修改后的插件代码:
<?php /** * Plugin Name: Product Importer * Description: Imports products from an external API * Version: 1.0 * Author: me * Author URI: http://www.example.com */ // 检查Action Scheduler是否可用 if (!function_exists('as_schedule_single_action')) { add_action('admin_notices', function() { echo '<div class="error"><p>请先安装并激活Action Scheduler插件</p></div>'; }); return; } add_action('admin_menu', 'add_import_button'); function add_import_button() { add_menu_page('Import Products', 'Import Products', 'manage_options', 'import_products', 'import_products_page'); } function import_products_page() { echo '<h1>Import Products</h1>'; echo '<form method="post">'; echo '<input type="submit" name="start_import" value="Start Import">'; echo '</form>'; if (isset($_POST['start_import'])) { // 调度首个批量导入任务,从ID=1开始,每次处理20个 as_schedule_single_action(time(), 'batch_import_products', ['start_id' => 1, 'batch_size' => 20]); echo '<div class="updated"><p>导入任务已启动,将在后台自动执行</p></div>'; } } // 批量导入回调函数 add_action('batch_import_products', 'batch_import_products_callback', 10, 2); function batch_import_products_callback($start_id, $batch_size) { $api_key = 'my-api-key'; $headers = ['X-Api-Key: ' . $api_key]; $url = 'https://example.com/products/'; $end_id = min($start_id + $batch_size - 1, 10000); for ($product_id = $start_id; $product_id <= $end_id; $product_id++) { $product_url = $url . $product_id; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $product_url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 单个API请求超时设置 $response = curl_exec($ch); if (curl_errno($ch)) { error_log("API请求失败(ID:{$product_id}): " . curl_error($ch)); curl_close($ch); continue; } curl_close($ch); $product_data = json_decode($response, true); if (!$product_data || isset($product_data['error'])) { error_log("产品数据无效(ID:{$product_id}): " . $response); continue; } // WooCommerce产品创建/更新逻辑 $product = wc_get_product($product_id) ?: new WC_Product_Simple(); $product->set_id($product_id); $product->set_name($product_data['name']); $product->set_regular_price($product_data['price']); // 补充其他字段设置(如描述、库存等) $product->save(); } // 调度下一批次任务(若还有未处理产品) $next_start_id = $end_id + 1; if ($next_start_id <= 10000) { as_schedule_single_action(time() + 5, 'batch_import_products', ['start_id' => $next_start_id, 'batch_size' => 20]); } else { error_log('所有产品导入完成'); } }
关键说明
- 移除手动引入Action Scheduler的代码,改为检查工具可用性,避免冲突
- 点击按钮仅调度首个任务,后续批量任务自动触发,间隔5秒避免服务器压力
- 每次处理20个产品(可根据API限流/服务器性能调整)
- 增加API请求超时和错误日志,方便排查问题
解决方案二:通过Linux SSH终端执行脚本
直接在服务器终端执行导入脚本,完全不受浏览器超时限制,适合一次性大量导入。
步骤1:创建独立导入脚本
在网站根目录创建product_importer_cli.php文件:
<?php // 加载WordPress核心环境 require_once(dirname(__FILE__) . '/wp-load.php'); // 权限校验(仅管理员可执行) if (!current_user_can('manage_options')) { wp_die('无权限执行此操作'); } $api_key = 'my-api-key'; $headers = ['X-Api-Key: ' . $api_key]; $url = 'https://example.com/products/'; $batch_size = 50; // 每次处理50个产品,可调整 $total_products = 10000; for ($start_id = 1; $start_id <= $total_products; $start_id += $batch_size) { $end_id = min($start_id + $batch_size - 1, $total_products); echo "正在导入ID {$start_id} 至 {$end_id} 的产品...\n"; for ($product_id = $start_id; $product_id <= $end_id; $product_id++) { $product_url = $url . $product_id; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $product_url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $response = curl_exec($ch); if (curl_errno($ch)) { echo "ID {$product_id} 请求失败: " . curl_error($ch) . "\n"; curl_close($ch); continue; } curl_close($ch); $product_data = json_decode($response, true); if (!$product_data || isset($product_data['error'])) { echo "ID {$product_id} 数据无效: " . $response . "\n"; continue; } // WooCommerce产品创建/更新逻辑 $product = wc_get_product($product_id) ?: new WC_Product_Simple(); $product->set_id($product_id); $product->set_name($product_data['name']); $product->set_regular_price($product_data['price']); $product->save(); echo "ID {$product_id} 导入成功\n"; } sleep(1); // 每批次后休息1秒,避免API限流 } echo "所有产品导入完成!\n"; ?>
步骤2:SSH终端执行脚本
登录服务器后,切换到网站根目录,执行命令:
php product_importer_cli.php
可选:后台运行脚本(关闭终端不中断)
nohup php product_importer_cli.php > import_log.txt 2>&1 &
执行后可通过tail -f import_log.txt查看实时导入进度和日志。
注意事项
- 调整批量大小时需兼顾API限流政策和服务器性能,避免触发API频率限制
- 导入前建议备份数据库,防止数据异常
- 两种方案均包含错误处理,可通过服务器错误日志或终端输出排查问题
内容的提问来源于stack exchange,提问作者Light099
相关产品推荐
相关产品推荐

