当前位置: 首页 > 知识库问答 >
问题:

根据WooCommerce结账中的复选框添加或删除固定费用

昌山
2023-03-14

使用基于WooCommerce结帐应答代码中的选择字段添加动态费用,我成功地在复选框更改中添加了新费用:

add_action('woocommerce_after_checkout_billing_form', 'checkout_shipping_form_packing_addition', 20);
function checkout_shipping_form_packing_addition()
{
    $domain = 'woocommerce';

    echo '<tr class="packing-select"><th>' . __('EMBRULHO?', $domain) . '</th><td>';

    $chosen   = WC()->session->get('chosen_packing');

    // Add a custom checkbox field
    woocommerce_form_field('chosen_packing', array(
        'type'      => 'checkbox',
        'class'     => array('form-row-wide packing'),
        'label'         => __('$5', 'woocommerce'),
        'required'  => false,
    ), $chosen);

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

// jQuery - Ajax script
add_action('wp_footer', 'checkout_shipping_packing_script');
function checkout_shipping_packing_script()
{
    // Only checkout page
    if (is_checkout() && !is_wc_endpoint_url()) :

        WC()->session->__unset('chosen_packing');
?>
        <script type="text/javascript">
            jQuery(function($) {
                $('form.checkout').on('change', 'input#chosen_packing', function() {
                    var p = $(this).prop('checked');    
                    console.log(p);
                    $.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
    endif;
}

// Php Ajax (Receiving request and saving to WC session)
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)
}

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

    $domain      = "woocommerce";

    if(WC()->session->get('chosen_packing')){
        $label = __('Embrulho', $domain);
        $cost = 5;
    }
    if (isset($cost))
        $cart->add_fee($label, $cost);
}

未选中时,如何删除费用?

这是一个礼品包装选项,如果选择额外的费用将在结账时添加到总额中。如果未选择,则应删除费用并更新结账。

共有1个答案

黄靖
2023-03-14

您只需在代码中做一些小更改,如:

add_action('woocommerce_after_checkout_billing_form', 'checkout_shipping_form_packing_addition', 20);
function checkout_shipping_form_packing_addition()
{
    $domain = 'woocommerce';

    echo '<tr class="packing-select"><th>' . __('EMBRULHO?', $domain) . '</th><td>';

    $chosen   = WC()->session->get('chosen_packing');

    // Add a custom checkbox field
    woocommerce_form_field('chosen_packing', array(
        'type'      => 'checkbox',
        'class'     => array('form-row-wide packing'),
        'label'         => __('$5', 'woocommerce'),
        'required'  => false,
    ), $chosen);

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

// jQuery - Ajax script
add_action('wp_footer', 'checkout_shipping_packing_script');
function checkout_shipping_packing_script()
{
    // Only checkout page
    if (is_checkout() && !is_wc_endpoint_url()) :
    ?>
    <script type="text/javascript">
        jQuery(function($) {
            $('form.checkout').on('change', 'input#chosen_packing', function() {
                $.ajax({
                    type: 'POST',
                    url: wc_checkout_params.ajax_url,
                    data: {
                        'action': 'woo_get_ajax_data',
                        'packing': $(this).prop('checked') ? 1 : 0,
                    },
                    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
    else:
    WC()->session->__unset('chosen_packing');
    endif;
}

// Php Ajax (Receiving request and saving to WC session)
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)
}

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

    if( WC()->session->get('chosen_packing') ){
        $label = __('Embrulho', 'woocommerce');
        $cost = 5;
        $cart->add_fee($label, $cost);
    }
}

代码进入活动子主题(或活动主题)的functions.php文件。测试和工作。

 类似资料:
  • 我使用更新费动态基于单选按钮在WooCommerce结账答案代码解决方案,工作非常好,我添加复选框字段与不同的价格为每一个,价格变化反映在结账。 但是我需要一些帮助:当我选择一种附加税的包装时,它会出现在订单区的后端,但只显示价格,我也想显示标题。 复选框选项有: 如何使其在订单上显示名称?是否可以将复选框改为选择字段?

  • 在Woocommerce结帐页面中,我正在尝试在结帐页面上添加一个复选框 我参考了这些文章 WooCommerce自定义结账字段添加费用订购ajax 用于在WooCommerce中添加/删除自定义费用的复选框字段 添加一个结帐复选框字段,在WooCommerce中启用百分比费用 它不能像我希望的那样工作。我做错了什么? 任何帮助都很感激。

  • 需要根据表单复选框元素添加自定义费用到购物车。基于购物车中产品类别的当前操作非常有效,并增加了自定义送货费,但客户可以选择免费提货。复选框选中交付触发器WooCommerce可以添加自定义费用操作吗? 使用例子从"执行一个动作对复选框选中或未选中的事件在html表单"可以. Change(函数)函数传递(id){如果(this.checked){add_action自定义购物车费用? 选中复选框时

  • 我正在尝试根据是否已选中自定义复选框向签出添加费用。我真的很接近让这项工作,但我有问题获得后的价值观,以确定是否应申请或不收费。 以下是我自定义字段的代码: 这是可行的,而且字段显示得非常完美。 在我的主题中form-checkout.php的底部,我添加了以下javascript,以在检查字段时更新购物车总数: 这将更新订单总数并运行以下代码(这就是问题所在): 我知道这部分被调用是因为如果我去

  • 我目前有以下情况: 我有多个复选框,一旦单击任何复选框,它的值将添加到数组中。如果未选中该复选框,则需要再次将该项从数组中删除。 以下操作有效,并将它们添加到我的中。但当再次选中该复选框时,它不会被删除。当然,我可以使用

  • 我正试图在结帐时将定制费用计入订单总额。我在woocommerce中添加了一个复选框 包含一个自定义js文件,可用于处理事件 和一个php费用处理函数 由于某些原因,$_POST['state']的值没有被添加,当我给出一个硬编码值时,函数会工作,我尝试了很多选项,但无法让它工作。 我看过类似的帖子,但没有一个有答案。