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

时间:2016-09-19 10:35:58

标签: php wordpress woocommerce subscriptions orders

我正在尝试允许用户从我的帐户面板更新其订阅的订单项。我可以从订阅ID获取订阅并显示更新表单。现在,我通过订阅中的产品项目向我们展示了

$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时,我需要删除订单项。这可能吗?

因为我没有看到删除项目方法。

由于

2 个答案:

答案 0 :(得分:4)

所以我能够完成这项工作。

  1. 从订阅对象中删除所有订单商品。
  2. 运行$ _POST以获取更改数量
  3. 再次将产品添加到订阅中。
  4. 注意:我使用自定义字段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) )
                    )
                ));
            }
        }
    

答案 1 :(得分:3)

通常在woocommerce中,当付款后生成订单时(我的意思是checkout => thankyou),您不能再编辑订单详细信息。更新数量,删除/添加项目是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 'post_id' => '413' meta_key 表中的总计> '_order_total' 在这种情况下使用 update_post_meta() 功能。

  

但这不起作用,因为下一次预定的订阅付款由付款网关(paypal或其他人)处理,您无法更改任何数量的订阅。

     

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

唯一的方法是取消订阅并从头开始生成新流程......