以编程方式更新 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 方法。我认为这可以使用,但我对 cmets 中的这个注释感到困惑:
* 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+ 中使用订单项以编程方式创建订单