我如何在Woocommerce中设置某些产品只能运送到某些国家?例如,在 checkout 过程中,如果Country不是USA,我希望显示消息"We cannot deliver to your country."
Country
USA
"We cannot deliver to your country."
5gfr0r5j1#
这主要可以通过在woocommerce_package_rates filter钩子中钩子的自定义函数来完成。下面的代码将允许您根据定义的国家/地区代码禁用特定产品ID或特定产品类别 (您可以选择) 的配送。您必须在第一个功能中添加您的设置。代码:
woocommerce_package_rates
// HERE your settings - Utility function function your_country_shipping_settings(){ $results = array(); // Can be based on "Product IDs" (or "Product categories" ==> false) $results['type'] = true; // or false // Allowed countries (Only compatible country codes - 2 digits) $results['countries'] = array( 'US', 'CA' ); if( $results['type'] ){ // Restricted product IDs $results['matching'] = array( 37, 38 ); } else { // Restricted product categories (IDs, Slugs or Names) $results['matching'] = array('t-shirts', 'sweet-shirts' ); } // Message $results['message'] = __( "can not be delivered to your country.", "woocommerce" ); return $results; } // Utility function that check cart items function get_items_names( $matching, $package, $type ){ $product_names = array(); // Search in cart items foreach( $package['contents'] as $item ){ if( $type ){ if( in_array( $item['data']->get_id(), $matching ) ) $product_names[] = $item['data']->get_name(); } else { if( has_term( $matching, 'product_cat', $item['product_id'] ) ) $product_names[] = $item['data']->get_name(); } } return $product_names; } // Conditionally disabling shipping methods add_filter('woocommerce_package_rates','custom_country_shipping_rules', 10, 2 ); function custom_country_shipping_rules( $rates, $package ){ if( isset($package['destination']['country']) && isset($package['contents']) ){ // Load your settings $data = your_country_shipping_settings(); // If matching allowed countries ==> We Exit if( in_array( $package['destination']['country'], $data['countries'] ) ) return $rates; // Exit $product_names = get_items_names( $data['matching'], $package, $data['type'] ); // When product match we Remove all shipping methods if( count($product_names) > 0 ){ // Removing all shipping methods foreach( $rates as $rate_id => $rate ) unset( $rates[$rate_id] ); } } return $rates; } // Conditionally displaying a shipping message add_filter('woocommerce_cart_no_shipping_available_html','custom_country_shipping_notice', 10, 1 ); add_filter('woocommerce_no_shipping_available_html','custom_country_shipping_notice', 10, 1 ); function custom_country_shipping_notice( $html ){ $package = WC()->shipping->get_packages()[0]; if( isset($package['destination']['country']) && isset($package['contents']) ){ // Load your settings $data = your_country_shipping_settings(); // If matching allowed countries ==> We Exit if( in_array( $package['destination']['country'], $data['countries'] ) ) return $html; // Exit $product_names = get_items_names( $data['matching'], $package, $data['type'] ); if( count($product_names) > 0 ){ $text = '"' . implode( '", "', $product_names ) . '" ' . $data['message']; $html = wpautop( $text ); } } return $html; }
测试和工程。当购物车项目与您的设置匹配时,如果客户位于定义的国家/地区以外的其他国家/地区,他将获得类似以下内容:在购物车页面上:
在 checkout 页面上:
1条答案
按热度按时间5gfr0r5j1#
这主要可以通过在
woocommerce_package_rates
filter钩子中钩子的自定义函数来完成。下面的代码将允许您根据定义的国家/地区代码禁用特定产品ID或特定产品类别 (您可以选择) 的配送。
您必须在第一个功能中添加您的设置。
代码:
测试和工程。
当购物车项目与您的设置匹配时,如果客户位于定义的国家/地区以外的其他国家/地区,他将获得类似以下内容:
在购物车页面上:
在 checkout 页面上: