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

Posted

技术标签:

【中文标题】以编程方式更新 WooCommerce 订阅订单行项目【英文标题】:Updating WooCommerce Subscriptions Order line Items programmatically 【发布时间】:2017-01-27 00:29:12 【问题描述】:

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

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

我想要做的是允许用户更新他们产品的数量。因此,如果他们更新数量,我想更新订阅的项目数量,以便将来生成具有更新数量的订单。 我看到WC_Abstract_Order 类中有 update_product 方法。我认为这可以使用,但我对 cme​​ts 中的这个注释感到困惑:

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

当我使用这个时,我需要重新计算总数吗? 我还需要在数量为 0 时删除订单项。这可能吗?

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

谢谢

【问题讨论】:

【参考方案1】:

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

    从订阅对象中删除所有订单项。 运行 $_POST 以获取更改的数量 再次将产品添加到订阅中。

注意:我正在使用自定义字段 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) )
                )
            ));
        
    

【讨论】:

嘿@Yalamber,你能提供更多关于你用来运行它的钩子的上下文吗?我现在正在做几乎完全相同的事情,我正在努力找出实现编辑表单的最佳方法。 我建议使用 wp_loaded 操作。请记住,WooCommerce 订阅使用 wp_loaded 优先级为 100。如果您希望函数在此之后运行,请使用 101: add_action('wp_loaded', [$this, 'wcs_do_subscription_actions'], 101);【参考方案2】:

通常在 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表中看到。

我们可以将 'post_id' => '413'wp_postmeta 表中的总数更新为对应的 meta_key @987654326 @ 在这种情况下使用 update_post_meta() 函数。

但这不起作用,因为下一次预定的订阅付款由支付网关(贝宝或其他)处理,并且您无法更改该订阅的任何金额。强>

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

唯一的办法就是取消订阅,从头生成一个新进程……

【讨论】:

感谢您的回复。当我们查看订阅时,我看到有可能在后端编辑订阅产品数量。那些是如何处理的?当我们编辑数量时,他们会创建新订阅吗? @Yalamber 您无法真正编辑它,因为您正在更改金额,正如我所说,一旦订阅了订阅,WooCommerce 就不会处理预定的付款。这由支付网关或银行(贝宝或其他)处理。即使您在 woocommerce 中更改金额,也不会在支付网关或银行上更新……并且付款将保持与第一个订单定义的相同。 哦,我知道了,我实际上不需要更新支付网关上的金额。因为我会将产品的总数量限制在相同的范围内,并且每种产品的价格都相同。我只需要提供在不同产品之间更改数量的能力。 所以我想根据我的需要可以更新元字段吗? 请不要将此作为个人信息。我只是提供了对我有用的东西。所以我选择了我的答案并支持你的答案。因为它帮助我查看了 db 并给出了相关的指示。

以上是关于以编程方式更新 WooCommerce 订阅订单行项目的主要内容,如果未能解决你的问题,请参考以下文章

在 Woocommerce 3+ 中使用订单项以编程方式创建订单

markdown WooCommerce以编程方式创建订单

markdown WooCommerce以编程方式创建订单

在 WooCommerce 中更改订单运费总额

以编程方式为 WooCommerce 订阅中的购物车项目设置免费试用

在 WooCommerce 中以编程方式收取保存的 Stripe 卡