更新WooCommerce订阅订单项以编程方式

问题描述:

我试图让用户从他们的我的账户面板更新他们订阅的订单项。我能够从订阅ID获取订阅,并向他们显示更新表单。现在我告诉他们,在他们的订阅产品项目中,我通过更新WooCommerce订阅订单项以编程方式

$subscription = wcs_get_subscription($_GET['subscription']); 
$subscription_items = $subscription->get_items(); 

得到了什么,我试图做的是允许用户更新他们的产品的数量。因此,如果他们更新数量,我想更新订阅的项目数量,以便将来的订单以更新的数量生成。 我看到WC_Abstract_Order类中有update_product方法。我认为这是可以使用的,但我很困惑在这张票据的评论:

* Update a line item for the order. 
* 
* Note this does not update order totals. 

我需要时,我用它来重新计算总额是多少? 另外,当数量为0时,我需要删除订单项。这可能吗?

由于我没有看到删除项目的方法。

感谢

所以我是能够使这项工作做如下。

  1. 从订阅对象中删除所有订单商品。
  2. 通过$ _POST运行以获取更改数量
  3. 将产品再次添加到订阅。

注意:我使用自定义字段price_level,因为它在订阅期间是动态定价的,我们想要使用它以便价格与订阅时相同。

//remove product items 
    $subscription->remove_order_items('line_item'); 
    //add product item again 
    foreach($_POST['quantity'] as $product_id => $qty) { 
     if($qty > 0) { 
      //we will need to set dynamic prices based on cusotm field 
      $price_level = get_field('coffee_price_level', $subscription->id); 
      //Get the product 
      $product = wc_get_product($product_id); 
      //set the price 
      $product->set_price(floatval($price_level)); 
      $tax = ($product->get_price_including_tax()-$product->get_price_excluding_tax())*$qty; 
      //subscription item price level 
      $subscription->add_product($product, $qty, array(
       'totals' => array(
        'subtotal'  => $product->get_price(), 
        'subtotal_tax' => $tax, 
        'total'  => $product->get_price(), 
        'tax'   => $tax, 
        'tax_data'  => array('subtotal' => array(1=>$tax), 'total' => array(1=>$tax)) 
       ) 
      )); 
     } 
    } 
+0

嘿@Yalamber,你能够提供更多的上下文,只要你用来运行这个钩子?我现在正在做几乎完全相同的事情,我正在努力想出实现编辑表单的最佳方式。 –

通常在woocommerce当付款后产生的订单(我的意思是结账=>三江源),你不能再修改订单的详细信息。更新数量,删除/添加项目是WC购物车方法。

对于订阅插件,每个初始shop_order后期类型都有一个同时生成的初始shop_subscription后期类型和一个计划后期后期类型(并且后面的ID是相互关联的)。例如:

Initial (post type) 'shop_order' -> ID is  412 
Initial (post type) 'shop_subscription' -> ID is 413 (and 'post_parent': 412) 
Initial (post type) 'scheduled-action' -> ID is 414 

你可以看到在你的数据库wp_posts表。

我们可以在wp_postmeta总表与相应的meta_key'_order_total'使用在这种情况下,update_post_meta()功能已经更新了'post_id' => '413'

但是这不会起作用,因为下一个计划订购支付由支付网关(PayPal或其他)处理,并你不能改变的认购额。

当预定的订阅到期时,WooCommerce只会生成由此支付网关触发的新订单。

的唯一方法是取消订阅,并从一开始就产生一个新的进程......

+0

谢谢你的回应。当我们查看订阅时,我看到在后端编辑订阅产品数量的可能性。那些如何处理?编辑数量时他们是否创建新订阅? – Yalamber

+0

@Yalamber你不能真的编辑它,因为你正在改变金额,正如我所说,一旦订阅已订阅,WooCommerce不处理定期付款。这是由支付网关或银行(贝宝或其他人)处理的。即使您更改了woocommerce中的金额,该金额也不会在支付网关或银行中更新...并且付款将保持与第一次订单所定义的相同。 – LoicTheAztec

+0

哦,我现在明白了,实际上我不需要更新支付网关上的金额。由于我将限制产品的总量相同,并且每个产品将具有相同的价格。我只需要提供改变不同产品之间数量的能力。 – Yalamber