Maks
Maks

Reputation: 1

How to make shipping method allow or disallow for other conditions to work in WooCommerce?

I need to make WooCommerce allow checkout only when products of certain categories are added to cart. I have already a working code for that. But I need to make this code aplly only when chosen shipping method is other than in store pickup. Any tips how to do that?

Here's the code I use to require certain products to be added to cart:

`

`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' );


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;
}

Upvotes: 0

Views: 233

Answers (1)

Bhautik
Bhautik

Reputation: 11282

You need to get current choesen method. You can use the WC()->session->get('chosen_shipping_methods') to get current choesen method.

Add below condition to your sv_wc_is_category_alone_in_cart() function.

if( WC()->session->get('chosen_shipping_methods')[0] == 'your-shipping-method-name' ){
    return false;
}

Try the below code.

function sv_wc_prevent_checkout_for_category() {

    // set the slug of the category for which we disallow checkout
    $category = 'test-1';

    // 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' );


function sv_wc_is_category_alone_in_cart( $category ) {

    if( WC()->session->get('chosen_shipping_methods')[0] == 'local_pickup:8' ){
        return false;
    }
        
    // 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;
}

Tested and working. I have tested this code with my product category and shipping method so don't forget to change value with yours.

Upvotes: 1

Related Questions