【发布时间】:2018-08-28 06:30:27
【问题描述】:
我已经设置了自定义运输方式,每次用户进入购物车页面时我都需要计算运输成本。
似乎woocommerce_package_rates 操作(我计算自定义运输成本)仅在用户确实单击运输方式时运行。这样一来,购物车总数大部分时候是错误的,最糟糕的是已经选择了自定义运输方式(用户不需要点击它,因此它的成本不会更新)。
这是woocommerce_package_rates钩子的正常行为吗?
如何强制woocommerce_package_rates在显示购物车总数之前始终执行?
编辑
这是我试图破解的一些代码:
add_action( 'woocommerce_before_cart', 'force_shipping_calc', 1, 0 );
function force_shipping_calc() {
foreach( WC()->session->get('shipping_for_package_0')['rates'] as $rate_id =>$rate) {
// looking for the shipping method to recalc
if($rate->method_id == 'flat_rate') {
// mk1: set_shipping_total won't work, i'm using woocommerce < 3
//WC()->cart->set_shipping_total( MY_calculate_shipping() );
// mk2: doesn't work, "Indirect modification of overloaded property"
WC()->cart->totals['shipping_total'] = wc_format_decimal( MY_calculate_shipping(), wc_get_price_decimals() );
// mk3: cart total nor shipping total affected (?!)
WC()->cart->shipping_total = MY_calculate_shipping();
// mk4: ... ?! work in progress...
}
}
function MY_calculate_shipping() {
return 99.99;
}
add_filter( 'woocommerce_package_rates', 'fty_shipping_flat_rate_cost_calculation', 10, 2 );
function fty_shipping_flat_rate_cost_calculation($rates, $package) {
foreach($rates as $rate_key => $rate_values) {
$method_id = $rate_values->method_id;
$rate_id = $rate_values->id;
if ( 'flat_rate' === $method_id ){
$dist_cost = MY_calculate_shipping();
$price_excl_tax = $rates[$rate_id]->cost + $dist_cost;
$rates[$rate_id]->cost = number_format($price_excl_tax, 2);
$tax_keys = array_keys($rates[$rate_id]->taxes);
$price_excl_tax = $rates[$rate_id]->cost + $dist_cost;
$rates[$rate_id]->cost = number_format($price_excl_tax, 2);
$tax_calculation = $rates[$rate_id]->taxes[$tax_keys[0]] + $dist_cost*(TAX_AMOUNT_IVA-1);
$rates[$rate_id]->taxes[$tax_keys[0]] = number_format($tax_calculation, 2);
$rates[$rate_id]->cost += $dist_cost;
}
}
return $rates;
}
编辑,再次
这(mk。~17786)似乎是在正确的方向。
我从 WC_Shipping 更改了钩子并强制 calculate_shipping()
add_action( 'woocommerce_cart_totals_before_shipping', 'fty_force_calculate_shipping', 1, 2550 );
function fty_force_calculate_shipping() {
WC()->shipping->calculate_shipping(WC()->shipping->packages);
WC()->cart->calculate_totals();
}
但它还不完美,我认为这个钩子会在结帐页面中产生循环......
【问题讨论】:
-
您最好在您的问题中添加您的自定义代码... “寻求调试帮助的问题(“为什么此代码不起作用?”)必须包含所需的行为、特定问题或错误以及重现它在问题本身“所必需的最短代码
-
@LoicTheAztec 我添加了一些 embryo 代码我试图了解更多关于正在发生的事情......
-
能否在您的问题中添加您在
woocommerce_package_rates钩子中使用的自定义代码,请...您使用的似乎是v3 之前的WC 版本... 哪个? -
@LoicTheAztec woocommerce v2.6.14
-
@LoicTheAztec 添加了
woocommerce_package_rates回调
标签: php wordpress woocommerce cart shipping