Personalice un campo de pago si hay cupones aplicados en WooCommerce

4 minutos de lectura

avatar de usuario
mbprouser

Necesito controlar el campo de pago de las notas del pedido si se aplica un cupón en Woocommerce: lo he intentado sin éxito.

add_action('woocommerce_applied_coupon', 'apply_product_on_coupon');
function apply_product_on_coupon( ) {
    if (WC()->cart->has_discount('test')) {
        $fields['billing']['billing_customer_note']['placeholder'] = 'You can have up to three initials';
        $fields['billing']['billing_customer_note']['label'] = 'Personalise your Tote bag';
        $fields['billing']['billing_customer_note']['required'] = true;
        $fields['billing']['billing_customer_note']['input_class'] = array('tote-bag');
    }
    return $fields;
}

Sé que el bit $fields funciona porque lo he usado en un escenario diferente. Si asumimos que el código de cupón es ‘prueba’, necesito que las notas del pedido sean obligatorias, que se cambie la etiqueta y el marcador de posición y que se apliquen algunas clases de CSS adicionales.

¿Alguna sugerencia?

  • El código de Team dolphin no se usa de la manera correcta, ya que cada vez que el cliente agrega o elimina un cupón en el proceso de pago, la página se vuelve a cargar (y el cliente perderá todos los datos ingresados ​​en los campos). Además, el campo no se valida como obligatorio si el cliente intenta realizar un pedido sin completar las notas del pedido cuando hay un cupón aplicado.

    – LoicTheAztec

    19 de marzo de 2021 a las 15:36


avatar de usuario
equipo delfín

Por favor, intente con este código. Agregue este código en el archivo functions.php de su tema activo.

verano es el nombre del código de cupón. reemplace con el nombre de su código de cupón

add_filter('woocommerce_checkout_fields', 'xa_remove_billing_checkout_field');
function xa_remove_billing_checkout_field($fields) {
    global $woocommerce;
    if (!empty(WC()->cart->applied_coupons)){
        if (in_array("summer", WC()->cart->applied_coupons)) {
            $fields['order']['order_comments']['required'] = true;
            $fields['order']['order_comments']['placeholder'] ='custom placeholder';
            $fields['order']['order_comments']['label'] = 'custom label';   
            $fields['order']['order_comments']['input_class'] = array('tote-bag');
        }
    }
    return $fields;
}

La esperanza es útil para usted. Gracias

ACTUALIZAR

Si elimina el cupón del pago, actualice la página.

function action_woocommerce_removed_coupon( $coupon_code ) { 
    if ($coupon_code == "summer") { ?>
        <script>location.reload();</script>
    <?php }
};
add_action( 'woocommerce_removed_coupon', 'action_woocommerce_removed_coupon', 10, 1 );

  • Casi. Tuve que usar mi código para mostrar las notas del pedido, pero el condicional funciona como lo necesito. Dicho esto si quito el cupón no se quitan los cambios. ¿Algunas ideas?

    – mbprouser

    19 de marzo de 2021 a las 12:05

  • Funciona si elimina el cupón eliminar del carrito

    – Equipo Delfín

    19 de marzo de 2021 a las 12:16

avatar de usuario
LoicTheAztec

Como el cliente puede agregar o eliminar un cupón en la página de Pago, se requieren jQuery y Php.

Solo si se aplica un código de cupón al pedido, el siguiente código hará que el campo de notas del pedido de pago sea obligatorio, cambiando su etiqueta y marcador de posición, y agregando la bolsa de mano como clase de selector al campo de entrada del área de texto. Manejará la validación cuando el campo sea requerido.

Utilice el siguiente código en su lugar:

add_filter('woocommerce_before_checkout_form', 'custom_order_notes_checkout_fields_js');
function custom_order_notes_checkout_fields_js($fields) {
    // Here below set your custom order notes attributes (when a coupon is applied)
    $field_label = __('custom label');
    $placeholder = __('custom placeholder');
    $label="tote-bag";

    $required    = '<abbr class="required" title="required">*</abbr>';

    wc_enqueue_js( "jQuery(function($){
        var required     = '".$required."',
            label="".$field_label."",
            placeholder="".$placeholder."",
            input_class="".$input_class."",
            class_requ   = 'validate-required',
            class_valid  = 'woocommerce-validated',
            class_unval="woocommerce-invalid woocommerce-invalid-required-field",
            notesPara="#order_comments_field",
            notesLabel   = notesPara+' label',
            notesText    = notesPara+' textarea',
            defaultLabel = $(notesText).html(),
            defaultPHold = $(notesText).attr('placeholder'),
            newLabel     = label+'&nbsp'+required;

            console.log(defaultPHold);

        if( $('tr.cart-discount').length > 0 ) {
            $(notesPara).addClass(class_requ).addClass(class_valid);
            $(notesLabel).html(newLabel);
            $(notesText).attr('placeholder', placeholder);
        }

        // On order notes change
        $(document.body).on('change input', notesText, function(){
            if( $('tr.cart-discount').length > 0 ) {
                if( $(this).val() != '' ) {
                    $(notesPara).removeClass(class_unval);
                    if ( ! $(notesPara).hasClass(class_valid) ) {
                        $(notesPara).addClass(class_valid);
                    }
                } else {
                    $(notesPara).removeClass(class_valid);
                    if ( ! $(notesPara).hasClass(class_unval) ) {
                        $(notesPara).addClass(class_unval);
                    }
                }
            }
        });

        // On coupon change
        $(document.body).on('updated_checkout', function(){
            if( $('tr.cart-discount').length > 0 ) {
                if( ! $(notesPara).hasClass(class_requ) ) {
                    $(notesPara).addClass(class_requ).addClass(class_valid);
                    $(notesLabel).html(newLabel);
                    $(notesText).addClass(input_class);
                    $(notesText).attr('placeholder', placeholder);
                }
            } else {
                if( $(notesPara).hasClass(class_requ) ) {
                    $(notesPara).removeClass(class_requ).removeClass(class_valid).removeClass(class_unval);
                    $(notesLabel).html(defaultLabel);
                    $(notesText).addClass(input_class);
                    $(notesText).attr('placeholder', defaultPHold);
                }
            }
        });
    });");
}

// Enable "Order notes" field validation for applied coupons
add_filter('woocommerce_checkout_process', 'validation_checkout_required_order_comments');
function validation_checkout_required_order_comments() {
    $applied_coupons = WC()->cart->get_applied_coupons();
    if ( ! empty($applied_coupons) && isset($_POST['order_comments']) && strlen($_POST['order_comments']) < 3 ) {
        wc_add_notice( __("Order comments is a required custom field whan a coupon is applied", "woocommerce"), 'error' );
    }
}

El código va en el archivo functions.php del tema secundario activo (o tema activo). Probado y funciona.

  • Gracias @LoicTheAztec. ¿Dónde busca el nombre del cupón en tu código?

    – mbprouser

    24 de marzo de 2021 a las 9:58

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad