phpwordpresswoocommercecartcoupon

Limit a WooCommerce coupon code to defined weekday only


I would like to restrict a coupon code "XYZ" usage only for defined weekdays, from Monday to Thursday only. For other days (friday to sunday) it will show an error notice.

Is it possible? How can I achieve that?

Thanks


Solution

  • Here is a complete solution with 2 hooked functions that will restrict coupon usage for your defined week days and will display a custom error notice if coupon is not valid.

    1) Checking "defined days" coupon validity:

    add_filter( 'woocommerce_coupon_is_valid', 'coupon_week_days_check', 10, 2);
    function coupon_week_days_check( $valid, $coupon ) {
    
        // Set HERE your coupon slug   <===  <===  <===  <===  <===  <===  <===  <===  <===  <===  
        $coupon_code_wd = 'xyz';
        // Set HERE your defined invalid days (others: 'Mon', 'Tue', 'Wed' and 'Thu')  <===  <===
        $invalid_days = array('Fri', 'Sat', 'Sun');
    
        $now_day = date ( 'D' ); // Now day in short format
    
        // WooCommerce version compatibility
        if ( version_compare( WC_VERSION, '3.0', '<' ) ) {
            $coupon_code = strtolower($coupon->code); // Older than 3.0
        } else {
            $coupon_code = strtolower($coupon->get_code()); // 3.0+
        }
    
        // When 'xyz' is set and if is not a week day we remove coupon and we display a notice
        if( $coupon_code_wd == $coupon_code && in_array($now_day, $invalid_days) ){
            // if not a week day
            $valid = false;
        }
        return $valid;
    }
    

    2) Displaying custom error message for "defined days" coupon if not valid:

    add_filter('woocommerce_coupon_error', 'coupon_week_days_error_message', 10, 3);
    function coupon_week_days_error_message( $err, $err_code, $coupon ) {
    
        // Set HERE your coupon slug   <===  <===  <===  <===  <===  <===  <===  <===  <===  <===  
        $coupon_code_wd = 'xyz';
        // Set HERE your defined invalid days (others: 'Mon', 'Tue', 'Wed' and 'Thu')  <===  <===
        $invalid_days = array('Fri', 'Sat', 'Sun');
    
        $now_day = date ( 'D' ); // Now day in short format
    
        // WooCommerce version compatibility
        if ( version_compare( WC_VERSION, '3.0', '<' ) ) {
            $coupon_code = strtolower($coupon->code); // Older than 3.0
        } else {
            $coupon_code = strtolower($coupon->get_code()); // 3.0+
        }
    
        if( $coupon_code_wd == $coupon_code && intval($err_code) === WC_COUPON::E_WC_COUPON_INVALID_FILTERED && in_array($now_day, $invalid_days) ) {
            $err = __( "Coupon $coupon_code_wd only works on weekdays and has been removed", "woocommerce" );
        }
        return $err;
    }
    

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

    This working code is tested on WooCommerce versions 2.6.x and 3.0+.