【问题标题】:override quantity of new order item in wp_admin (shop_order) page in woocommerce覆盖woocommerce wp_admin(shop_order)页面中新订单商品的数量
【发布时间】:2017-12-16 09:22:34
【问题描述】:

当店主从 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 参数是从数据库加载的新对象。所以我正在执行以下代码,以便将来自order->items 集合的$item 对象用于进一步处理。 (将false 作为第二个参数传递给get_item()

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

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

  2. 最后我将$item 对象添加回order 只是为了覆盖所有引用。但是没有效果。

【问题讨论】:

    标签: wordpress woocommerce hook-woocommerce


    【解决方案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
    

    因此,出于某种原因,rate 似乎是一个计算字段,而不是总计。这就是为什么我们在更新数量时,还需要更新小计和总计。这将正确地显示为:

    prod name     | rate   | qty    | total
    prod123       | 100    | 2      | 200
    

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 1970-01-01
      • 2015-03-19
      • 2021-02-07
      • 2017-04-04
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多