【问题标题】:Make "Ship to different address" mandatory if specific products are in WooCommerce cart [closed]如果 WooCommerce 购物车中有特定产品,则强制“运送到不同地址”[关闭]
【发布时间】:2021-06-08 21:39:00
【问题描述】:

当特定产品在结帐时,我正在尝试添加一个片段以激活默认打开的“运送到其他地址”。
我发现 Enable 'Ship to a different address' check box for specific products in Woocommerce 相关的答案线程运行良好!

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

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

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

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

【问题讨论】:

    标签: php jquery wordpress woocommerce checkout


    【解决方案1】:

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

    最好的办法是先隐藏复选框。然后为了避免显示或隐藏收货地址,点击复选框标签,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 文件中。经过测试并且可以工作。

    所以当检查复选框时,您将获得(对于您的定义产品) EM>:

    【讨论】:

    • 我刚刚发现,当我单击标签文本时,可能会折叠和取消折叠运输字段。对我们来说,我们希望在 H2 中而不是 H3 中有不同的文本,因此我们也将隐藏该标签并在那里回显一个新文本。然后就解决了。
    • @Nik7 您可以使用 jquery 代码 + 所有其他代码...这将避免折叠和展开运输字段,因为复选框首先隐藏,500 毫秒后被 jquery 删除。
    • 我现在使用 body.checkout-hide-checkbox #ship-to-different-address 来隐藏标签。完美运行!谢谢!
    【解决方案2】:

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

    因此,通过 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 中。

    【讨论】:

    • 它正在工作 :) 但它打破了我的整个布局。添加过滤器后:“add_filter('body_class', 'add_body_class');”布局被破坏了
    • 现在有效。问题出现在结帐以外的页面上。
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多