当前位置: 首页 > 知识库问答 >
问题:

根据WooCommerce中的属性值计数更改统一费率运输成本

怀洛华
2023-03-14

我试图在不使用插件的情况下指定两种不同的固定费率运输方法:

  • 如果购物车中只有一家供应商的产品,统一费率的运费需要为19英镑

我尝试过各种插件,但它们关注的是基于大小、重量、数量、位置、类别的运费,而不是属性或条款。

我有一个属性命名为供应商8条款。每个学期都是不同的供应商。

下面是我想要实现的PHP逻辑类型:

if product attribute term quantity = 1

then flat rate = £19

else

if product attribute term quantity > 1

then flat rate = £39

当购物车中有多个属性供应商条款时,如何更改此“固定费率”装运方法成本?

共有1个答案

云飞翮
2023-03-14

这个过程需要两个步骤:一些代码和一些设置…

1)CODE-您可以使用在woocommerce_package_rates过滤器钩子中钩挂的自定义函数,当购物车项目来自一个以上的供应商时,目标是“统一费率”运输方法:

add_filter( 'woocommerce_package_rates', 'custom_flat_rate_cost_calculation', 10, 2 );
function custom_flat_rate_cost_calculation( $rates, $package )
{

    // SET BELOW your attribute slug… always begins by "pa_"
    $attribute_slug = 'pa_vendor'; // (like for "Color" attribute the slug is "pa_color")


    // Iterating through each cart item to get the number of different vendors
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

        // The attribute value for the current cart item
        $attr_value = $cart_item[ 'data' ]->get_attribute( $attribute_slug );

        // We store the values in an array: Each different value will be stored only one time
        $attribute_values[ $attr_value ] = $attr_value;
    }
    // We count the "different" attribute values stored
    $count = count($attribute_values);

    // Iterating through each shipping rate
    foreach($rates as $rate_key => $rate_values){
        $method_id = $rate_values->method_id;
        $rate_id = $rate_values->id;

        // Targeting "Flat Rate" shipping method
        if ( 'flat_rate' === $method_id ) {
            // For more than 1 vendor (count)
            if( $count > 1 ){
                // Get the original rate cost
                $orig_cost = $rates[$rate_id]->cost;
                // Calculate the new rate cost
                $new_cost = $orig_cost + 20; // 19 + 20 = 39
                // Set the new rate cost
                $rates[$rate_id]->cost = $new_cost;
                // Calculate the conversion rate (for below taxes)
                $conversion_rate = $new_cost / $orig_cost;
                // Taxes rate cost (if enabled)
                foreach ($rates[$rate_id]->taxes as $key => $tax){
                    if( $rates[$rate_id]->taxes[$key] > 0 ){
                        $new_tax_cost = number_format( $rates[$rate_id]->taxes[$key]*$conversion_rate, 2 );
                        $rates[$rate_id]->taxes[$key] = $new_tax_cost; // set the cost
                    }
                }
            }
        }
    }
    return $rates;
}

代码进入函数。活动子主题(或主题)或任何插件文件中的php文件。

此代码是测试与WooCommerce版本3和工程

2) 设置-一旦上述代码保存在函数中。如果您的活动主题是php文件,则需要将(对于所有配送区域)的“统一费率”配送方式成本设置为19(£19)(并保存)。

重要提示:要刷新配送方式缓存,您需要禁用“统一费率”然后保存,启用“统一费率”然后保存。

现在,这应该像预期的那样对您有效。

 类似资料:
  • 我试图用Python复制我的Stata代码,我被指向熊猫的方向。然而,我很难思考如何处理数据。 假设我想遍历列标题“ID”中的所有值。如果该ID与一个特定的数字匹配,那么我想更改两个相应的值FirstName和LastName。 在Stata,它看起来像这样: 因此,这将替换 FirstName 中与 ID == 103 到 Matt 的值对应的所有值。 在熊猫身上,我正在尝试这样的东西 不知道该

  • 问题内容: 因此,我最近开始涉足OOP,到目前为止一切进展顺利。虽然我本身没有任何问题,但我希望有一个令人惊奇的功能,尽管我找不到关于该功能的任何文档。 在为对象分配属性时,我经常发现我必须更改依赖于他人的属性,例如光明与黑暗。这是一个例子: 现在,尽管这很酷,但我想要的是相同的过程,但是如果一个属性发生更改,则在同一对象内。如果我重置光的属性(是的),我希望黑暗相应地增加/减少。如果可以更改光的

  • 问题内容: 我有一个AngularJS属性指令,并且只要其父输入的值发生更改,我都想采取措施。现在,我正在使用jQuery: 没有jQuery,有没有办法做到这一点?我发现keyPress事件并没有完全实现我想要的功能,虽然我确定自己会提出解决方案,但是当我在Angular项目中使用jQuery时,我会有些紧张。 那么,Angular如何做到这一点呢? 问题答案: AngularJS文档中有一个很

  • 问题内容: 如何从Java程序外部更改user.home系统属性,使其认为它与D:\ Documents and Settings \%USERNAME%是不同的目录?通过环境变量还是VM参数? 问题答案: 设置VM参数应该起作用: 这是一个测试案例: 在Win XP和Linux上使用Java 1.5.0_17测试

  • 问题内容: 我一段时间以来一直在寻找解决方案…我试图根据添加到Woocommerce结帐页面上的单选按钮选项来显示或隐藏特定的运费。但是我对Ajax&JQuery并不需要任何了解。 基本上,如果用户选择单选 选项_1 ,它将仅显示“ flat_rate:1 ”和“ flat_rate:2 ”。如果用户选择单选 选项_2 ,它将仅显示“ flat_rate:3 ”和“ flat_rate:4 ” 这

  • 本文向大家介绍解决vue 更改计算属性后select选中值不更改的问题,包括了解决vue 更改计算属性后select选中值不更改的问题的使用技巧和注意事项,需要的朋友参考一下 先上代码: 上面的代码就是采用vue的v-for指令绑定数据生成option,但今天学习写的时候突然发现一个问题,即将计算属性da绑定到v-for指令上,然后再替换源数据options,结果da计算属性正确,而selecte