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

请求协助将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:25:50