2016-10-04 50 views
0

我试图通过wooforce为WooCommerce运输插件创建自定义函数。有两个插件,ups和usps。WooCommerce自定义运输功能

我想要实现的是,如果客户添加了来自类别X或其任何子类别的产品,除ups之外的所有价格都会被取消设置。

如果这些产品不在购物车中,所有选项都可用。

开发人员向我指出了这段代码,但我仍然对PHP和WordPress/WooCommerce结构化PHP非常陌生,所以我有点卡住了如何继续。

这是他们给我的代码。

add_filter('woocommerce_package_rates', 'hide_shipping_method_when_shipping_class_product_is_not_in_cart', 10, 2); 

function hide_shipping_method_when_shipping_class_product_is_not_in_cart($available_shipping_methods, $package) 
{ 

    // Shipping class IDs that need the method removed 

    $shipping_class_ids = array(
     27, 
    ); 
    $shipping_services_to_hide = array(
     'wf_fedex_woocommerce_shipping:FEDEX_GROUND', 
       'wf_fedex_woocommerce_shipping:FEDEX_2_DAY_AM' 
    ); 
    $shipping_class_exists = false; 

    foreach(WC()->cart->cart_contents as $key => $values) { 
     if (in_array($values['data']->get_shipping_class_id() , $shipping_class_ids)) { 
      $shipping_class_exists = true; 
      break; 
     } 
    } 

    if (!$shipping_class_exists) { 
     foreach($shipping_services_to_hide as & $value) { 
      unset($available_shipping_methods[$value]); 
     } 
    } 

    return $available_shipping_methods; 
} 

回答

0

我能够自己弄清楚这一点。以下是任何未来可能需要此功能的代码。 此功能特别适用于WooForce Shipping插件。

add_filter('woocommerce_package_rates', 'hide_shipping_method_when_shipping_class_product_is_not_in_cart', 10, 2); 
    function hide_shipping_method_when_shipping_class_product_is_not_in_cart($available_shipping_methods, $package){ 
    // 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']; 

// replace 'membership' with your category's slug 
if (has_term('ammo', '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) { 
// we have the category, do what we want 
    // Shipping class IDs that need the method removed 
    $shipping_class_ids = array(
     1, 
     2, 
     3, 
     18, 
     23, 
     33, 
     47, 
     49 
    ); 
    $shipping_services_to_hide = array(
     'wf_shipping_usps:D_PRIORITY_MAIL', 
       'wf_shipping_usps:D_EXPRESS_MAIL' 
    ); 
    $shipping_class_exists = false; 
    foreach(WC()->cart->cart_contents as $key => $values) { 
     if (in_array($values['data']->get_shipping_class_id() , $shipping_class_ids)) { 
      $shipping_class_exists = true; 
      break; 
     } 
    } 
    if (!$shipping_class_exists) { 
     foreach($shipping_services_to_hide as & $value) { 
      unset($available_shipping_methods[$value]); 
     } 
    } 
    return $available_shipping_methods; 
} 
else{ 
    return $available_shipping_methods; 
} 
    }