【问题标题】:WooCommerce - Rounding total prices before placing order when using 4 decimals pricesWooCommerce - 使用 4 位小数价格下订单前四舍五入总价格
【发布时间】:2017-12-24 22:15:42
【问题描述】:

所以我目前正在开发一个批量销售谷物和香料的网站。

1 件产品的单位是 1 克。我设置了一个产品的最低订购量,比如说 100 个单位(100 克)。但是 1 克的价格可能非常低(有时 0.0045 美元,所以 1 克甚至不到 0.5 美分)。

我还设置了下订单的最低金额,购物车的总金额必须至少为 15 美元。

有时,购物车的总额将是一个小数点后 4 位的金额,例如 $20.5517 。我希望购物车中显示的小计和总价四舍五入到小数点后两位。但我需要将商品价格保留为小数点后 4 位,因为这是我在价格上保持竞争力的唯一方法。¸

基本上,我需要后端保留 4 位小数的价格并在产品上显示 4 位小数(这就是它已经设置的方式),但我希望在客户可以通过贝宝付款之前将总数四舍五入。

有人可以帮我吗?

谢谢

【问题讨论】:

    标签: php wordpress woocommerce cart price


    【解决方案1】:

    这里有一个解决方案。但是您必须自己对 woocommerce 相关模板进行所有必要的更改。

    首先,如果您不知道如何正确自定义 WooCommerce 模板,请阅读以下内容:
    Template Structure + Overriding Templates via a Theme

    然后现在使用下面的自定义函数来处理显示的格式化 html 价格(将价格从 4 位小数更改为 2 位小数并保留 html 标签),您将能够对 woocommerce 相关模板进行必要的更改:

    function wc_shrink_price( $price_html ){
        // Extract the price (without formatting html code)
        $price = floatval(preg_replace('/[^0-9\.,]+/', '', $price_html));
    
        // Round price with 2 decimals precision
        $shrink_price = round($price, 2); 
    
        // Replace old existing price in the original html structure and return the result
        return str_replace($price, $shrink_price, $price_html);
    }
    

    代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

    此代码已经过测试并且可以工作


    用法示例:

    33 行的 woocommerce 模板 cart/cart_totals.php 上,您有以下原始代码:
    (用于小计显示价格)

    <td data-title="<?php esc_attr_e( 'Subtotal', 'woocommerce' ); ?>"><?php wc_cart_totals_subtotal_html(); ?></td>
    

    如果你搜索 wc_cart_totals_subtotal_html() 函数,你会看到它正在使用这个 WC_Cart 方法:WC()-&gt;cart-&gt;get_cart_subtotal() ...
    所以你可以这样替换它:

    <td data-title="<?php esc_attr_e( 'Subtotal', 'woocommerce' ); ?>">
    <?php 
        // Replacement function by a WC_Cart method
        $subtotal_html_price = WC()->cart->get_cart_subtotal();
    
        // Here we use our custom function to get a formated html price with 2 decimals
        echo wc_shrink_price( $subtotal_html_price );
    ?>
    </td>
    

    如您所见,您需要对所有购物车价格执行类似的操作。
    购物车和结帐模板位于 cartcheckout 子文件夹中……
    现在是你工作的时候了!


    【讨论】:

    • 感谢您的回答,这对我帮助很大!我一回到家就会尝试这个,如果这对我有用,我会告诉你。但看起来这应该是正确的解决方案!
    • @FrédéricByarelle-Bréard 自从您提出第一个问题以来,我一直在考虑,但我没有看到其他更简单的方法……所以这会给您一些家庭作业:)
    • 是的,需要做一些功课,但这将是一些很好的经验,我已经了解了有关 woocommerce 工作原理的新知识,现在我将始终查看模板而不是寻找插件 :)
    • 主要有两种方式:第一种是钩子(动作和过滤器)……如果你不能通过使用可用的钩子来做到这一点,那么你可以覆盖模板(第二种方式)。正如您将在 WC 模板中看到的那样,您有一些可用的钩子可以在不更改这些模板的情况下进行自定义...
    • 这对我不起作用,但我又太菜鸟了,不明白接下来我要做什么。我尝试使用 WC_Cart 方法替换 cart_totals 和结帐模板中的其他功能,就像您对另一个功能所做的那样......该网站继续工作,没有任何问题,但我永远无法只显示 2 位小数......但我不敢相信没有这样的选择,必须有一种更简单的方法来做到这一点。我只是希望购物车和结帐中显示的总数有 2 位小数而不是 4 位。:(
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多