以编程方式更新 WooCommerce 订阅订单行项目
Updating WooCommerce Subscriptions Order line Items programmatically
我正在尝试允许用户从他们的“我的帐户”面板更新他们订阅的行项目。我能够从订阅 ID 获取他们的订阅并向他们展示更新表单。现在,我向他们展示了我通过
获得的订阅中的产品项目
$subscription = wcs_get_subscription($_GET['subscription']);
$subscription_items = $subscription->get_items();
我想做的是允许用户更新他们产品的数量。因此,如果他们更新数量,我想更新订阅的商品数量,以便生成具有更新数量的未来订单。
我看到 WC_Abstract_Order
class 中有 update_product 方法。我认为这可以使用,但我对评论中的这条注释感到困惑:
* Update a line item for the order.
*
* Note this does not update order totals.
我使用这个的时候需要重新计算总数吗?
我还需要在数量为 0 时删除订单项。这可能吗?
因为我没有看到删除项目的方法。
谢谢
通常在 woocommerce 中,当付款后生成订单时(我的意思是结帐 => 谢谢),您无法再编辑订单详细信息。更新数量,removing/adding 项是 WC 推车方法。
使用订阅插件,对于每个初始 shop_order post 类型,都有一个初始 shop_subscription post 类型和一个计划操作 post 类型同时生成(并且 post 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
table.
我们本可以更新 wp_postmeta
table 中 'post_id' => '413'
的总数相应的 meta_key
'_order_total'
在这种情况下使用 update_post_meta()
函数。
BUT this will not work, because the next scheduled subscription payment is handled by the payment gateway (paypal or others) and you can't change any amount of that subscription.
WooCommerce will just generate the new order triggered by this payment gateway, when a scheduled subscription is due.
唯一的办法就是取消订阅,重新生成一个新的进程...
所以我能够完成以下工作。
- 从订阅对象中删除所有订单项。
- 运行通过$_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) )
)
));
}
}
我正在尝试允许用户从他们的“我的帐户”面板更新他们订阅的行项目。我能够从订阅 ID 获取他们的订阅并向他们展示更新表单。现在,我向他们展示了我通过
获得的订阅中的产品项目$subscription = wcs_get_subscription($_GET['subscription']);
$subscription_items = $subscription->get_items();
我想做的是允许用户更新他们产品的数量。因此,如果他们更新数量,我想更新订阅的商品数量,以便生成具有更新数量的未来订单。
我看到 WC_Abstract_Order
class 中有 update_product 方法。我认为这可以使用,但我对评论中的这条注释感到困惑:
* Update a line item for the order.
*
* Note this does not update order totals.
我使用这个的时候需要重新计算总数吗? 我还需要在数量为 0 时删除订单项。这可能吗?
因为我没有看到删除项目的方法。
谢谢
通常在 woocommerce 中,当付款后生成订单时(我的意思是结帐 => 谢谢),您无法再编辑订单详细信息。更新数量,removing/adding 项是 WC 推车方法。
使用订阅插件,对于每个初始 shop_order post 类型,都有一个初始 shop_subscription post 类型和一个计划操作 post 类型同时生成(并且 post 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
table.
我们本可以更新 wp_postmeta
table 中 'post_id' => '413'
的总数相应的 meta_key
'_order_total'
在这种情况下使用 update_post_meta()
函数。
BUT this will not work, because the next scheduled subscription payment is handled by the payment gateway (paypal or others) and you can't change any amount of that subscription.
WooCommerce will just generate the new order triggered by this payment gateway, when a scheduled subscription is due.
唯一的办法就是取消订阅,重新生成一个新的进程...
所以我能够完成以下工作。
- 从订阅对象中删除所有订单项。
- 运行通过$_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) )
)
));
}
}