在Woocommerce结帐中为产品类别中的特定虚拟产品启用送货地址

时间:2018-12-18 22:18:15

标签: php wordpress woocommerce field checkout

我有一个类别门,用于显示虚拟产品的发货。基本上,我有一些产品我不想收费,我把它们归类为“礼物”……但是我仍然想要一个送货地址。问题是,当我使用类别过滤器构建时,它不会按顺序保存地址...如果我只是使用...

add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true', 50 );

效果很好...

但是当我把门放在上面时...它不会保存值...这是门...

//gifts filter
function HDM_gift_shipping() {
// set our flag to be false until we find a product in that category
$cat_check = false;

// check each cart item for our category
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

    $product = $cart_item['data'];

   // if cat matches gift return true
    if ( has_term( 'gift', 'product_cat', $product->id ) ) {
        $cat_check = true;
        // break because we only need one "true" to matter here
        break;
    }
}

// if a product in the cart is in our category, do something
if ( $cat_check ) {
    add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true', 50 );
}

}
add_action('woocommerce_before_checkout_billing_form', 'HDM_gift_shipping', 100);

1 个答案:

答案 0 :(得分:1)

您的代码中有一些错误。为了使它正常工作,您最好通过以下方式直接在woocommerce_cart_needs_shipping_address过滤器挂钩中设置代码:

add_filter( 'woocommerce_cart_needs_shipping_address', 'custom_cart_needs_shipping_address', 50, 1 );
function custom_cart_needs_shipping_address( $needs_shipping_address ) {
    // Loop though cat items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( has_term( array('gift'), 'product_cat', $cart_item['product_id'] ) ) {
            // Force enable shipping address for virtual "gift" products
            return true; 
        }
    }
    return $needs_shipping_address;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。

  

购物车,要在使用 has_term() WordPress条件函数时处理Woocommerce 自定义分类法(例如产品类别或标签),您需要使用 $cart_item['product_id'] 代替不适用于产品变体的$cart_item['data']->get_id()