覆盖WooCommerce中wp_admin(shop_order)页面中新订单项目的数量



当店主从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。我无法弄清楚缺少什么。有人可以帮忙吗?

注意:

  1. 默认情况下,传递给我们函数的$item参数是从 DB 加载的新对象。因此,我正在执行以下代码,以便将order->items集合中的$item对象用于进一步处理。(将false作为第二个参数传递给get_item())

    $item = $item->get_order()->get_item($item_id, false);
    

    无论我是否使用此代码,结果都是一样的。

  2. 最后,我将$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

希望这对某人有所帮助。

相关内容

  • 没有找到相关文章

最新更新