当店主从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加载的新对象。因此,我正在执行以下代码,以便$item
集合中的order->items
对象用于进一步处理。 (将false
作为第二个参数传递给get_item()
)
$item = $item->get_order()->get_item($item_id, false);
我是否使用此代码,结果相同。
最后,我将$item
对象添加回order
只是为了覆盖任何引用。但它没有效果。
答案 0 :(得分:1)
根本原因:
当我们调用$item->get_order()
时,它的内部调用wc_get_order
返回一个新的Order对象。因此,当我尝试将项目添加回订单时(使用$item->get_order()->add_item($item);
),它会添加到此新订单对象中,并且WC_AJAX::add_order_item()
内创建/使用的原始订单对象保持不变。这就是改变不能反映出来的原因。
<强>解决方案:强>
根据建议@ Woocommerce, update price when added by admin via wp-admin
,我使用了woocommerce_ajax_add_order_item_meta
动作。在这里,我们将原始订单对象的引用作为第三个参数,然后我们可以根据需要对其进行操作。这些变化得到了恰当的反映。
所以这是代码:
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();
}
}
}
一个奇怪的观察是,一旦我们更新数量,我们还需要更新小计和总数。否则它开始显示rate = total / qty。
示例:
如果产品成本为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
希望这有助于某人。