首页 > 解决方案 > 如果 WooCommerce 购物车中有特定产品,则强制“运送到不同地址”

问题描述

当特定产品在结帐时,我正在尝试添加一个片段以激活默认打开的“运送到其他地址”。
我在 Woocommerce相关的回答线程中找到了为特定产品启用“运送到不同地址”复选框,它运行良好!

但是,不能取消选中“运送到其他地址”复选框。如果结账时有特定产品,则需要提供不同的送货地址。

目标:将这些特定产品的“运送到其他地址”复选框设为灰色。

我只是更改了代码 $products_ids = array(10800, 11907);以满足我的需求。

我已经尝试解开该功能,但整个代码不起作用。因此,我正在寻找使该复选框变灰但保持上述代码完全正常工作的最佳方法。

标签: phpjquerywordpresswoocommercecheckout

解决方案


当购物车中有产品时,您可以将自定义类添加到结帐正文标签。

因此,使用 CSS 规则,您可以隐藏“运送到其他地址?” 复选框。

使用这个答案:

您可以获取代码并创建一个新的自定义函数(返回与以前相同的结果,该函数除了产品 id 没有被修改)

function check_if_product_is_in_cart() {

    $products_ids = array( 10800, 11907 );
    $found = $others_found = false;

    foreach ( WC()->cart->get_cart() as $cart_item ){
        if (in_array( $cart_item['data']->get_id(), $products_ids ) ){
            $found = true;
        } else {
            $others_found = true;
        }
    }

    if ( $found && ! $others_found ) {
        return true;
    } else {
        return false;
    }
        
}

然后您可以根据函数的结果启用或禁用该复选框:

add_filter( 'woocommerce_ship_to_different_address_checked', 'filter_cart_needs_shipping_address');
function filter_cart_needs_shipping_address( $checked ) {
    return check_if_product_is_in_cart();
}

最后,您可以使用相同的功能将自定义类添加到结帐正文标签

add_filter( 'body_class', 'add_body_class' );
function add_body_class( $classes ) {
    if ( ! is_checkout() ) {
        return $classes;
    }
    if ( check_if_product_is_in_cart() ) {
        $classes[] = 'hide_ship_to_different_address_checkbox';
    }
    return $classes;
}

此时,您只需在活动主题的样式表中添加 CSS 规则:

该代码已经过测试并且可以工作。将它添加到您的活动主题的functions.php。


推荐阅读