Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bekarice/99d479e6c91880b3b80a21a0b3415b7f to your computer and use it in GitHub Desktop.
Save bekarice/99d479e6c91880b3b80a21a0b3415b7f to your computer and use it in GitHub Desktop.
Prevents checkout if the WooCommerce cart only contains items from a specific category
<?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 &ndash; 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;
}
@nafanoul
Copy link

If i want to change the behavior at checkout as seen on line 22-27, how do I do that? I want to redirect to a different URL. I have tried replacing 22-27 with;
if ( sv_wc_is_category_alone_in_cart( $category ) ) {

	// render a notice to explain why checkout is blocked
	wp_redirect( 'example.com' );
		exit();
	
}

However it doesnt seem to work. Im new at this so any help would be appreciated

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment