首页 > 解决方案 > 仅向来自 CA 的客户添加捐赠复选框

问题描述

我正在尝试根据他们的输入/过去的送货地址仅为加拿大客户设置一个捐赠复选框。仅当发货国家/地区为加拿大时,才应显示该复选框。有什么办法可以做到这一点?

add_action( 'woocommerce_before_checkout_billing_form', 'git_box' ); 
    function gift_box ( $checkout ) {
             echo '<div id="message_fields">';
    woocommerce_form_field( 'add_gift_box', array(
        'type'          => 'checkbox',
        'class'         => array('add_gift_box form-row-wide'),

        'label'         => __('Add Donation to the site? ($2)'),
        'placeholder'   => __(''),
        ), $checkout->get_value( 'add_gift_box' ));
        echo '</div>';
}
add_action( 'wp_footer', 'woocommerce_add_gift_box' );
function woocommerce_add_gift_box() {
    if (is_checkout()) {
    ?>
    <script type="text/javascript">
    jQuery( document ).ready(function( $ ) {
        $('#add_gift_box').click(function(){
            jQuery('body').trigger('update_checkout');
        });
    });
    </script>
    <?php
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
        if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
        return;
    }

    if ( isset( $_POST['post_data'] ) ) {
        parse_str( $_POST['post_data'], $post_data );
    } else {
        $post_data = $_POST; 
    }

    if (isset($post_data['add_gift_box'])) {
         $extracost = 2.65;
        WC()->cart->add_fee( 'Site Donation:', $extracost );
    }

}

标签: wordpressfor-loopif-statementwoocommerce

解决方案


你在正确的轨道上,但你尝试的有点太简单了;-) 这是我测试过的版本。Show/Hide get's triggered on document load and on billing country change,然后取消选中复选框以防新选择的国家/地区不是 CA。

1)添加复选框

add_filter( 'woocommerce_checkout_fields' , 'add_donate_field' );
function add_donate_field( $fields ) {
    $fields['order']['order_donate'] = array(
        'type' => 'checkbox',
        'label' => 'Add Donation to the site? ($2)',
        'required' => false,
        'class' => array('donation form-row-wide hidden')
    );
    return $fields;
}

2)添加 Show hide + Ajax 功能(样式可以去其他地方,只是在这里添加,所以它开箱即用)

add_action( 'wp_footer', 'woocommerce_donate_field_js' );
function woocommerce_donate_field_js() {
    if (is_checkout()) {
        ?>
        <style> .donation.hidden { display: none; }</style>
        <script type="text/javascript">

            jQuery(function($){
                var donatefield = '.donation',
                    donatebox = 'input[name=order_donate]',
                    bc = 'select#billing_country',
                    donate_enabled_countries = ['CA'],
                    donate = '0';

                // Show/Hide the donate field
                function showHideDonate(){
                    if (jQuery.inArray( $(bc).val(), donate_enabled_countries) === -1){
                        if ( ! $(donatefield).hasClass('hidden') ) {
                            $(donatebox).prop('checked',false).trigger('change');
                            $(donatefield).addClass('hidden');
                        }
                    } else {
                        $(donatefield).removeClass('hidden');
                    }
                }
                $(bc).change(showHideDonate);
                $(document).ready(showHideDonate);

                // Send donate field value to AJAX
                $('form.checkout').on('change', donatebox, function(e){
                    e.preventDefault();
                    if ($(this).is(":checked")) { donate = '1'; } else { donate = '0'; }
                    $.ajax({
                        type: 'POST',
                        url: wc_checkout_params.ajax_url,
                        data: {
                            'action': 'woo_get_ajax_data',
                            'donate': donate,
                        },
                        success: function (result) {
                            $('body').trigger('update_checkout');
                        }
                    });
                });
            });
        </script>
        <?php
    }
}

3) 获取 AJAX 数据

add_action( 'wp_ajax_woo_get_ajax_data', 'checkout_donate_choice_set_session' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'checkout_donate_choice_set_session' );
function checkout_donate_choice_set_session() {
    if ( isset($_POST['donate']) ){
        $donate = sanitize_key( $_POST['donate'] );
        WC()->session->set('donate', $donate );
        echo json_encode( $donate );
    }
    die();
}

4) 更新购物车

add_action( 'woocommerce_cart_calculate_fees', 'woocommerce_donate_fee' );
function woocommerce_donate_fee( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    $donate = WC()->session->get( 'donate' );
    $donation = 2; // Donation amount
    $test = 0; // just for testing can be removed
    if ($donate === '1') {
        $cart->add_fee( __('Donation', 'woocommerce'), $donation );
    } else { // can be removed as well
        $cart->add_fee( __('No Donation', 'woocommerce'), $test );
    }
}

推荐阅读