【发布时间】:2015-12-09 03:44:12
【问题描述】:
我正在尝试以编程方式创建订单。使用wc_create_order() 这非常简单:
$myProduct = new WC_Product(100);
$order = wc_create_order();
$order->add_product($myProduct, 1);
$order->calculate_totals();
这按预期工作,并为 ID 100 的简单产品创建了正确数量的订单。
但是,如果我尝试使用变体执行此操作,它的行为似乎不正确。经过多次试验和错误,我得到了某种这样的工作方式:
$membershipProduct = new WC_Product_Variable(100);
$theMemberships = $membershipProduct->get_available_variations();
$trueProduct = new WC_Product(100);
$variationsArray = array();
foreach ($theMemberships as $membership) {
if ($membership['sku'] == $chosenVariation) {
$variationID = $membership['variation_id'];
$variationsArray = $membership['attributes'];
}
}
if ($variationID) {
$trueProduct->variation_id = $variationID;
}
$order = wc_create_order();
$order->add_product($trueProduct, 1, $variationsArray);
$order->calculate_totals();
但是,尽管它确实使用正确的产品和正确的变体 ID 创建了订单,但订单的总和始终为 0(巧合的是,它是第一个变体的价格)。
最初我尝试使用从new WC_Product_Variable() 创建的对象来使用$order->add_product(),但这导致订单中根本没有添加任何产品,这让我相信以编程方式使用可变产品创建订单存在问题。但是,按照这些调用的 WooCommerce 源代码,我看不出我做错了什么。
是否有我遗漏的东西,或者有更好的方法来创建具有可变产品的订单?
【问题讨论】:
-
我不知道完整的答案,但你肯定错过了
add_product( $product, $qty = 1, $args = array() )的第三个参数。您需要通过$args = array('variation' => $something );。我还不确定$something需要如何格式化。 -
@helgatheviking 啊,你说得很对:我是将数组作为第三个参数传递(在第二个示例中),但我没有注意到它需要
'variation'键。我已经添加了 ($variationsArray['variation'] = $membership['attributes'];),现在该商品在订单中显示为“正确”(例如,它是正确产品的正确变体),但价格仍然错误。不知道我错过了什么!
标签: php wordpress woocommerce