在WooCommerce

时间:2018-05-04 23:08:59

标签: php wordpress woocommerce shipping custom-taxonomy

我的WooCommerce网站使用3种不同的运输类型。

  1. 皇家邮件签署(7天)
  2. 保证第二天
  3. 录制的送货
  4. 某些产品只能使用选项1发货。当此产品添加到购物车时,我创建的运输类有助于在购物车中显示选项1,但其他两个选项仍然可见(客户不允许选择这个产品的这些选项)。通过使用jQuery我能够隐藏其他两个选项,因为选项1是默认选择。 (因此基于此很容易隐藏其他两个)。

    我遇到的问题是2个隐藏选项仍会显示在结帐页面上,我不确定原因。

    这是我在购物车中选择第一个选项时隐藏其他两个选项的代码:

    jQuery(document.body).ready(function() {
        if(jQuery('#shipping_method_0_ced_pps').val() == 'ced_pps')
            jQuery('ul#shipping_method li:nth-child(2)').hide();
            jQuery('ul#shipping_method li:nth-child(3)').hide();
    });
    

    奇怪的是,如果我测试结帐页面上是否存在值,我可以发出警报但是当我使用上面的代码时它根本不起作用。

    有人可以提供一些帮助或替代方法吗?

    我已经看过这里了this是最接近我没有使用jQuery的解决方案。此解决方案的问题是我需要手动将产品ID输入到functions.php文件中。当有超过100种产品时,这是不理想的。

1 个答案:

答案 0 :(得分:2)

已更新有多种方法可以在不需要jQuery的情况下执行此操作:

1)如果您的产品很少,您可以使用以下代码,您将在其中定义:

  • 产品ID数组
  • 您要移除的送货方式实例ID

代码:

add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
    // HERE set the product IDs in the array
    $product_ids = array( 113, 115, 126 ); 
    // HERE set the shipping methods to be removed (like "fat_rate:5")
    $method_instances_ids = array('2846', '2851'); 

    $found = false;

    // Loop through cart items checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
        if ( in_array( $cart_item['product_id'], $product_ids ) ){
            $found = true;
            break;
        }
    }

    if ( ! $found ) return $rates; // If not found we exit

    // Loop through your active shipping methods
    foreach( $rates as $rate_id => $rate ) {
        // Remove all other shipping methods other than your defined shipping method
        if ( in_array( $rate_id, $method_instances_ids ) ){
            unset( $rates[$rate_id] );
        }
    }    

    return $rates;
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。

2)如果您有一堆产品,最好通过产品类别(或产品标签)来定位这些产品 ...您可以批量分配它。

在代码中,您将定义:

  • 产品类别(或产品标签,分类为product_tag
  • 您要移除的送货方式实例ID

代码:

add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
    // HERE set the product category in the array (ID, slug or name)
    $terms = array( 'my-category' ); 
    $taxonomy = 'product_cat'; 

    // HERE set the shipping methods to be removed (like "fat_rate:5")
    $method_instances_ids = array('2846', '2851');  

    $found = false;

    // Loop through cart items checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
        if ( has_term( $terms, $taxonomy, $cart_item['product_id'] ) ){
            $found = true;
            break;
        }
    }

    if ( ! $found ) return $rates; // If not found we exit

    // Loop through your active shipping methods
    foreach( $rates as $rate_id => $rate ) {
        // Remove all other shipping methods other than your defined shipping method
        if ( in_array( $rate_id, $method_instances_ids ) ){
            unset( $rates[$rate_id] );
        }
    }    

    return $rates;
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。

  

使其适用于的产品标签
  您只需将分类'product_cat'替换为'product_tag'

即可

3)如果您有大量产品,您还可以创建发货类并批量分配给您的产品。您需要在相关的运输方式中为其设定价格......

Filter Shipping method based on shipping class in Woocommerce 3

  

您需要刷新送货缓存:
  1)首先,此代码已保存在您的function.php文件中并清空您的购物车...
  2)在运输设置中,输入运输区域并禁用运输方式和“保存”。然后重新启用送货方式和“保存”。 你已经完成了。