WooCommerce 上的购物车总重量和运输重新计算

2024-02-06

我正在尝试使用一个片段将我的自定义盒子重量添加到总订单重量中,目前工作正常。但是,不会根据重新计算的片段重量重新计算运输方式。有什么想法如何强制重新计算运费吗?

 add_filter( 'woocommerce_cart_contents_weight', 'filter_wc_cart_contents_weight', 10000 );
function filter_wc_cart_contents_weight( $weight ) {
    //box testing sizes (kg)
    $Envelope = 2;
    $Small_parcel = 10;
    $Medium_parcel = 50;

    // Loop through cart items
    foreach(WC()->cart->get_cart() as $cart_item ) {
        $total_height += $cart_item['data']->get_height() * $cart_item['quantity'];
        }
    if( $total_height <= 8)  {
            $weight += $Envelope;
    }
    if( $total_height >= 8 && $total_height <=61)  {
            $weight += $Small_parcel;
    }
    return $weight;
}


//show calculated weight at checkout

add_action( 'woocommerce_cart_totals_after_order_total', 'display_wc_cart_total_weight_after_order_total' );
function display_wc_cart_total_weight_after_order_total() {
    ?>
    <tr class="order-total">
        <th><?php esc_html_e( 'Total weight', 'woocommerce' ); ?></th>
        <td data-title="<?php esc_attr_e( 'Total weight', 'woocommerce' ); ?>"><?php echo wc_format_weight( WC()->cart->get_cart_contents_weight() ); ?></td>
    </tr>
    <?php
}

以下方法允许在结帐时添加包裹的重量,方法是将要使用的包裹的重量除以购物车物品。这样,购物车总重量也包括箱子重量,并且运输选项可以反映实际订单总重量的正确价格。

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_weight', 10, 1 );
    
    function add_custom_weight( $cart ) {
        
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
        
        //box sizes (kg)
        $Small_envelope = 0.095;
        $Medium_envelope = 0.11;
        $Large_envelope = 0.2;
        $Small_box = 0.4;
        $Medium_box = 0.6;
        
// 

循环浏览购物车商品并获取订单中商品的总高度和最大宽度,以进行额外检查以应用适当的框(如果需要)

        foreach(WC()->cart->get_cart() as $cart_item ) {
                $total_height += $cart_item['data']->get_height() * $cart_item['quantity'];
                $temp_width = $cart_item['data']->get_width();
                if ($temp_width > $max_width){
                    $max_width = $temp_width;                   }
            $cart_items_qty += $cart_item['quantity'];
        }
        
    //Check which box should be used based on total order height
        if( $total_height <= 2.7 && $max_width < 19)  {
                $extra_weight = $Small_envelope; 
            } 
        if( $total_height > 2.7 && $total_height <=8 && $max_width < 19)  {
                $extra_weight = $Medium_envelope;
            }
        if( $total_height > 8 && $total_height <=16 && $max_width < 19)  {
                $extra_weight = $Large_envelope;
            }
        if( $total_height > 16 && $total_height <=22)  {
                $extra_weight = $Small_box;
            }
        if( $total_height > 22 && $total_height <=38)  {
                $extra_weight = $Medium_box;
            }
        
        
    //

将 $extra_weight(盒子重量)除以购物车商品数量。然后再次循环浏览购物车商品,将划分后的重量添加到每个商品中。

$xtr_weight_per_item = $extra_weight / $cart_items_qty;
            foreach ( $cart->get_cart() as $cart_item ) {
                $cart_item['data']->set_weight( $cart_item['data']->get_weight()+$xtr_weight_per_item);
            }
        }
    //

结账时显示计算重量以进行测试

    add_action( 'woocommerce_cart_totals_after_order_total', 'display_wc_cart_total_weight_after_order_total' );
    function display_wc_cart_total_weight_after_order_total() {
        ?>
        <tr class="order-total">
            <th><?php esc_html_e( 'Total weight', 'woocommerce' ); ?></th>
            <td data-title="<?php esc_attr_e( 'Total weight', 'woocommerce' ); ?>"><?php echo wc_format_weight( WC()->cart->get_cart_contents_weight() ); ?></td>
        </tr>
        <?php
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WooCommerce 上的购物车总重量和运输重新计算 的相关文章

  • DateTime::修改和夏令时切换

    Using 日期时间 修改 http php net manual en datetime modify php在 DST 边界上添加一个小时会导致它跳过一个小时 e g d new DateTime 2015 11 01 12 00 00
  • PHP 5.3 中可以使用 new 作为方法名称吗?

    我很嫉妒 Ruby 使用 new 作为方法 在 PHP 5 3 中是否可以使用命名空间来实现这一点 class Foo public function new echo Hello 如你看到的here http php net manual
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • 如何在php中正确显示另一种语言的mysql表数据

    我有一个 mySQL 表 其中一列中的数据采用英语以外的语言 波斯语 当我在表中输入数据时 它会正确显示 但是当我想在 php 文件中显示数据时 它会显示如下 好吧 我应该怎么做才能以正确的形式显示数据 由于我经常使用 非英语 字符 因此要
  • 如何获取 $node 内的 html 而不仅仅是 $nodeValue [重复]

    这个问题在这里已经有答案了 目前情况描述 我有一个装满页面的文件夹 页面文件夹 该文件夹内的每个页面 除其他外 都有一个 div id short info 我有一个代码可以提取所有 div div 从该文件夹中并使用显示其中的文本text
  • Google 应用程序引擎 - 上传的文件在谷歌云存储上不公开

    我有一个允许用户上传图像的应用程序 并且我希望其他用户能够看到该图像 我使用 CloudStorageTools createUploadUrl 方法允许用户通过 POST 上传 然后 我将上传的文件并使用 move uploaded fi
  • 如何使用 php 将 base64 解码的图像保存在文件系统中?

    我通过向我的 Web 服务发出 POST 请求来获取 Base64 编码的 JPEG 字符串 我想解码它并将其保存在文件系统中 我如何使用 PHP 5 3 来实现这一点 我能够使用 base64 decode 函数成功解码数据 如何将此解码
  • PHP ASCII 表库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个事实上的标准库用于在 PHP 中创建 ASCII 表 我想要一些 PHP 代码 当传递数组或其
  • 如何在 Laravel 5 中通过键获取所有缓存项的列表?

    Laravel 中的 Cache 类具有 get itemKey 等方法来从缓存中检索项目 以及 Remember itemKey myData1 myData2 来将项目保存在缓存中 还有一个方法可以检查缓存中是否存在某个项目 Cache
  • PHP curl exec 在 php 脚本相同域上失败

    我使用 php curl 从同一域 url 中的 php 脚本获取内容 但我收到curl exec 错误 curl 错误代码为 28 或操作超时 经过几天的调试 我发现它可以在 htm 等非脚本页面上工作 但不能在 php 上工作 如果 u
  • PHPMailer:如何将 Content-Type 设置为 multipart/alternative

    我正在使用 phpmailer 发送电子邮件 但消息的标题中带有 Content Type text html 我怎样才能将其更改为多部分 替代 它应该类似于 mail gt 我的配置是 mail new PHPMailer mail gt
  • 下拉 24 小时选项值和 12 小时显示

    我需要创建一个时间数组 以便在 HTML 下拉列表中使用 数组键应采用 24 小时格式 值应采用 12 小时制 包含 am 和 pm 在数据库中我想存储 24 小时格式 有没有一种快速的方法来创建数组而不是每小时键入 example 00
  • Woocommerce 获取产品

    我使用以下代码从我的 WordPress 网站中的 WooCommerce 获取产品类别列表
  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • 在 wampserver 2.2 上安装 php_imagick.dll PHP 扩展

    我使用的是 32 位操作系统的 Windows 7 我安装了 ImageMagick 6 8 7 Q16Link https www imagemagick org script download php windows我能够从命令行 转换
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • 从远程托管上的 PHP 获取 PHP 错误日志

    是否有 PHP 函数或其他方式以字符串形式获取 PHP 错误日志 我需要这个 因为我无法访问在其他人的服务器上运行的站点的错误日志 他提出通过电子邮件将错误日志发送给我 但这不太方便 有什么方法可以将错误日志输出到 PHP 页面吗 我意识到
  • PHP 启动:无法加载动态库 php5.4.3/ext/php_ffmpeg.dll 不是有效的 Win32 应用程序

    再会 我尝试在 Windows 7 计算机上安装 dll 文件 php ffmpeg 但不断收到此错误 29 Jan 2013 11 37 00 UTC PHP Warning PHP Startup Unable to load dyna
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 纯旧 PHP 对象 (POPO) 一词的确切含义是什么?

    我想了解一下波波 我搜索了 popo 发现它代表 Plain Old Php Object 但我不确定 Plain Old Php Object 的确切含义 我想知道什么是 popo 以及在哪里使用它 谢谢 普通旧 在此处插入语言 对象是一

随机推荐

  • 每次页面查看的成本哪个更高 - 数据库写入或文件写入?

    当您需要在应用程序中的每个页面视图上记录一些数据时 最有效的解决方案是什么 应该写入文件还是写入数据库 或者也许两者都不是 也许您应该将数据缓存在内存或文件中 并且只偶尔将其写入数据库 或文件系统 如果您使用内存缓存 如果只是记录少量数据而
  • 是否可以为组合类设置CSS?

    假设我有以下内容 tr background fff tr even background eee tr highlight background fec 是否可以指定第四个背景 fea 而不是有highlight只需覆盖even tr c
  • netBeans 图形用户界面问题

    我在 netBeans 中设计了这个 gui 它有一个 canvas 几个 JtextAreas 和一个 Jbutton 它在预览中看起来很棒 问题是当我运行实际程序时 文本区域会缩小 直到程序在其中打印一些内容 然后它们扩展到完整尺寸 J
  • jQuery 中两个按钮的功能相同

    我有两个按钮 btnAdd and btnUpdate 我为按钮编写了一个 jquery 函数btnUpdate验证网页中的某些字段 例如 function click function code here 我想做同样的事情btnAdd被点
  • kbuild 实际上是如何工作的?

    当我开发 Linux 驱动程序时 我读过如何通过此编写 linux kbuild makefiledocument https www kernel org doc Documentation kbuild makefiles txt 我知
  • HTTPS 和外部 (CDN) 托管文件?

    我有一个页面引用了几个外部托管的 javascript 文件 即 谷歌上的 jQuery http code google com apis libraries devguide html and YUI 使用 YUI 加载器 http d
  • 已编译的查询和“参数不能是序列”

    我认为编译的查询将执行与 DataContext 相同的查询转换 然而 当我尝试使用带有 Contains 方法调用的查询时 出现运行时错误 我哪里出错了 private member which holds a compiled quer
  • 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux)

    例如 我在 Windows 上发送 100000 个 UDP 数据包 对于每个数据包 我需要调用WSASendTo 一次 所以可能会引入很多系统调用开销 有没有办法进行批量发送并减少这种开销 我在谷歌搜索了一段时间后找不到适用于 Windo
  • 如何在android中像没有微调器的微调器一样弹出列表?

    我的活动中有一个微调器小部件 可让用户选择列表名称 通常 微调器的功能是在列表之间切换 但对于几个实例 我交换了选择更改侦听器以使用相同的选项列表执行不同的功能 一旦做出选择 老听众就会恢复 生活继续 这是一个糟糕且有问题的安排 相反 我想
  • 使用 connect by 子句递归插入

    我在表中有分层数据 右 按照以下方式创建层次结构 如左所示 表保存在 oracle 11g 中 TREE Hierarchy Tree Table Element Parent P0 P0 P1 P1 P0 P11 P2 P0 C111 P
  • 在 C 中执行简单 MPI 程序时集群挂起/显示错误

    我正在尝试运行一个简单的 MPI 程序 多个数组加法 它在我的 PC 中完美运行 但只是挂起或在集群中显示以下错误 我正在使用 open mpi 和以下命令来执行 集群网络配置 主节点1 MASTER eth0 Link encap Eth
  • 如何在 VB.net 中让函数运行回调

    恐怕我一直在谷歌搜索这个 但找不到我理解或可以使用的答案 在 Javascript 中 您可以运行一个函数并设置一个回调函数 该函数在第一个函数运行后调用 function doThis callBack do things do thin
  • gulp 和 karma,文件 karma.conf.js 不存在

    我有一个基本的 AngularJS 应用程序 希望让我的所有终端命令都通过 gulp 任务运行 例如 gulp dev对于开发服务器和 gulp unitTest用于测试等 我已经按照文档安装了 Gulp npm install save
  • 将驱动器号转换为分区 ID/磁盘 ID

    给定驱动器盘符 我如何获得OSImage安装到分区ID http technet microsoft com en us library ff716430 aspx and Disk ID http technet microsoft co
  • BCC 发送 PHP mail() 到邮件列表的方式与 TO 不同吗?

    我正在改进 PHP 邮件列表代码 使用mail 在循环中迭代所有订阅者 该脚本用于显示 超出最大执行时间 30 秒 错误 我通过添加解决了该错误set time limit 0 现在没有错误 但发送 100 条消息花了大约七分钟 我有什么选
  • 如何了解System.Windows.Forms.dll中System.InvalidOperationException的详细信息?

    运行我的应用程序时 我在 Visual Studio 的 输出 面板中发现了下面的异常日志 System Windows Forms dll 中发生 System InvalidOperationException 类型的第一次机会异常 该
  • 动态像素化 html 图像元素

    我要在网页上拍摄图像 然后使用 javascript 或最适合的任何内容 对其进行动态 像素化 例如 变成 20px 的正方形 然后 当用户向下滚动页面时 我需要图像的分辨率逐渐增加 直到它不再像素化 我有什么想法可以去做这件事吗 我意识到
  • PayPal Express Checkout 集成响应

    我目前很难理解我的 PayPal EC 集成的响应 GetExpressCheckoutDetails 响应是 CHECKOUTSTATUS gt PaymentActionNotInitiated 但在 DoExpressCheckout
  • WPF设计问题(自定义控件或mvvm)

    这是场景 我有一个显示一些数据的视觉效果 The data to the visual can come in one of two ways 通过用户通过键盘或鼠标输入 通过一些后端源 Both these data inputs can
  • WooCommerce 上的购物车总重量和运输重新计算

    我正在尝试使用一个片段将我的自定义盒子重量添加到总订单重量中 目前工作正常 但是 不会根据重新计算的片段重量重新计算运输方式 有什么想法如何强制重新计算运费吗 add filter woocommerce cart contents wei