Woocommerce,由管理员通过wp-admin

时间:2017-11-20 18:22:53

标签: wordpress woocommerce hook-woocommerce

当且仅当管理员通过管理区域将产品添加到现有订单时,我想设置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%折扣的价格。

我需要做什么才能在不需要刷新页面的情况下立即显示折扣价格?

看起来有些东西会覆盖它,因为它会被保存我会猜测因为价格在刷新时是正确的。

谈论简单/变异的产品类型。

1 个答案:

答案 0 :(得分:2)

所以我使用了这个钩子:

woocommerce_ajax_added_order_items

然后在函数中:

foreach ( $order->get_items() as $order_item_id => $order_item_data ) {
    //    Set custom price.
}

似乎工作正常。

UPDATE:

事实证明,上面的钩子只能获得最后一项,以防你想一次添加多个项目。

对于通过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 );