当且仅当管理员通过管理区域将产品添加到现有订单时,我想设置50%的折扣。
我试过这个:
function admin_set_custom_price( $item, $item_id ) {
$item->set_subtotal( ( ( ( 100 - 50 ) * $item->get_subtotal() ) / 100 ) );
$item->set_total( ( ( ( 100 - 50 ) * $item->get_total() ) / 100 ) );
$item->apply_changes();
$item->save();
return $item;
}
add_filter( 'woocommerce_ajax_order_item', 'admin_set_custom_price', 10, 2 );
结果是,当添加项目时,价格是原始价格。
如果我只是刷新页面,它会显示50%折扣的价格。
我需要做什么才能在不需要刷新页面的情况下立即显示折扣价格?
看起来有些东西会覆盖它,因为它会被保存我会猜测因为价格在刷新时是正确的。
谈论简单/变异的产品类型。
答案 0 :(得分:2)
所以我使用了这个钩子:
woocommerce_ajax_added_order_items
然后在函数中:
foreach ( $order->get_items() as $order_item_id => $order_item_data ) {
// Set custom price.
}
似乎工作正常。
事实证明,上面的钩子只能获得最后一项,以防你想一次添加多个项目。
对于通过ajax添加的项目(不影响现有项目),仅在循环中执行的更好的挂钩是:
woocommerce_ajax_add_order_item_meta
然后在循环中,您可以对购物车中的商品进行循环,如果购物车ID匹配,您可以更改产品。
function update_order_prices_on_admin_ajax( $item_id, $item, $order )
foreach ( $order->get_items() as $order_item_id => $order_item_data ) {
if ( $order_item_id == $item_id ) {
// Do changes here.
// Runs this after making a change to $order_item_data
$order->apply_changes();
$order->save();
}
}
}
add_action( 'woocommerce_ajax_add_order_item_meta', 'update_order_prices_on_admin_ajax', 99, 3 );