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

如何模拟触发WooCommerce动作批量更新所有商品信息

批量更新WooCommerce商品库存与价格方案

实现思路

  1. 抽离原单个商品的更新逻辑为独立复用函数
  2. 编写批量遍历函数,获取所有带变体的可变产品,逐个处理其变体数据
  3. 将代码独立为单独文件,支持WP CLI或后台页面两种触发方式执行全量更新

完整代码(独立文件 wc-batch-update-products.php)

<?php
/**
 * WooCommerce 批量更新商品库存与价格
 * 可放置于主题目录或单独插件目录中
 */

// 禁止直接访问文件
if (!defined('ABSPATH')) {
    exit;
}

/**
 * 更新单个商品的所有变体数据
 * @param int $parent_product_id 父商品ID
 */
function wc_update_product_variations_from_api($parent_product_id) {
    $parent_product = wc_get_product($parent_product_id);
    
    // 跳过非可变产品
    if (!$parent_product || !$parent_product->is_type('variable')) {
        return;
    }

    $variations = $parent_product->get_available_variations();

    foreach ($variations as $variation) {
        $variation_id = $variation['variation_id'];
        $sku = $variation['sku'];
        $quantity = $variation['max_qty'];

        // 跳过无SKU的变体,避免无效请求
        if (empty($sku)) {
            error_log("变体ID {$variation_id} 无SKU,跳过更新");
            continue;
        }

        $requestData = [
            "request" => [
                "header" => [
                    "auth" => [
                        "key" => "my key" // 替换为你的实际授权密钥
                    ]
                ],
                "body" => [
                    "items" => [
                        [
                            'sku' => $sku,
                            'qty' => $quantity
                        ]
                    ]
                ]
            ]
        ];

        $curl = curl_init();
        curl_setopt_array($curl, [
            CURLOPT_URL => 'route', // 替换为你的实际接口地址
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => json_encode($requestData),
            CURLOPT_HTTPHEADER => [
                "cache-control: no-cache",
                "content-type: application/json"
            ],
        ]);

        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);

        // 处理CURL请求错误
        if ($err) {
            error_log("CURL请求失败(变体SKU:{$sku}): " . $err);
            continue;
        }

        $responseData = json_decode($response, true);

        // 解析接口响应并更新数据
        if ($responseData && isset($responseData['response']['body']['items'])) {
            foreach ($responseData['response']['body']['items'] as $item) {
                if ($item['sku'] == $sku) {
                    $fulfillableQty = isset($item['fulfillableQty']) ? $item['fulfillableQty'] : 0;
                    $listPrice = isset($item['price']['listPrice']) ? $item['price']['listPrice'] : 0;

                    // 更新变体价格与库存
                    update_post_meta($variation_id, '_regular_price', $listPrice);
                    update_post_meta($variation_id, '_price', $listPrice);
                    update_post_meta($variation_id, '_stock', $fulfillableQty);

                    // 自动设置库存状态
                    wc_update_product_stock_status($variation_id, $fulfillableQty > 0 ? 'instock' : 'outofstock');

                    error_log("变体SKU:{$sku} 更新完成 - 价格:{$listPrice},库存:{$fulfillableQty}");
                }
            }
        } else {
            error_log("接口响应无效(变体SKU:{$sku}): " . $response);
        }
    }
}

/**
 * 批量遍历所有可变产品并执行更新
 */
function wc_batch_update_all_variable_products() {
    // 查询所有已发布的可变产品
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'tax_query' => [
            [
                'taxonomy' => 'product_type',
                'field' => 'slug',
                'terms' => 'variable'
            ]
        ]
    ];

    $products = get_posts($args);

    if (empty($products)) {
        error_log("未找到需要更新的可变产品");
        return;
    }

    foreach ($products as $product) {
        wc_update_product_variations_from_api($product->ID);
    }

    error_log("所有可变产品批量更新完成");
}

// 注册WP CLI命令(推荐批量执行,避免超时)
if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wc batch-update-products', function() {
        wc_batch_update_all_variable_products();
        WP_CLI::success('批量更新已完成');
    });
}

// 可选:添加后台触发页面(适合无服务器CLI权限的场景)
add_action('admin_menu', 'wc_add_batch_update_menu');
function wc_add_batch_update_menu() {
    add_submenu_page(
        'woocommerce',
        '批量更新商品',
        '批量更新商品',
        'manage_options',
        'wc-batch-update',
        'wc_batch_update_admin_page'
    );
}

function wc_batch_update_admin_page() {
    if (!current_user_can('manage_options')) {
        wp_die('无权限访问此页面');
    }

    // 触发更新操作
    if (isset($_GET['run_update'])) {
        wc_batch_update_all_variable_products();
        echo '<div class="notice notice-success"><p>批量更新已执行完成,可查看系统日志确认结果</p></div>';
    }

    ?>
    <div class="wrap">
        <h1>批量更新商品库存与价格</h1>
        <p>点击下方按钮触发全量更新,过程可能耗时较长,请不要关闭页面</p>
        <a href="<?php echo admin_url('admin.php?page=wc-batch-update&run_update=1'); ?>" class="button button-primary">开始批量更新</a>
    </div>
    <?php
}

使用说明

  1. 将代码保存为 wc-batch-update-products.php,可选择两种放置方式:
    • 放入当前主题目录(wp-content/themes/你的主题名/)
    • 创建独立插件目录(wp-content/plugins/wc-batch-update/)并放入文件,然后在WP后台启用该插件
  2. 执行方式一:WP CLI(推荐)
    在服务器终端运行命令:
    wp wc batch-update-products
    
  3. 执行方式二:后台页面触发
    登录WP后台,进入「WooCommerce」->「批量更新商品」,点击「开始批量更新」按钮即可。

优化说明

  • 增加错误日志记录,便于排查更新失败的商品
  • 自动跳过无SKU的变体,减少无效请求
  • 新增库存状态自动同步逻辑
  • 支持两种触发方式,适配不同服务器环境

内容的提问来源于stack exchange,提问作者Milos Segedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:46:14