WooCommerce定制运输功能

时间:2016-10-04 02:58:16

标签: wordpress plugins woocommerce

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

我想要实现的目标是,如果客户添加X类或其任何子类别的产品,除了地面以外的所有费率都会被取消。

如果购物车中没有这些产品,则所有选项仍然可用。

开发人员向我指出了这段代码,但我对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;
}

1 个答案:

答案 0 :(得分: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;
}
    }