2
votes

I am trying to make it so the coupon field is mandatory on Woocommerce for a product category. I have tried to use the code from this answer but it only works with a set of coupon code. I need it to work with any valid coupon code.

Thank you for any help.

2
When using some existing code in a question, you should always add the answer link and thanks author. If you don't customize this existing answer code, don't add it in your question, instead just keep the link to the answer code.LoicTheAztec

2 Answers

0
votes

Try the following that will make the coupon field mandatory when a cart item from a specific product category is found:

add_action( 'woocommerce_check_cart_items', 'mandatory_coupon_code' );
function mandatory_coupon_code() {
     // Set your product categories in the array (can be term IDs, slugs or names)
    $product_categories = array( 'clothing' );

    $found = false;

    // Loop through cart items to check for the product categories
    foreach ( WC()->cart->get_cart() as $cart_item ){
        if( has_term( $product_categories, 'product_cat', $cart_item['product_id'] ) ){
            $found = true; // cart item from the product category is found
            break; // We can stop the loop
        }
    }

    // If not found we exit
    if( ! $found ) return; // exit

    $applied_coupons = WC()->cart->get_applied_coupons();

    // Coupon not applied and product category found
    if( is_array($applied_coupons) && sizeof($applied_coupons) == 0 ) {
        // Display an error notice preventing checkout
        $message = __( 'Please enter a coupon code to be able to checkout.', 'woocommerce' );
        wc_add_notice( $message, 'error' );
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works

enter image description here

0
votes

Thought I'd share my version - it adds a required checkbox field so you can specify which coupons active this message. Used a combination of the solution posted here and this one.

// Add a custom checkbox to Admin coupon settings pages
add_action( 'woocommerce_coupon_options', 'add_coupon_option_checkbox', 10 );
function add_coupon_option_checkbox() {
    woocommerce_wp_checkbox( array(
        'id'            => 'items_mandatory',
        'label'         => __( 'Force specific items', 'woocommerce' ),
        'description'   => __( 'Make this coupon mandatory for specific items.', 'woocommerce' ),
        'desc_tip'      => false,
    ) );
}


// Save the custom checkbox value from Admin coupon settings pages
add_action( 'woocommerce_coupon_options_save', 'save_coupon_option_checkbox', 10, 2 );
function save_coupon_option_checkbox( $post_id, $coupon ) {
    update_post_meta( $post_id, 'items_mandatory', isset( $_POST['items_mandatory'] ) ? 'yes' : 'no' );
}


// Force Coupon codes for Woocommerce
add_action( 'woocommerce_check_cart_items', 'mandatory_coupon_code' );
function mandatory_coupon_code() {
     // Set your product categories in the array (can be term IDs, slugs or names)
    $product_categories = array( '58');
    $applied_coupons = WC()->cart->get_applied_coupons();
    $found = false;
    
    if( sizeof($applied_coupons) > 0 ) {
        // Loop through applied coupons
        foreach( $applied_coupons as $coupon_code ) {
            $coupon = new WC_Coupon( $coupon_code );
            if( $coupon->get_meta('items_mandatory') === 'yes' ) {
                $coupon_applied = true;
                break;
            }
        }
    }
    // Loop through cart items to check for the product categories
    foreach ( WC()->cart->get_cart() as $cart_item ){
        if( has_term( $product_categories, 'product_cat', $cart_item['product_id'] ) ){
            $found = true; // cart item from the product category is found
            break; // We can stop the loop
        }
    }

    // If not found we exit
    if( ! $found ) return; // exit
    
    // Coupon not applied and product category found
    
    if( ! $coupon_applied) {
        // Display an error notice preventing checkout
        $message = __( 'The product "%s" requires a coupon for checkout.' );
        wc_add_notice( sprintf($message, $cart_item['data']->get_name() ), 'error' );
    }
}