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

WooCommerce价格显示自定义冲突解决:分类隐藏/可变产品价格/格式修改兼容

WooCommerce 价格格式化钩子冲突修复方案

问题根因

  • 你给价格格式化功能设置的9999高优先级,会覆盖其他低优先级钩子对woocommerce_get_price_html的返回结果。原有隐藏逻辑(sold分类隐藏价格、可变产品隐藏区间)会先返回空的价格HTML,但你的高优先级钩子忽略了前置修改结果,直接重新生成了格式化后的价格,导致隐藏功能失效。

修复后代码示例

add_filter( 'woocommerce_get_price_html', 'custom_price_format_short_unit', 9999, 2 );
function custom_price_format_short_unit( $price_html, $product ) {
    // 优先保留前置逻辑的空价格返回结果,不覆盖原有隐藏规则
    if ( empty( $price_html ) ) {
        return $price_html;
    }

    // 双重校验原有隐藏规则,避免漏判
    // 校验1:商品属于sold分类直接返回空
    if ( has_term( 'sold', 'product_cat', $product->get_id() ) ) {
        return '';
    }
    // 校验2:可变产品未选变体时隐藏价格,可根据原有逻辑调整判断条件
    if ( $product->is_type( 'variable' ) && ! is_product() ) {
        return '';
    }

    // 执行价格格式化逻辑
    $raw_price = $product->get_price();
    if ( empty( $raw_price ) ) {
        return $price_html;
    }

    // 单位映射规则
    $units = [
        1e12 => 'T',
        1e9 => 'M',
        1e6 => 'Juta',
        1e3 => 'Ribu'
    ];

    $formatted_price = 'Rp ';
    foreach ( $units as $divider => $unit ) {
        if ( $raw_price >= $divider ) {
            $value = $raw_price / $divider;
            // 按要求处理不同单位的小数位数
            if ( $unit === 'Juta' ) {
                $value = round( $value, 1 );
                $formatted_value = str_replace( '.', ',', $value );
                // 小数位为0时自动省略
                if ( str_ends_with( $formatted_value, ',0' ) ) {
                    $formatted_value = rtrim( $formatted_value, ',0' );
                }
            } elseif ( $unit === 'M' ) {
                $value = round( $value, 2 );
                $formatted_value = str_replace( '.', ',', $value );
                // 末尾为0的小数位自动省略
                if ( str_ends_with( $formatted_value, ',00' ) ) {
                    $formatted_value = rtrim( $formatted_value, ',00' );
                } elseif ( str_ends_with( $formatted_value, '0' ) ) {
                    $formatted_value = rtrim( $formatted_value, '0' );
                }
            } else {
                $formatted_value = str_replace( '.', ',', round( $value ) );
            }
            $formatted_price .= $formatted_value . ' ' . $unit;
            break;
        }
    }

    return $formatted_price;
}

注意事项

  • 如果你原有逻辑要求商品详情页的可变产品也默认隐藏价格,仅选中变体后显示,可删掉上述代码中&& ! is_product()的判断条件,变体选中后的价格是WooCommerce单独调用接口返回的,不会被该钩子影响
  • 如sold分类的实际slug不是sold,替换为你后台设置的对应分类slug即可
  • 小数位处理规则可根据实际展示需求灵活调整,当前代码已对齐你给出的示例要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:45:03