Without seeing your whole it could be tricky to answer. So assuming that your code is written the way I think it is, then the error is most likely caused by the $this keyword in your custom_is_coupon_valid function. It seems like you’re attempting to call methods that exist in WooCommerce’s WC_Coupon
class. The $this keyword is used inside object context only and it refers to the calling object (the instance of the class where the method is being called). When you copy methods to a global function in functions.php, $this becomes meaningless because there’s no object context.
Here’s a revised custom_is_coupon_valid
function. Instead of using $this, we’re directly referring to the $coupon object which should be an instance of the WC_Coupon
class:
function custom_is_coupon_valid( $coupon ) {
try {
$coupon->validate_coupon_exists();
$coupon->validate_coupon_usage_limit();
$coupon->validate_coupon_user_usage_limit();
$coupon->validate_coupon_expiry_date();
$coupon->validate_coupon_minimum_amount();
$coupon->validate_coupon_maximum_amount();
$coupon->validate_coupon_product_ids();
$coupon->validate_coupon_product_categories();
$coupon->validate_coupon_excluded_items();
$coupon->validate_coupon_eligible_items();
if ( ! apply_filters( 'woocommerce_coupon_is_valid', true, $coupon, null ) ) {
throw new Exception( __( 'Coupon is not valid.', 'woocommerce' ), 100 );
}
} catch ( Exception $e ) {
$message = "Invalid coupon";
return new WP_Error(
'invalid_coupon',
$message,
array(
'status' => 400,
)
);
}
return true;
}
In your custom_show_coupons_shortcode
function, you’re calling $discounts->custom_is_coupon_valid( $coupon );
but you’ve defined custom_is_coupon_valid
as a global function, not a method within a class. So, you should call it like this: custom_is_coupon_valid( $coupon );
.
Also, in this function, you’re initializing $coupon
as new \WC_Coupon( $coupon_code );
but $coupon_code
is not defined anywhere in this context. Based on your code, I assume you’re trying to use the coupon ID, so it should be new \WC_Coupon( $coupon_id );
.
After making these changes, your code should function as expected. And make sure you’re correctly initializing and passing the $coupon
object.