2016-10-04 74 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; 
} 
    }