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

如何在WooCommerce可变产品中显示每平方米单价(Elementor适配)

实现WooCommerce变体产品显示每平方米单价(适配Elementor模板)

问题场景

搭建WooCommerce网站,销售带1kg、3kg等规格的可变产品,每个规格对应不同覆盖面积。需在Elementor自定义的单产品页面中,给每个变体价格追加每平方米单价,格式如:€15(€4.29 / m²)。

原尝试的代码未达到预期效果,核心问题包括:硬编码覆盖面积、依赖的钩子在Elementor模板中不生效、未将单价与变体价格绑定显示。

解决方案步骤

  • 添加自定义字段:给每个变体添加可编辑的「覆盖面积」字段,替代硬编码数值,适配不同产品需求
  • 修改价格渲染逻辑:利用WooCommerce原生过滤器,将每平单价追加到变体价格后,确保兼容Elementor模板
  • 前端实时更新:处理变体切换的前端交互,保证选中不同变体时,每平单价同步更新

完整代码实现

1. 添加变体覆盖面积自定义字段(functions.php)

// 在变体定价选项中添加覆盖面积输入框
add_action( 'woocommerce_variation_options_pricing', 'add_variation_coverage_field', 10, 3 );
function add_variation_coverage_field( $loop, $variation_data, $variation ) {
    woocommerce_wp_text_input( array(
        'id'          => '_coverage_area[' . $loop . ']',
        'label'       => __('覆盖面积 (m²)', 'woocommerce'),
        'desc_tip'    => true,
        'description' => __('输入该变体对应的覆盖面积', 'woocommerce'),
        'value'       => get_post_meta( $variation->ID, '_coverage_area', true ),
        'type'        => 'number',
        'custom_attributes' => array(
            'step' => '0.1',
            'min'  => '0'
        )
    ) );
}

// 保存变体覆盖面积字段值
add_action( 'woocommerce_save_product_variation', 'save_variation_coverage_field', 10, 2 );
function save_variation_coverage_field( $variation_id, $i ) {
    $coverage_area = $_POST['_coverage_area'][$i];
    if ( isset( $coverage_area ) ) {
        update_post_meta( $variation_id, '_coverage_area', esc_attr( $coverage_area ) );
    }
}

2. 追加每平方米单价到变体价格(functions.php)

// 过滤变体价格HTML,添加每平单价
add_filter( 'woocommerce_variation_price_html', 'append_sqm_price_to_variation', 10, 2 );
add_filter( 'woocommerce_single_variation_price_html', 'append_sqm_price_to_variation', 10, 2 );

function append_sqm_price_to_variation( $price_html, $variation ) {
    $coverage_area = get_post_meta( $variation->get_id(), '_coverage_area', true );
    
    // 仅当覆盖面积有效时计算并显示
    if ( ! empty( $coverage_area ) && $coverage_area > 0 ) {
        $price = $variation->get_price();
        $price_per_sqm = round( $price / $coverage_area, 2 );
        $sqm_price_html = wc_price( $price_per_sqm ) . ' / m²';
        $price_html = str_replace( '</span>', ' (' . $sqm_price_html . ')</span>', $price_html );
    }
    
    return $price_html;
}

3. 适配Elementor前端变体切换(可选)

如果Elementor变体组件导致价格更新时每平单价未同步,添加以下JS代码到主题自定义JS或Elementor自定义脚本中:

jQuery(document).ready(function($) {
    // 监听变体选择事件
    $('form.variations_form').on('show_variation', function(event, variation) {
        var coverageArea = variation._coverage_area;
        if (coverageArea && coverageArea > 0) {
            var price = variation.display_price;
            var pricePerSqm = (price / coverageArea).toFixed(2);
            var currencySymbol = $('span.woocommerce-Price-currencySymbol').text();
            
            // 更新价格显示
            var priceElement = $('.single_variation .price');
            var originalPrice = priceElement.html().split(' (')[0];
            priceElement.html(`${originalPrice} (${currencySymbol}${pricePerSqm} / m²)`);
        }
    });
});

使用说明

  1. 将PHP代码添加到当前主题的functions.php文件,或使用代码片段插件管理
  2. 编辑可变产品的每个变体,在「定价」选项卡下填写对应的覆盖面积
  3. 刷新单产品页面,即可看到变体价格后追加了每平方米单价

内容的提问来源于stack exchange,提问作者Selim wix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:31:12