当店主从WP-Admin添加新订单时,我需要覆盖要添加的项目数量。目前,我将此值硬编码为 2。
我试过这段代码:
add_filter('woocommerce_ajax_order_item', 'VNA_add_item_quantity', 10, 2);
function VNA_add_item_quantity($item, $item_id) {
$item = $item->get_order()->get_item($item_id, false);
$item->set_quantity(2);
$item->apply_changes();
$item->save();
$item->get_order()->add_item($item);
return $item;
}
但由于某种原因,它没有反映在订单中,并且继续显示新添加的项目的数量= 1。我无法弄清楚缺少什么。有人可以帮忙吗?
注意:
默认情况下,传递给我们函数的
$item
参数是从 DB 加载的新对象。因此,我正在执行以下代码,以便将order->items
集合中的$item
对象用于进一步处理。(将false
作为第二个参数传递给get_item()
)$item = $item->get_order()->get_item($item_id, false);
无论我是否使用此代码,结果都是一样的。
最后,我将
$item
对象添加回order
只是为了覆盖任何引用。但它没有效果。
根本原因:
当我们调用$item->get_order()
时,它的内部调用wc_get_order
返回一个新的 Order 对象。因此,当我尝试将项目添加回订单(使用$item->get_order()->add_item($item);
)时,它被添加到这个新的订单对象中,并且在WC_AJAX::add_order_item()
中创建/使用的原始订单对象保持不变。这就是更改没有反映回来的原因。
溶液:
正如建议@Woocommerce,当管理员通过wp-admin添加时更新价格 ,我使用了动作woocommerce_ajax_add_order_item_meta
。在这里,我们获取原始订单对象的引用作为第 3 个参数,然后我们可以根据需要对其进行操作。这些更改会得到适当的反映。
所以这是代码:
add_action( 'woocommerce_ajax_add_order_item_meta', 'VNA_set_item_quantity', 99, 3 );
function VNA_set_item_quantity( $item_id, $item, $order ) {
foreach ( $order->get_items() as $order_item_id => $order_item_data ) {
if ( $order_item_id == $item_id ) {
$qty = 2;
$order_item_data->set_quantity($qty);
$order_item_data->set_subtotal($qty * $order_item_data->get_subtotal());
$order_item_data->set_total($qty * $order_item_data->get_total());
$order->apply_changes();
$order->save();
}
}
}
一个奇怪的观察结果是,一旦我们更新了数量,我们还需要更新小计和总计。否则,它将开始显示速率 = 总计/数量。
例:
如果产品成本为 100,则最初将显示为:
prod name | rate | qty | total
prod123 | 100 | 1 | 100
现在,如果您只是更改数量,它开始显示为:
prod name | rate | qty | total
prod123 | 50 | 2 | 100
因此,出于某种原因,速率似乎是一个计算字段而不是总计。这就是我们更新数量时的原因,我们还需要更新小计和总计。这将正确显示为:
prod name | rate | qty | total
prod123 | 100 | 2 | 200
希望这对某人有所帮助。