如何在WooCommerce商品分类中为分类下所有产品设置额外成本
WooCommerce分类统一添加额外成本解决方案
总共分为插件方案和轻量自定义代码方案两类,都可以实现直接修改商品基础售价、不在购物车阶段加价的需求:
1. 插件方案
- 可选择支持分类全局定价调整的WooCommerce定价插件,配置路径一般为「产品分类编辑页→全局定价规则」,可设置固定金额额外成本或百分比额外成本,保存规则后会自动同步到分类下所有商品的售价字段,不会仅在购物车结算时临时加价。
- 注意如果有促销价需求,要确认插件支持同时调整常规售价和促销售价的规则配置。
2. 自定义代码方案
无需安装额外插件,直接将以下代码添加到当前主题的functions.php文件或者自定义功能插件中即可:
第一步:添加分类编辑页Metabox及字段保存逻辑
// 给产品分类添加额外成本字段 add_action('product_cat_add_form_fields', 'wc_add_category_extra_cost_field', 10, 1); add_action('product_cat_edit_form_fields', 'wc_edit_category_extra_cost_field', 10, 1); function wc_add_category_extra_cost_field() { ?> <div class="form-field"> <label for="extra_cost"><?php _e('额外成本', 'woocommerce'); ?></label> <input type="number" step="0.01" name="extra_cost" id="extra_cost" value=""> <p class="description"><?php _e('填写该分类下所有商品统一增加的固定成本金额', 'woocommerce'); ?></p> </div> <?php } function wc_edit_category_extra_cost_field($term) { $extra_cost = get_term_meta($term->term_id, 'extra_cost', true); ?> <tr class="form-field"> <th scope="row" valign="top"><label for="extra_cost"><?php _e('额外成本', 'woocommerce'); ?></label></th> <td> <input type="number" step="0.01" name="extra_cost" id="extra_cost" value="<?php echo esc_attr($extra_cost); ?>"> <p class="description"><?php _e('填写该分类下所有商品统一增加的固定成本金额', 'woocommerce'); ?></p> </td> </tr> <?php } // 保存分类额外成本字段 add_action('created_product_cat', 'wc_save_category_extra_cost', 10, 1); add_action('edited_product_cat', 'wc_save_category_extra_cost', 10, 1); function wc_save_category_extra_cost($term_id) { if (isset($_POST['extra_cost'])) { update_term_meta($term_id, 'extra_cost', wc_clean($_POST['extra_cost'])); // 可选:保存分类时批量更新分类下所有产品的售价(固化到产品meta) $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $term_id, ) ) ); $products = get_posts($args); foreach ($products as $product) { $base_price = get_post_meta($product->ID, '_regular_price', true); $new_price = $base_price + $_POST['extra_cost']; update_post_meta($product->ID, '_price', $new_price); update_post_meta($product->ID, '_regular_price', $new_price); } } }
第二步:动态渲染产品售价(无需固化价格可选)
如果你不需要把额外成本固化到产品售价字段,只需要前端和接口读取价格时自动叠加,可添加以下钩子代码:
add_filter('woocommerce_get_price', 'wc_add_extra_cost_to_product_price', 10, 2); add_filter('woocommerce_get_regular_price', 'wc_add_extra_cost_to_product_price', 10, 2); add_filter('woocommerce_get_sale_price', 'wc_add_extra_cost_to_product_price', 10, 2); function wc_add_extra_cost_to_product_price($price, $product) { $terms = get_the_terms($product->get_id(), 'product_cat'); if ($terms && !is_wp_error($terms)) { foreach ($terms as $term) { $extra_cost = get_term_meta($term->term_id, 'extra_cost', true); if ($extra_cost) { $price += floatval($extra_cost); // 产品属于多个分类时只取第一个有额外成本的分类,避免重复加价 break; } } } return $price; }
注意事项
- 如果产品同时归属多个分类,可自行调整代码逻辑取最高/最低额外成本,或者指定分类优先级避免重复加价
- 调整额外成本后如果站点开启了页面缓存、对象缓存,需要清空缓存后前端价格才会更新
- 以上代码默认仅处理简单产品,若要适配可变产品,需要额外追加变体价格的过滤钩子即可
内容的提问来源于stack exchange,提问作者sangkavr
相关产品推荐
相关产品推荐

