基于 Woocommerce 中的自定义单选按钮的动态运费

2023-12-25

在 Woocommerce 中,我在结帐页面上添加了两个自定义单选按钮,单击后,我调用 ajax 函数来添加送货费。

这是我的代码:

$(document).on('change','#shipping_method_0_local_pickup5',function(e) {              
            $('.woocommerce-shipping-fields').css({
                'display': 'none'
            });

                        $("#deli").css("display","block"); 
                        var selected = $("input[type='radio'][name='post-del']:checked");
                        var selectedVal = selected.val();               
                        var pickurl= "<?php echo admin_url('admin-ajax.php');?>?action=delivery";
                        $.ajax({   
                            url: pickurl,
                            type: "POST",
                            data:{
                                input:selectedVal,                       
                            },            
                            success: function(responseText) 
                            { 
                                jQuery(".order-total .woocommerce-Price-amount").html(responseText);
                                //$(".discount_code").css("display","block"); 
                            }
                        }); 

        });

单击单选按钮时,我想在总价中添加 2 美元。

add_action( 'wp_ajax_delivery', 'delivery' );
add_action( 'wp_ajax_nopriv_delivery', 'delivery' );

function delivery()
{      
    //My code  
    do_action( 'woocommerce_cart_calculate_fees', 'prefix_add_discount_line' ); // not working
    exit;
}

注意:这是更新代码的钩子

add_action( 'woocommerce_cart_calculate_fees', 'prefix_add_discount_line' );
function prefix_add_discount_line( $cart ) {

    $discount = $cart->subtotal + 2;

    $cart->add_fee( __( 'Delivery', 'yourtext-domain' ) , +$discount );

}

你应该给所有必要的相关代码在你的问题中。请记住“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码".

因此,在下面的代码中,您将找到一个完整的工作解决方案,带有附加的自定义单选按钮,它将根据所选的单选按钮和“本地取货”运输方式动态添加送货费用。

代码(您需要在其中定义目标“本地取货”方法 ID):

// Enabling delivery options for a specific defined shipping method
function targeted_shipping_method(){
    // HERE below define the shipping method Id that enable the custom delivery options
    return 'local_pickup:5';
}

// Customizing Woocommerce checkout radio form field
add_action( 'woocommerce_form_field_radio', 'custom_form_field_radio', 20, 4 );
function custom_form_field_radio( $field, $key, $args, $value ) {
    if ( ! empty( $args['options'] ) && is_checkout() ) {
        $field = str_replace( '</label><input ', '</label><br><input ', $field );
        $field = str_replace( '<label ', '<label style="display:inline;margin-left:8px;" ', $field );
    }
    return $field;
}

// Add a custom radio fields for packaging selection
add_action( 'woocommerce_review_order_after_shipping', 'checkout_shipping_form_delivery_addition', 20 );
function checkout_shipping_form_delivery_addition(){
    $domain = 'wocommerce';

    if (  WC()->session->get( 'chosen_shipping_methods' )[0] == targeted_shipping_method() ) :

        echo '<tr class="delivery-radio"><th>' . __('Delivery options', $domain) . '</th><td>';

        $chosen = WC()->session->get('chosen_delivery');
        $chosen = empty($chosen) ? WC()->checkout->get_value('delivery') : $chosen;
        $chosen = empty($chosen) ? 'regular' : $chosen;

        // Add a custom checkbox field
        woocommerce_form_field( 'radio_delivery', array(
            'type' => 'radio',
            'class' => array( 'form-row-wide' ),
            'options' => array(
                'regular' => __('Regular', $domain),
                'premium' => __('Premium +'.wc_price(2.00), $domain),
            ),
            'default' => $chosen,
        ), $chosen );

        echo '</td></tr>';

    endif;
}

// jQuery - Ajax script
add_action( 'wp_footer', 'checkout_delivery_script' );
function checkout_delivery_script() {
    // Only checkout page
    if ( ! is_checkout() ) return;
    ?>
    <script type="text/javascript">
    jQuery( function($){
        if (typeof wc_checkout_params === 'undefined')
            return false;

        $('form.checkout').on('change', 'input[name=radio_delivery]', function(e){
            e.preventDefault();
            var d = $(this).val();
            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'delivery',
                    'delivery': d,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                    console.log(result); // just for testing | TO BE REMOVED
                },
                error: function(error){
                    console.log(error); // just for testing | TO BE REMOVED
                }
            });
        });
    });
    </script>
    <?php

}

// Get Ajax request and saving to WC session
add_action( 'wp_ajax_delivery', 'wc_get_delivery_ajax_data' );
add_action( 'wp_ajax_nopriv_delivery', 'wc_get_delivery_ajax_data' );
function wc_get_delivery_ajax_data() {
    if ( isset($_POST['delivery']) ){
        $delivery = sanitize_key( $_POST['delivery'] );
        WC()->session->set('chosen_delivery', $delivery );
        echo json_encode( $delivery ); // Return the value to jQuery
    }
    die();
}

// Add a custom dynamic delivery fee
add_action( 'woocommerce_cart_calculate_fees', 'add_packaging_fee', 20, 1 );
function add_packaging_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Only for targeted shipping method
    if (  WC()->session->get( 'chosen_shipping_methods' )[0] != targeted_shipping_method() )
        return;

    if( WC()->session->get( 'chosen_delivery' ) == 'premium' )
        $cart->add_fee( __( 'Delivery fee', 'woocommerce' ), 2.00 );
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 Woocommerce 中的自定义单选按钮的动态运费 的相关文章

  • 如何从文件中获取整个函数

    好的 我现在正在逐行阅读一个文件 我知道文件中的每个函数名称 因为它是在 XML 文档中的其他位置定义的 应该是这样的 function function name 其中 function name 是函数的名称 我从 XML 文档中获取所
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • jquery悬停一次?

    jquery 使悬停函数执行一次然后停止的方法是什么 one 不起作用 button color 2 hover function dosmth 谢谢 Hover http api jquery com hover 绑定处理程序鼠标输入 h
  • 软删除最佳实践(PHP/MySQL)

    Problem 在处理产品和订单的 Web 应用程序中 我想维护前员工 用户 与他们处理的订单之间的信息和关系 我想维护过时产品和包含这些产品的订单之间的信息和关系 然而 我希望员工能够整理管理界面 例如删除前员工 过时的产品 过时的产品组
  • Php Curl HTTP POST REQUEST 使用嵌套键值对设置自定义标头

    如何使用 Curl 在 php 中设置此标头 CustomInfo 元素是数组 嵌套键值对 AuthenticationInfo 元素是数组 嵌套键值对
  • Django Ajax ModelForm 向 request.POST 提交一个空表单

    对于 django ajax 和 jquery 我是个新手 所以如果我的问题显得微不足道 我提前道歉 我已经在这个问题上摸不着头脑有一段时间了 但我正在尝试使用 ajax 和 jquery 通过 jQuery UI 提供的模式对话框窗口提交
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • jquery 上下文菜单插件 - 右键单击​​事件类型在哪里?

    我正在研究下面插件的代码 想知道它在何时何地与 右键单击 事件相关联 它所做的只是 插件参考链接 http www javascripttoolbox com lib contextmenu http www javascripttoolb
  • PHP cURL 看不到 /etc/hosts 文件

    我在让 PHP cURL 库识别我在我的文件中创建的别名时遇到了麻烦 etc hosts file 这就是我的 etc hosts现在归档 192 168 0 20 www example dev 在另一端 192 168 0 20 Apa
  • jquery 中的函数返回未定义[重复]

    这个问题在这里已经有答案了 我在 jquery 中调用的函数返回未定义 我检查了该函数 当我对其进行调试时 它返回正确的数据 function addToPlaylist component type add to pl value pl
  • 多维数组 PHP 内爆 [重复]

    这个问题在这里已经有答案了 就我的数据结构而言 我有一个 communications 数组 每个 communications id 本身包含三部分信息 id score 和 content 我想内爆这个数组以获得逗号分隔的 id 列表
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • Laravel 5 命名约定

    我对 Laravel 约定有点困惑 因为我是这个框架的新手 我正在关注 Jeffrey Way 他使用的 Laracasts 视频Plural对于控制器名称 E g 页面控制器 卡片控制器 帖子控制器 但如果我参考官方文档Laravel g
  • 轮播滑动(未滑动)事件上的火灾事件,Bootstrap 3

    Bootstrap 2 似乎可以很好地处理幻灯片事件 请参阅这个问题 https stackoverflow com questions 9651466 how to attach slide slid events to the boot
  • Google 地图 API - 地图未显示 - 没有错误

    我正在尝试将地图从 Google API 加载到 div 中 但是 地图未加载 并且没有输出任何错误 这是代码 google maps var geocoder map function codeAddress address geocod
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • Google Apps 脚本中 $.ajax() 的服务器端等效项是什么?

    我想在 Google App 脚本中从服务器端代码执行 HTTP 请求Authorization标头 是否有用于发送 HTTP 请求的 App Script API Google Apps 脚本中的这段代码相当于什么 var api URL
  • 通过 Facebook 图 api 点赞帖子

    你好 我对 facebook PHP SDK 没有什么问题 我想通过 facebook PHP SDK 点赞帖子或其他内容 我正在执行此代码 我认为它应该是正确的 但显然它不起作用 给定的错误代码是的 PHP SDK不知道这种POST请求
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h

随机推荐

  • Android 的代码覆盖率 (calabash-android BDD)

    我正在使用测试我的 Android 应用程序葫芦安卓 https github com calabash calabash android它提供了它自己的 测试项目 以及一个重命名其包以反映测试下的应用程序的脚本 然后使用 Instrume
  • 您希望 Ruby 语言有哪些改进?

    您希望 Ruby 以及更广泛的 Ruby 社区 改进哪些方面 I read 某处 http blog hasmanythrough com 2008 6 20 recursive lambdaRuby 是 Smalltalk 和 LISP
  • 如何在不使用任何 html 标签的情况下向 html 文本添加换行符

    我想在网站上的个人资料文本中插入换行符 该网站只允许插入文本 因此我不能使用任何 html 标签 我想知道是否有任何方法可以像使用 ASCII 代码插入空格或制表符一样插入换行符 您可以设置white space to pre line 这
  • 在 Angular 2 材质的 md-grid-list 中使用 md-cards

    我是 Angular 2 材料设计的新手 我想要实现的是使用 angular2 材质创建一个网格列表并将 md cards 放入 md grid tile 中 虽然 md card 有position relative 但它们溢出了 md
  • C++ STL 向量保留

    我已经用下面的代码对 stl 矢量进行了测试 struct structA char charArray 256 structA a assign 256 characters to a charArray vector
  • 使用 MS Symbol Server 调试 .NET 代码 - VS 不显示变量值

    当我使用 NET 的 Microsoft 调试符号调试 ASP NET 网站代码时 当我调试 NET 框架代码 当然是由Microsoft Symbol Server 我告诉 VS2008 从中获取信息 Cannot obtain valu
  • ?android:attr/selectableItemBackground 在深色背景上不够明显

    在 Android Lollipop 上 我使用的是 android background android attr selectableItemBackground 当我单击按钮时获得材料动画反馈 当我有一个包含在白色 浅色布局中的按钮
  • Delphi Graphics32 相对鼠标位置(相对于图层)

    我有一个 ImgView32 它锚定到所有表单边距 表格被最大化 ImageView的位图不固定 可以是不同大小 我试图使用这个问题的代码在透明层上画一条线 在图层上画线 https stackoverflow com questions
  • Spring 3 拦截器顺序

    我有一个 Spring 3 Web 应用程序 它实现了两个拦截器 我使用一个带有 Configuration注释的配置类 代码如下 Override public void addInterceptors InterceptorRegist
  • 如何从另一个对象访问我的应用程序委托的窗口访问器方法?

    如前所述 我是 Objective C 的初级新手 但在阅读了 4 本有关该主题的实体书以及大量电子书和文档后 我仍然找不到我想要的东西 我有一个顶级内容视图控制器 想要从应用程序委托的窗口属性的物理尺寸配置其视图属性 这是几个人已经提出的
  • 追踪流星/节点光纤中的堆栈溢出

    我现在看到了这个崩溃 并且对节点光纤基础设施不够熟悉 不知道从哪里开始解释错误或检测代码 Meteor server running on http localhost 3000 W202407 10 06 05 740 8 STDERR
  • go get:忽略 Git 设置

    我正在使用 Golang 和 GitLab CI 并且我有一个 GitLab CI 配置 它非常适合 12 个项目 但不适用于第 13 个项目 我遇到的问题是我正在尝试go get一些私人存储库 其中go get尝试通过已关闭的 HTTPS
  • 带 www 或不带 www 的默认 URL 有何优缺点?

    我们需要将默认 URL 设置为唯一名称 如果是 www 则没有前缀 反之亦然 因此要做出的决定是坚持使用 www 或不使用前缀 没有为所有子域设置前缀 cookie 它还有什么其他缺点 还是好处 基本上我们需要 OpenID 这个 因为如果
  • SQL Server:对于不存在的行,用 0 填充 MAX(列)值

    我想为表中不存在的行的 MAX TIER 返回 0 到目前为止 这是我的代码 SELECT LAST YARD BAY LAST YARD ROW MAX LAST YARD TIER as MAX TIER FROM Handlift W
  • 向 SQL Server 中的存储过程添加参数

    我是新来的K2and SQL Server 我想向存储过程添加一个参数 稍后将其绑定到K2相应视图和表单的智能对象 目前它接受 1 个参数 lang 这是来自标签的输入K2智能形式视图 我添加了一个标签labelHideInactiveCo
  • 首次折叠的 K 次折叠精度较低

    我创建了一个文本分类器 并且正在尝试利用 K 折交叉验证 我不明白为什么我的第一次折叠的准确度为 55 而我的其他折叠则在 99 100 的准确度下过度拟合 我的数据集是一个 5109x2 数据框 其中列 df Features 作为特征
  • CS0120:非静态字段、方法或属性“foo”需要对象引用

    考虑 namespace WindowsApplication1 public partial class Form1 Form public Form1 InitializeComponent private void button1 C
  • 如何使用 OpenCV 从图像中裁剪和提取图章?

    我是 OpenCV 新手 我有一个 简单 的邮票图像 我已经对其进行了一些处理 如下面的代码所示 现在我遇到了裁剪图像以获得印章的问题 边缘上的点和条纹会干扰我当前识别邮票的代码 图像可能不同 因此无法修复图像的位置 Code img cv
  • 循环算法Java实现

    我认为我的问题相当简单 但我觉得我需要一些不同的视角 因为我似乎无法将这个算法转化为代码 我需要制定一个运动队赛程表 其中 n 支球队 在本例中为 10 支球队 以循环赛形式进行比赛 规则遵循基本的循环赛格式 其中一支球队在给定时间只能与另
  • 基于 Woocommerce 中的自定义单选按钮的动态运费

    在 Woocommerce 中 我在结帐页面上添加了两个自定义单选按钮 单击后 我调用 ajax 函数来添加送货费 这是我的代码 document on change shipping method 0 local pickup5 func