如果特定产品在 WooCommerce 购物车中,则强制 "Ship to different address"

Make "Ship to different address" mandatory if specific products are in WooCommerce cart

我正在尝试添加一个片段以激活默认打开的“运送到其他地址”,当特定产品在结账时。
我找到了 相关的答案线程,它运行良好!

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

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

我刚刚更改了 $products_ids = array(10800, 11907); 以满足我的需要。

我已经尝试解除该函数的挂钩,但整个代码都不起作用。所以我正在寻找使该复选框变灰但保持上面的代码完全正常工作的最佳方法。

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

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

使用这个答案:

你可以拿代码创建一个新的自定义函数(returns结果和之前一样,除了产品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();
}

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

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

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

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

如果我理解了,您想保留代码功能,禁用复选框。

最好先隐藏复选框。然后为了避免通过单击复选框标签显示或隐藏送货地址,jQuery 将在选中时将其删除。

php代码(和内联CSS):

// Hide the checkbox (inline CSS) - Only on checkout page
add_filter( 'wp_head', 'shipping_address_checkbox_ccs' );
function shipping_address_checkbox_ccs() {
    if( is_checkout() && ! is_wc_endpoint_url() ) {
        ?><style>body.checkout-hide-checkbox #ship-to-different-address-checkbox { display:none; } body.checkout-hide-checkbox #ship-to-different-address label { cursor: default; }</style><?php
    }
}

// Conditional function
function mandatory_shipping_address(){
    $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;
        }
    }
    return $found && ! $others_found ? true : false;
}

// Conditionally Enable checkbox (checked)
add_filter( 'woocommerce_ship_to_different_address_checked', 'filter_cart_needs_shipping_address');
function filter_cart_needs_shipping_address( $checked ) {
    return mandatory_shipping_address() ? true : $checked;
}

// Conditionally Add a body class - Only on checkout page
add_filter( 'body_class', 'shipping_address_checkbox_body_class' );
function shipping_address_checkbox_body_class( $classes ) {
    if( is_checkout() && ! is_wc_endpoint_url() && mandatory_shipping_address() ) {
        $classes[] = 'checkout-hide-checkbox';
    }
    return $classes;
}

jQuery代码:

// Remove the checkbox when is checked - Only on checkout page
add_action( 'template_redirect', 'cart_needs_shipping_address_js');
function cart_needs_shipping_address_js() {
    if( is_checkout() && ! is_wc_endpoint_url() ) :

    wc_enqueue_js( "jQuery( function($){
    var a = '#ship-to-different-address-checkbox';
    if( $(a).is(':checked') ) {
        $(a).remove(); // Remove checkbox
    } 
    });");
    endif;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。

因此,选中复选框后,您将获得 (对于您定义的产品):