I have a question regarding shipping restrictions in WooCommerce. My client is selling a product with 4 variants.

Out of the 4 variants, only 1 can be shipped internationally and the other 3 can't. The expected outcome is that if the customer selects the variant that is able to ship internationally then ok if any of the other 3 are selected/in the cart then not.

Is there a way I can set this up? So far I have tried the conditional shipping module for WooCommerce but could not get it working.

Any help would be appreciated.


This is something complicated… What you could do instead is to check cart items for allowed shipping countries, displaying an error notice and avoiding checkout when the customer country doesn't match with the allowed country for all other product variations.

Below define the allowed shippable Variation ID (international) and the allowed base country code for your other product variations:

add_action( 'woocommerce_check_cart_items', 'check_cart_items_for_shipping' );
function check_cart_items_for_shipping() {
    $allowed_variation_id = '513'; // Here defined the allowed Variation ID
    $allowed_country      = 'US'; // Here define the allowed shipping country for all variations

    $shipping_country = WC()->customer->get_shipping_country();
    $countries        = WC()->countries->get_countries();

    // Loop through cart items
    foreach(WC()->cart->get_cart() as $cart_item ) {
        // Check cart item for defined product Ids and applied coupon
        if( $shipping_country !== $allowed_country && $cart_item['variation_id'] !== $allowed_variation_id ) {
            wc_clear_notices(); // Clear all other notices

            // Avoid checkout displaying an error notice
            wc_add_notice( sprintf( __('The product "%s" can not be shipped to %s.'),
            ), 'error' );
            break; // stop the loop

Code goes in functions.php file of your active child theme (or active theme). Tested and works.

enter image description here

  • Am I able to not hardcode the variation_id and somehow flag the products differently? Or do i need to hardcode each of the IDs? Is it possible to use a product attribute for that? – Klettseb May 20 '19 at 4:59
  • @Klettseb Product attribute are not made for that… To not hardcore specifics variation IDs, there is many ways on each related product variation, as: 1) a custom field, 2) a specific shipping class… But this is another question and should be asked as a new question. If this answer answers your question, you could please accept the answer, Thank you. – LoicTheAztec May 20 '19 at 7:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.