From f2244ec0d86912be1e0af630e31734cc7805f86d Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Wed, 4 Mar 2026 20:50:38 -0500 Subject: [PATCH 1/3] Skip auto-applying discount when product requirements aren't met When Sitewide Sales auto-applies an EDD discount, check if the cart contents satisfy the discount's product requirements first. If not (e.g., lifetime products in cart with an annual-only discount), silently skip applying rather than letting EDD reject it with a confusing error. Uses EDD's own is_product_requirements_met(false) to check without setting error messages in the session. Fixes #183 --- modules/ecommerce/edd/class-swsales-module-edd.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ecommerce/edd/class-swsales-module-edd.php b/modules/ecommerce/edd/class-swsales-module-edd.php index 62dedcc..043c155 100644 --- a/modules/ecommerce/edd/class-swsales-module-edd.php +++ b/modules/ecommerce/edd/class-swsales-module-edd.php @@ -299,8 +299,13 @@ public static function automatic_coupon_application() { $code = new \EDD_Discount( $discount_code_id ); if ( !empty( $code ) && empty( $_REQUEST['discount'] ) ) { + // Skip if the discount's product requirements aren't met for the current cart. + if ( edd_get_cart_contents() && ! $code->is_product_requirements_met( false ) ) { + return; + } + //Set it in the $_REQUEST and EDD Session as the EDD init runs at priority 0 - $_REQUEST['discount'] = $code->code; + $_REQUEST['discount'] = $code->code; EDD()->session->set( 'preset_discount', $code->code ); } } From 97b2a64c25f7c3a0232b386151b91c25430f8ff1 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Fri, 6 Mar 2026 17:43:59 -0500 Subject: [PATCH 2/3] fix(edd): Only check discount product requirements at checkout The product requirements check was preventing the discount from being set in the session on product pages. Restrict the check to the checkout page so sale pricing still displays on product pages. - Add edd_is_checkout() guard before product requirements check - Fixes regression from f2244ec --- modules/ecommerce/edd/class-swsales-module-edd.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ecommerce/edd/class-swsales-module-edd.php b/modules/ecommerce/edd/class-swsales-module-edd.php index 043c155..e310bb0 100644 --- a/modules/ecommerce/edd/class-swsales-module-edd.php +++ b/modules/ecommerce/edd/class-swsales-module-edd.php @@ -299,8 +299,8 @@ public static function automatic_coupon_application() { $code = new \EDD_Discount( $discount_code_id ); if ( !empty( $code ) && empty( $_REQUEST['discount'] ) ) { - // Skip if the discount's product requirements aren't met for the current cart. - if ( edd_get_cart_contents() && ! $code->is_product_requirements_met( false ) ) { + // At checkout, skip if the discount's product requirements aren't met for the current cart. + if ( edd_is_checkout() && edd_get_cart_contents() && ! $code->is_product_requirements_met( false ) ) { return; } From 4f517f7737ac7b61378b62d31d603de13952ee90 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Wed, 11 Mar 2026 16:44:41 -0400 Subject: [PATCH 3/3] fix(edd): Remove auto-applied discount when cart has ineligible products When a sitewide sale discount was auto-applied during browsing (empty cart), it persisted in the EDD session. If the customer then added a Lifetime product and went to checkout, the stale discount caused checkout to fail. Now checks product requirements on every page load (not just checkout) and actively removes the discount from both cart_discounts and preset_discount when requirements aren't met. Strike-through pricing on product pages is unaffected since it calculates directly from the EDD_Discount object without using the session. --- modules/ecommerce/edd/class-swsales-module-edd.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/ecommerce/edd/class-swsales-module-edd.php b/modules/ecommerce/edd/class-swsales-module-edd.php index e310bb0..158d9c1 100644 --- a/modules/ecommerce/edd/class-swsales-module-edd.php +++ b/modules/ecommerce/edd/class-swsales-module-edd.php @@ -299,8 +299,11 @@ public static function automatic_coupon_application() { $code = new \EDD_Discount( $discount_code_id ); if ( !empty( $code ) && empty( $_REQUEST['discount'] ) ) { - // At checkout, skip if the discount's product requirements aren't met for the current cart. - if ( edd_is_checkout() && edd_get_cart_contents() && ! $code->is_product_requirements_met( false ) ) { + // If there's a cart, check product requirements before applying. + if ( edd_get_cart_contents() && ! $code->is_product_requirements_met( false ) ) { + // Remove the discount if it was previously applied (e.g., before a Lifetime product was added to cart). + edd_unset_cart_discount( $code->code ); + EDD()->session->set( 'preset_discount', null ); return; }