更改 Woocommerce 购物车总数中的小数位数
Change number of decimals in Woocommerce cart totals
在 Woocommerce 中,我在 Woocommerce 常规设置中将小数位数设置为 7,因此我可以像这样显示 产品价格 [= 10=].0453321
。
我想知道我是否可以 set/round 购物车总数 只保留两位小数(像这样 .34
)?
正确的方法是仅更改购物车和结帐页面允许的小数位数:
add_filter( 'wc_get_price_decimals', 'change_prices_decimals', 20, 1 );
function change_prices_decimals( $decimals ){
if( is_cart() || is_checkout() )
$decimals = 2;
return $decimals;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。
要将显示的购物车总计设置为小数点后两位,请改用此方法(仅适用于 Woocommerce 3.3+):
add_filter( 'woocommerce_cart_tax_totals', 'change_decimals_cart_tax_totals', 20, 2 );
function change_decimals_cart_tax_totals( $tax_totals, $cart ){
$decimals = array('decimals' => 2);
$taxes = $cart->get_taxes();
$tax_totals = array();
foreach ( $taxes as $key => $tax ) {
$code = WC_Tax::get_rate_code( $key );
if ( $code || $key === apply_filters( 'woocommerce_cart_remove_taxes_zero_rate_id', 'zero-rated' ) ) {
if ( ! isset( $tax_totals[ $code ] ) ) {
$tax_totals[ $code ] = new stdClass();
$tax_totals[ $code ]->amount = 0;
}
$tax_totals[ $code ]->tax_rate_id = $key;
$tax_totals[ $code ]->is_compound = WC_Tax::is_compound( $key );
$tax_totals[ $code ]->label = WC_Tax::get_rate_label( $key );
$tax_totals[ $code ]->amount += wc_round_tax_total( $tax );
$tax_totals[ $code ]->formatted_amount = wc_price( wc_round_tax_total( $tax_totals[ $code ]->amount ), $decimals );
}
}
if ( apply_filters( 'woocommerce_cart_hide_zero_taxes', true ) ) {
$amounts = array_filter( wp_list_pluck( $tax_totals, 'amount' ) );
$tax_totals = array_intersect_key( $tax_totals, $amounts );
}
return $tax_totals;
}
add_filter( 'woocommerce_cart_totals_order_total_html', 'change_decimals_cart_totals_order_total_html', 20, 1 );
function change_decimals_cart_totals_order_total_html( $formatted_price ){
$decimals = array('decimals' => 2);
$value = '<strong>' . wc_price( WC()->cart->get_total('edit'), $decimals ) . '</strong> ';
// If prices are tax inclusive, show taxes here.
if ( wc_tax_enabled() && WC()->cart->display_prices_including_tax() ) {
$tax_string_array = array();
$cart_tax_totals = WC()->cart->get_tax_totals();
if ( get_option( 'woocommerce_tax_total_display' ) == 'itemized' ) {
foreach ( $cart_tax_totals as $code => $tax ) {
$tax_string_array[] = sprintf( '%s %s', $tax->formatted_amount, $tax->label );
}
} elseif ( ! empty( $cart_tax_totals ) ) {
$tax_string_array[] = sprintf( '%s %s', wc_price( WC()->cart->get_taxes_total( true, true ), $decimals ), WC()->countries->tax_or_vat() );
}
if ( ! empty( $tax_string_array ) ) {
$taxable_address = WC()->customer->get_taxable_address();
$estimated_text = WC()->customer->is_customer_outside_base() && ! WC()->customer->has_calculated_shipping()
? sprintf( ' ' . __( 'estimated for %s', 'woocommerce' ), WC()->countries->estimated_for_prefix( $taxable_address[0] ) . WC()->countries->countries[ $taxable_address[0] ] )
: '';
$value .= '<small class="includes_tax">' . sprintf( __( '(includes %s)', 'woocommerce' ), implode( ', ', $tax_string_array ) . $estimated_text ) . '</small>';
}
}
return $value;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。
You can't really round the prices in cart totals appart. If you do it with different hooks, you will get calculation errors. My code is just changing the number of decimals on displayed formatted prices and will not alter the calculations on real prices…
相关:
如果您只想在购物车和结帐页面更改购物车总数,那么您需要在主题中复制模板
首先将 2 个文件从 woocommerce 插件模板复制到您的主题。
1) 复制plugins\woocommerce\templates\cart\cart-totals.php到your-theme-folder\woocommerce\cart\cart-totals.php
2) 复制plugins\woocommerce\templates\checkout\review-order.php到your-theme-folder\woocommerce\checkout\review-order.php
并在两个文件中找到 wc_cart_totals_order_total_html() 注释此代码并改为放在下面的代码。
$args=array('decimals'=> 2);
echo wc_price(WC()->cart->total,$args);
此代码已经过测试并且可以正常工作fine.Hope它也会对您有所帮助。
在我的例子中,我需要在整个站点中保留 3 位小数 "visible",但只将总计近似为小数点后 2 位(小数点后第三位为零),因为我的支付网关只接受 2小数点后有效数字。
Prices displayed as: 0.336
Taxes: 0.017
But grand total needed to be: 0.350 (instead of 0.353)
我最终没有使用该代码,因为它太可怕了,但你可以说这是一种精神锻炼:
add_filter( 'wc_get_price_decimals', 'change_prices_decimals', 20, 1 );
function change_prices_decimals( $decimals ){
if( is_cart() || is_checkout() )
{
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,0);
$length = count($trace);
for ($i = 0; $i < $length; $i++)
{
if($trace[$i]["function"] == "set_total"){
$decimals = 2;
return $decimals;
}
}
}
return $decimals;
}
在 Woocommerce 中,我在 Woocommerce 常规设置中将小数位数设置为 7,因此我可以像这样显示 产品价格 [= 10=].0453321
。
我想知道我是否可以 set/round 购物车总数 只保留两位小数(像这样 .34
)?
正确的方法是仅更改购物车和结帐页面允许的小数位数:
add_filter( 'wc_get_price_decimals', 'change_prices_decimals', 20, 1 );
function change_prices_decimals( $decimals ){
if( is_cart() || is_checkout() )
$decimals = 2;
return $decimals;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。
要将显示的购物车总计设置为小数点后两位,请改用此方法(仅适用于 Woocommerce 3.3+):
add_filter( 'woocommerce_cart_tax_totals', 'change_decimals_cart_tax_totals', 20, 2 );
function change_decimals_cart_tax_totals( $tax_totals, $cart ){
$decimals = array('decimals' => 2);
$taxes = $cart->get_taxes();
$tax_totals = array();
foreach ( $taxes as $key => $tax ) {
$code = WC_Tax::get_rate_code( $key );
if ( $code || $key === apply_filters( 'woocommerce_cart_remove_taxes_zero_rate_id', 'zero-rated' ) ) {
if ( ! isset( $tax_totals[ $code ] ) ) {
$tax_totals[ $code ] = new stdClass();
$tax_totals[ $code ]->amount = 0;
}
$tax_totals[ $code ]->tax_rate_id = $key;
$tax_totals[ $code ]->is_compound = WC_Tax::is_compound( $key );
$tax_totals[ $code ]->label = WC_Tax::get_rate_label( $key );
$tax_totals[ $code ]->amount += wc_round_tax_total( $tax );
$tax_totals[ $code ]->formatted_amount = wc_price( wc_round_tax_total( $tax_totals[ $code ]->amount ), $decimals );
}
}
if ( apply_filters( 'woocommerce_cart_hide_zero_taxes', true ) ) {
$amounts = array_filter( wp_list_pluck( $tax_totals, 'amount' ) );
$tax_totals = array_intersect_key( $tax_totals, $amounts );
}
return $tax_totals;
}
add_filter( 'woocommerce_cart_totals_order_total_html', 'change_decimals_cart_totals_order_total_html', 20, 1 );
function change_decimals_cart_totals_order_total_html( $formatted_price ){
$decimals = array('decimals' => 2);
$value = '<strong>' . wc_price( WC()->cart->get_total('edit'), $decimals ) . '</strong> ';
// If prices are tax inclusive, show taxes here.
if ( wc_tax_enabled() && WC()->cart->display_prices_including_tax() ) {
$tax_string_array = array();
$cart_tax_totals = WC()->cart->get_tax_totals();
if ( get_option( 'woocommerce_tax_total_display' ) == 'itemized' ) {
foreach ( $cart_tax_totals as $code => $tax ) {
$tax_string_array[] = sprintf( '%s %s', $tax->formatted_amount, $tax->label );
}
} elseif ( ! empty( $cart_tax_totals ) ) {
$tax_string_array[] = sprintf( '%s %s', wc_price( WC()->cart->get_taxes_total( true, true ), $decimals ), WC()->countries->tax_or_vat() );
}
if ( ! empty( $tax_string_array ) ) {
$taxable_address = WC()->customer->get_taxable_address();
$estimated_text = WC()->customer->is_customer_outside_base() && ! WC()->customer->has_calculated_shipping()
? sprintf( ' ' . __( 'estimated for %s', 'woocommerce' ), WC()->countries->estimated_for_prefix( $taxable_address[0] ) . WC()->countries->countries[ $taxable_address[0] ] )
: '';
$value .= '<small class="includes_tax">' . sprintf( __( '(includes %s)', 'woocommerce' ), implode( ', ', $tax_string_array ) . $estimated_text ) . '</small>';
}
}
return $value;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。
You can't really round the prices in cart totals appart. If you do it with different hooks, you will get calculation errors. My code is just changing the number of decimals on displayed formatted prices and will not alter the calculations on real prices…
相关:
如果您只想在购物车和结帐页面更改购物车总数,那么您需要在主题中复制模板
首先将 2 个文件从 woocommerce 插件模板复制到您的主题。
1) 复制plugins\woocommerce\templates\cart\cart-totals.php到your-theme-folder\woocommerce\cart\cart-totals.php
2) 复制plugins\woocommerce\templates\checkout\review-order.php到your-theme-folder\woocommerce\checkout\review-order.php
并在两个文件中找到 wc_cart_totals_order_total_html() 注释此代码并改为放在下面的代码。
$args=array('decimals'=> 2);
echo wc_price(WC()->cart->total,$args);
此代码已经过测试并且可以正常工作fine.Hope它也会对您有所帮助。
在我的例子中,我需要在整个站点中保留 3 位小数 "visible",但只将总计近似为小数点后 2 位(小数点后第三位为零),因为我的支付网关只接受 2小数点后有效数字。
Prices displayed as: 0.336
Taxes: 0.017
But grand total needed to be: 0.350 (instead of 0.353)
我最终没有使用该代码,因为它太可怕了,但你可以说这是一种精神锻炼:
add_filter( 'wc_get_price_decimals', 'change_prices_decimals', 20, 1 );
function change_prices_decimals( $decimals ){
if( is_cart() || is_checkout() )
{
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,0);
$length = count($trace);
for ($i = 0; $i < $length; $i++)
{
if($trace[$i]["function"] == "set_total"){
$decimals = 2;
return $decimals;
}
}
}
return $decimals;
}