首页 > 解决方案 > 在 WooCommerce 中设置折扣的结帐输入文本字段

问题描述

我正在使用复选框字段在 WooCommerce 答案代码中添加/删除自定义费用,该代码在我的商店中完美运行,以设置折扣(负费用)

但我想使用输入字段设置费用金额。我的目标是通过 num/text 输入字段中的输入值减少购买总量。我不想使用复选框,我想使用输入或提交的数字来确定费用金额。

可能吗 ?我怎样才能做到这一点?

标签: phpjqueryajaxwordpresswoocommerce

解决方案


要在 WooCommerce 中启用设置自定义折扣的结帐输入文本字段,只需进行一些更改,如下所示:

// Display an input text field after billing fields
add_action( 'woocommerce_after_checkout_billing_form', 'add_custom_checkout_text_field', 20 );
function add_custom_checkout_text_field(){

    woocommerce_form_field( 'custom_discount', array(
        'type'  => 'text',
        'label' => __('Add a discount amount'),
        'class' => array( 'form-row-wide' ),
    ), WC()->session->get('custom_discount') );
}

// Remove "(optional)" label on checkbox field
add_filter( 'woocommerce_form_field' , 'remove_order_comments_optional_fields_label', 10, 4 );
function remove_order_comments_optional_fields_label( $field, $key, $args, $value ) {
    // Only on checkout page for Order notes field
    if( 'custom_discount' === $key && is_checkout() ) {
        $optional = '&nbsp;<span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
        $field = str_replace( $optional, '', $field );
    }
    return $field;
}

// Ajax / jQuery script
add_action( 'wp_footer', 'custom_discount_script' );
function custom_discount_script() {
    // On checkoutpage
    if( ( is_checkout() && ! is_wc_endpoint_url() ) ) :
    ?>
    <script type="text/javascript">
    jQuery( function($){
        if (typeof woocommerce_params === 'undefined')
            return false;

        $(document.body).on('input change', 'input[name=custom_discount]', function(){
            $.ajax({
                type: 'POST',
                url: woocommerce_params.ajax_url,
                data: {
                    'action': 'custom_discount',
                    'custom_discount': $(this).val(),
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                    console.log(result);
                },
            });
        });
    });
    </script>
    <?php
    endif;
}

// Get the ajax request and set value to WC session
add_action( 'wp_ajax_custom_discount', 'get_ajax_custom_discount' );
add_action( 'wp_ajax_nopriv_custom_discount', 'get_ajax_custom_discount' );
function get_ajax_custom_discount() {
    if ( isset($_POST['custom_discount']) ) {
        $discount = $_POST['custom_discount'] ? floatval($_POST['custom_discount']) : '';
        WC()->session->set('custom_discount', $discount );
        // echo WC()->session->get('custom_discount');
    }
    die();
}

// Add / Remove a custom discount
add_action( 'woocommerce_cart_calculate_fees', 'add_remove_custom_discount', 10, 1 );
function add_remove_custom_discount( $cart ) {
    // Only on checkout
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || is_cart() )
        return;

    $discount = (float) WC()->session->get('custom_discount');

    if( $discount > 0 ) {
        $cart->add_fee( __( 'Custom Discount', 'woocommerce'), -$discount );
    }
}

// Reset WC Session custom discount variable
add_action( 'woocommerce_checkout_order_created', 'reset_wc_session_custom_discount_variable' );
function reset_wc_session_custom_discount_variable( $order ) {
    if ( WC()->session->__isset('custom_discount') ) {
        WC()->session->__unset('custom_discount');
    }
}

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


推荐阅读