Forked from bekarice/wc-prevent-checkout-for-cart-with-specific-category.php
Created
December 22, 2021 06:47
-
-
Save Attaulla9/9dd3afb997dc38d55d2d62a31556fc5d to your computer and use it in GitHub Desktop.
Prevents checkout if the WooCommerce cart only contains items from a specific category
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php // only copy this line if needed | |
/** | |
* Renders a notice and prevents checkout if the cart | |
* only contains products in a specific category | |
*/ | |
function sv_wc_prevent_checkout_for_category() { | |
// set the slug of the category for which we disallow checkout | |
$category = 'clothing'; | |
// get the product category | |
$product_cat = get_term_by( 'slug', $category, 'product_cat' ); | |
// sanity check to prevent fatals if the term doesn't exist | |
if ( is_wp_error( $product_cat ) ) { | |
return; | |
} | |
$category_name = '<a href="' . get_term_link( $category, 'product_cat' ) . '">' . $product_cat->name . '</a>'; | |
// check if this category is the only thing in the cart | |
if ( sv_wc_is_category_alone_in_cart( $category ) ) { | |
// render a notice to explain why checkout is blocked | |
wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category – you must purchase a product from another category to check out.', $category_name ), 'error' ); | |
} | |
} | |
add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' ); | |
/** | |
* Checks if a cart contains exclusively products in a given category | |
* | |
* @param string $category the slug of the product category | |
* @return bool - true if the cart only contains the given category | |
*/ | |
function sv_wc_is_category_alone_in_cart( $category ) { | |
// check each cart item for our category | |
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { | |
// if a product is not in our category, bail out since we know the category is not alone | |
if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) { | |
return false; | |
} | |
} | |
// if we're here, all items in the cart are in our category | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment