首页  >  文章  >  后端开发  >  如何根据 WooCommerce Checkout 中的用户选择动态更新费用?

如何根据 WooCommerce Checkout 中的用户选择动态更新费用?

Linda Hamilton
Linda Hamilton原创
2024-10-20 18:04:31600浏览

How to Dynamically Update Fees Based on User Selections in WooCommerce Checkout?

基于 WooCommerce Checkout 中单选按钮选择的动态费用更新

开发 WooCommerce 插件时,通常需要添加动态费用结账流程。一个常见的例子是提供不同成本的不同包装选项,例如塑料袋或礼品盒。本文探讨了实现此目的的最佳方法并解决了安全注意事项。

使用 WC_Cart 进行动态费用添加

<code class="php">function at87_add_custom_fees( WC_Cart $cart ){
    $fees = 3; // fee amount
    $fees = isset($_GET['test']) ? $_GET['test'] : 3;

    $cart->add_fee( 'Emballagegebyr', intval($fees));
}</code>

此代码基于动态向购物车添加费用从 $_GET['test'] 获取的值,可以使用 JavaScript 或 Ajax 请求进行修改。但是,需要注意的是,使用 $_GET 并不安全,应谨慎使用。

基于 AJAX 的解决方案

更安全和动态的方法是使用 AJAX 更新费用。以下代码提供了完整的解决方案:

<code class="php">// Ajax script
add_action( 'wp_footer', 'checkout_shipping_packing_script' );
function checkout_shipping_packing_script() {
    if ( ! is_checkout() )
        return;

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

// Ajax request handler
add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' );
function woo_get_ajax_data() {
    if ( isset($_POST['packing']) ){
        $packing = sanitize_key( $_POST['packing'] );
        WC()->session->set('chosen_packing', $packing );
        echo json_encode( $packing );
    }
    die(); // Alway at the end (to avoid server error 500)
}</code>

此代码利用 Ajax 将选定的打包选项发送到服务器,然后服务器将其保存在 WooCommerce 会话中。结帐动态更新,无需刷新页面。

结论

基于 Ajax 的方法提供了一种安全高效的方法来根据用户动态更新费用WooCommerce 结账流程中的选择。它消除了对 $_GET 的需求,并确保流畅、安全的结账体验。

以上是如何根据 WooCommerce Checkout 中的用户选择动态更新费用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn