【问题标题】:Updating WooCommerce Subscriptions Order line Items programmatically以编程方式更新 WooCommerce 订阅订单行项目
【发布时间】: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 时删除订单项。这可能吗?

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

谢谢

【问题讨论】:

    标签: php wordpress woocommerce subscriptions orders


    【解决方案1】:

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

    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) )
                    )
                ));
            }
        }
    

    【讨论】:

    • 嘿@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 并给出了相关的指示。
    猜你喜欢
    • 2013-03-19
    • 2018-08-06
    • 2016-10-17
    • 2019-10-14
    • 2020-08-12
    • 1970-01-01
    • 2022-08-19
    • 2014-12-22
    • 2016-08-12
    相关资源
    最近更新 更多