代码之家  ›  专栏  ›  技术社区  ›  Vivek Athalye

覆盖woocommerce中wp\u admin(shop\u order)页面中新订单项目的数量

  •  1
  • Vivek Athalye  · 技术社区  · 7 年前

    当店主从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;
    }
    

    但由于某些原因,它没有反映在订单中,对于新添加的项目,它继续显示quantity=1。我不知道缺少了什么。有人能帮忙吗?

    注:

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

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

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

    2. 最后,我添加了 $项目 对象返回到 order 只是为了覆盖任何引用。但它没有效果。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Vivek Athalye    7 年前

    根本原因:

    当我们打电话时 $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 . 在这里,我们将原始order对象的引用作为第三个参数,然后可以根据需要对其进行操作。这些变化得到了正确的反映。

    下面是代码:

    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
    

    希望这对别人有帮助。