Dudikowski
Dudikowski

Reputation: 110

WooCommerce conditionally show order comments and make it required

On Checkout page, I would like to show the comment field, only if a coupon code is applied. In this case this comment field should be a required field.

The example below works except for the required status to optional.

I made the comments required as a default and then I assumed that after unsetting them the required status would be ignored.

This is the snippet that makes the comments required:

$fields['order']['order_comments']['required'] = true;

This snippet looks for a coupon code and then shows a message. I dont need the message so I left that blank, and then I added the lines that hides the comments:

add_action( 'woocommerce_before_checkout_form' , 'product_checkout_custom_content' );

function product_checkout_custom_content() {
global $woocommerce;

$msgs = array('mycouponcode'=>'');

$applied_coupon = $woocommerce->cart->applied_coupons;
    if( ! array_key_exists($applied_coupon[0], $msgs) ) {

// Hides the order comments    
        unset( $fields['order']['order_comments'] );
        add_filter( 'woocommerce_enable_order_notes_field', '__return_false' );

// Here I need to make the order_comments optional, not required

//          echo $msgs[$applied_coupon[0]];
    }
}

How can I make the order comments optional within the same action?

Upvotes: 1

Views: 2566

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 254388

To make that work, you don't need function product_checkout_custom_content(). Instead you have to make some change in the function where is included $fields['order']['order_comments']['required'] = true;.

I suppose that is a function hooked in woocommerce_checkout_fields. So in that function you will have to replace $fields['order']['order_comments']['required'] = true;, by the code inside the function:

// CHECKOUT PAGE - CUSTOMIZING comment field (conditional behavior).
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {

    //Set your coupon slug here:
    $coupon = 'coupon_slug';
    // Coupon is applied: Changing Comment field Label, placeholder and setting "REQUIRED"
    if ( in_array( '$coupon, WC()->cart->applied_coupons ) ){ 
        $fields['order']['order_comments']['label'] = __('Your comment label…', 'my_theme_slug');
        $fields['order']['order_comments']['placeholder'] = __('Enter here something', 'my_theme_slug');
        $fields['order']['order_comments']['required'] = true;
    } else {
        // Removes the comment field + block title
        unset($fields['order']['order_comments']);
        add_filter( 'woocommerce_enable_order_notes_field', '__return_false' );
    }

    return $fields;

}

You don't need anything else…

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

This code is tested and works.

Reference: Remove the Additional Information and Order Notes fields in WooCommerce

Upvotes: 3

Related Questions