如何无需点击保存按钮批量更新WooCommerce现有产品重量值
批量更新符合条件的WooCommerce产品重量(仅运行一次)
问题分析
你当前的代码仅在单个产品后台保存时触发重量更新,无法批量处理现有产品;直接调用do_action('update_product_weight_from_dimensions', 10, 1)无效,因为该函数是woocommerce_admin_process_product_object的回调函数,并非独立可触发的Action钩子。
解决方案:一次性批量更新脚本
以下代码会查询所有WooCommerce产品,逐个检查条件,符合要求的产品直接更新重量并保存,仅需运行一次,执行完成后务必删除或注释这段代码:
function bulk_update_product_weights() { // 查询所有已发布的产品,可根据需求调整参数 $products = wc_get_products(array( 'status' => 'publish', 'limit' => -1, // 不限数量,产品过多时建议改为分批处理 'type' => array('simple', 'variable'), // 可按需指定产品类型 )); foreach ($products as $product) { $squared_dimensions = $product->get_length() * $product->get_width(); $synthetic_product = $product->get_attribute('pa_composition'); // 匹配条件则更新重量 if ($squared_dimensions <= 2.8 && $synthetic_product == 'steel') { $product->set_weight(3); $product->save(); // 必须调用save()才能持久化更新 } } // 可选:运行后弹出完成提示,确认后删除该函数 // wp_die('批量更新完成,请立即删除此函数代码'); } // 绑定到init钩子,访问网站任意页面即可触发执行 add_action('init', 'bulk_update_product_weights');
使用步骤
- 将上述代码添加到WordPress主题的
functions.php文件,或通过代码片段插件(如Code Snippets)添加。 - 访问网站任意前端页面或后台页面一次,脚本会自动执行批量更新。
- 执行完成后,立即删除或注释这段代码,避免每次访问都重复运行。
注意事项
- 备份数据库:操作前建议备份产品数据,防止意外错误导致数据丢失。
- 大数量产品分批处理:如果店铺产品超过1000个,直接用
limit => -1可能触发超时,可修改为分批查询:$page = 1; $per_page = 100; // 每页处理100个产品 do { $products = wc_get_products(array( 'status' => 'publish', 'limit' => $per_page, 'paged' => $page, 'type' => array('simple', 'variable'), )); if (empty($products)) break; foreach ($products as $product) { // 同上的条件检查与更新逻辑 } $page++; } while (true); - 可变产品变体处理:若需要处理可变产品的子变体,需额外循环变体:
if ($product->is_type('variable')) { foreach ($product->get_children() as $variation_id) { $variation = wc_get_product($variation_id); $squared_dimensions = $variation->get_length() * $variation->get_width(); $synthetic_product = $variation->get_attribute('pa_composition'); if ($squared_dimensions <= 2.8 && $synthetic_product == 'steel') { $variation->set_weight(3); $variation->save(); } } } else { // 简单产品的更新逻辑 }
内容的提问来源于stack exchange,提问作者Efstef
相关产品推荐
相关产品推荐

