如何模拟触发WooCommerce动作批量更新所有商品信息
批量更新WooCommerce商品库存与价格方案
实现思路
- 抽离原单个商品的更新逻辑为独立复用函数
- 编写批量遍历函数,获取所有带变体的可变产品,逐个处理其变体数据
- 将代码独立为单独文件,支持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 }
使用说明
- 将代码保存为
wc-batch-update-products.php,可选择两种放置方式:- 放入当前主题目录(
wp-content/themes/你的主题名/) - 创建独立插件目录(
wp-content/plugins/wc-batch-update/)并放入文件,然后在WP后台启用该插件
- 放入当前主题目录(
- 执行方式一:WP CLI(推荐)
在服务器终端运行命令:wp wc batch-update-products - 执行方式二:后台页面触发
登录WP后台,进入「WooCommerce」->「批量更新商品」,点击「开始批量更新」按钮即可。
优化说明
- 增加错误日志记录,便于排查更新失败的商品
- 自动跳过无SKU的变体,减少无效请求
- 新增库存状态自动同步逻辑
- 支持两种触发方式,适配不同服务器环境
内容的提问来源于stack exchange,提问作者Milos Segedi
相关产品推荐
相关产品推荐

