避免在 Woocommerce 中结帐特定国家/地区的特定产品

Dan*_*eer 1 php country wordpress cart woocommerce

这就是我想要做的:
如果客户选择加拿大作为发货国家/地区,并且购物车中有特定产品,则不应进行结账,并且应生成一条错误消息,通知客户为何未进行结账。

我的研究:
添加或删除 woocommerce 错误消息包含生成 WooCommerce 错误消息的代码。我昨天问了一个问题,它给了我代码来检查某些产品是否在购物车中,以及运送国家/地区是否设置为加拿大当特定产品在 Woocommerce 上的购物车中时,从国家/地区列表中删除加拿大我不确定我必须挂钩哪个过滤器/操作代码,以便每当在结帐页面上单击“下订单”时它都会运行。

更新:所以我尝试结合我在研究 中列出的两个代码,但它不起作用。如果我需要以不同的方式处理此问题,任何帮助都将非常感激
产品 ID 是 15631 和 12616

Loi*_*tec 5

woocommerce_check_cart_items这可以通过此自定义函数使用操作挂钩来完成:

add_action( 'woocommerce_check_cart_items', 'products_not_shipable_in_canada' );
function products_not_shipable_in_canada() {
    // Only on checkout page (allowing customer to change the country in cart shipping calculator)
    if( ! is_checkout() ) return;

    // Set your products
    $products = array(15631, 12616);

    // Get customer country
    $country = WC()->session->get('customer')['shipping_country'];
    if( empty($country) ){
        $country = WC()->session->get('customer')['billing_country'];
    }
    // For CANADA
    if( $country == 'CA' ){
        // Loop through cart items
        foreach( WC()->cart->get_cart() as $item ){
            // IF product is in cart
            if( in_array( $item['product_id'], $products ) ){
                // Avoid checkout and display an error notice
                wc_add_notice( sprintf( 
                    __("The product %s can't be shipped to Canada, sorry.", "woocommerce" ),  
                    '"' . $item['data']->get_name() . '"'
                ), 'error' );
                break; // Stop the loop
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或活动主题)的 function.php 文件中。经过测试并有效。

在此输入图像描述

相关:在 WooCommerce 中设置特定国家/地区的最小允许重量