WooCommerce价格定制需求:展示含税/不含税及促销价
解决方案
以下代码可同时满足简单/可变产品的价格显示需求,保留促销价的划线原价样式,且在产品循环页和单个产品页均生效:
核心代码
add_filter( 'woocommerce_get_price_html', 'custom_display_price_with_tax_info', 100, 2 ); function custom_display_price_with_tax_info( $price_html, $product ) { // 跳过不可购买的产品 if ( ! $product->is_purchasable() ) { return $price_html; } $tax_incl_text = ' incl. tax'; $tax_excl_text = ' excl. tax'; $price_html = ''; // 处理简单产品 if ( $product->is_type( 'simple' ) ) { $regular_price = $product->get_regular_price(); $sale_price = $product->get_sale_price(); // 计算含税/不含税原价 $reg_incl = wc_price( wc_get_price_including_tax( $product, array( 'price' => $regular_price ) ) ); $reg_excl = wc_price( wc_get_price_excluding_tax( $product, array( 'price' => $regular_price ) ) ); if ( $sale_price ) { // 计算含税/不含税促销价 $sale_incl = wc_price( wc_get_price_including_tax( $product, array( 'price' => $sale_price ) ) ); $sale_excl = wc_price( wc_get_price_excluding_tax( $product, array( 'price' => $sale_price ) ) ); // 保留划线原价,添加促销价及税项说明 $price_html .= '<del class="regular-price">' . $reg_incl . $tax_incl_text . ' | ' . $reg_excl . $tax_excl_text . '</del>'; $price_html .= '<ins class="sale-price">' . $sale_incl . $tax_incl_text . ' | ' . $sale_excl . $tax_excl_text . '</ins>'; } else { // 无促销价时显示正常价格及税项说明 $price_html .= '<span class="regular-price">' . $reg_incl . $tax_incl_text . ' | ' . $reg_excl . $tax_excl_text . '</span>'; } } // 处理可变产品 elseif ( $product->is_type( 'variable' ) ) { $min_reg = $product->get_variation_regular_price( 'min' ); $max_reg = $product->get_variation_regular_price( 'max' ); $min_sale = $product->get_variation_sale_price( 'min' ); $max_sale = $product->get_variation_sale_price( 'max' ); // 计算含税/不含税的最低/最高原价 $min_reg_incl = wc_price( wc_get_price_including_tax( $product, array( 'price' => $min_reg ) ) ); $max_reg_incl = wc_price( wc_get_price_including_tax( $product, array( 'price' => $max_reg ) ) ); $min_reg_excl = wc_price( wc_get_price_excluding_tax( $product, array( 'price' => $min_reg ) ) ); $max_reg_excl = wc_price( wc_get_price_excluding_tax( $product, array( 'price' => $max_reg ) ) ); if ( $min_sale ) { // 计算含税/不含税的最低/最高促销价 $min_sale_incl = wc_price( wc_get_price_including_tax( $product, array( 'price' => $min_sale ) ) ); $max_sale_incl = wc_price( wc_get_price_including_tax( $product, array( 'price' => $max_sale ) ) ); $min_sale_excl = wc_price( wc_get_price_excluding_tax( $product, array( 'price' => $min_sale ) ) ); $max_sale_excl = wc_price( wc_get_price_excluding_tax( $product, array( 'price' => $max_sale ) ) ); // 处理价格区间/单一价格的显示逻辑 $reg_html = ( $min_reg === $max_reg ) ? $min_reg_incl . $tax_incl_text . ' | ' . $min_reg_excl . $tax_excl_text : sprintf( '%1$s - %2$s', $min_reg_incl . $tax_incl_text, $max_reg_incl . $tax_incl_text ) . ' | ' . sprintf( '%1$s - %2$s', $min_reg_excl . $tax_excl_text, $max_reg_excl . $tax_excl_text ); $sale_html = ( $min_sale === $max_sale ) ? $min_sale_incl . $tax_incl_text . ' | ' . $min_sale_excl . $tax_excl_text : sprintf( '%1$s - %2$s', $min_sale_incl . $tax_incl_text, $max_sale_incl . $tax_incl_text ) . ' | ' . sprintf( '%1$s - %2$s', $min_sale_excl . $tax_excl_text, $max_sale_excl . $tax_excl_text ); $price_html .= '<del class="regular-price">' . $reg_html . '</del>'; $price_html .= '<ins class="sale-price">' . $sale_html . '</ins>'; } else { // 无促销价时显示原价区间/单一价格及税项说明 $reg_html = ( $min_reg === $max_reg ) ? $min_reg_incl . $tax_incl_text . ' | ' . $min_reg_excl . $tax_excl_text : sprintf( '%1$s - %2$s', $min_reg_incl . $tax_incl_text, $max_reg_incl . $tax_incl_text ) . ' | ' . sprintf( '%1$s - %2$s', $min_reg_excl . $tax_excl_text, $max_reg_excl . $tax_excl_text ); $price_html .= '<span class="regular-price">' . $reg_html . '</span>'; } } // 其他产品类型(如分组、订阅)可按需扩展 else { return $price_html; } return $price_html; }
代码说明
- 钩子选择:使用
woocommerce_get_price_html钩子覆盖默认价格输出逻辑,该钩子在产品循环和单个产品页均会触发。 - 产品类型兼容:分别处理简单产品和可变产品,可变产品支持价格区间和单一价格两种场景。
- 促销价保留:通过
<del>标签保留原价的划线样式,<ins>标签显示促销价,符合WooCommerce默认样式规范。 - 税项计算:使用WooCommerce内置函数计算价格,确保与站点税设置一致。
- 自定义文本:直接修改
$tax_incl_text和$tax_excl_text变量即可调整税项说明文本。
使用方法
将上述代码添加到当前激活主题的functions.php文件中,或通过自定义代码插件(如Code Snippets)添加,无需额外配置即可生效。
内容的提问来源于stack exchange,提问作者Captain Krik
相关产品推荐
相关产品推荐

