【问题标题】:Creating a WooCommerce Order programmatically for a subscription product以编程方式为订阅产品创建 WooCommerce 订单
【发布时间】:2019-10-14 21:29:56
【问题描述】:

对于 woocommerce,我正在使用 WooCommerce 订阅插件。我创建了一个函数,它可以使用 wc_get_product_id_by_sku() 函数从订阅产品创建基于产品 SKU 的订单。

这是我目前的功能:

function create_new_order() {
    global $woocommerce;

    $address = array(
        'first_name' => 'Zakup',
        'last_name'  => 'Sklepowy',
        'email'      => 'test@test.pl',
        'phone'      => '123',
        'address_1'  => 'ul. Przykladowa 1',
        'address_2'  => 'm. 2',
        'city'       => 'Wroclaw',
        'postcode'   => '50-123',
    );


    $order = wc_create_order();

    $product = new WC_Product( wc_get_product_id_by_sku( 'wpoh-prof-webshop' ) );
    $order->add_product( $product, 1 );
    $order->set_address( $address, 'billing' );

    // Set payment gateway
    $payment_gateways = WC()->payment_gateways->payment_gateways();
    $order->set_payment_method( $payment_gateways['cod'] );

    // Calculate totals
    $order->calculate_totals();
    $order->update_status( 'completed', 'In Store ', true );
}

用这一行:

$product = new WC_Product (wc_get_product_id_by_sku ('wpoh-prof-webshop'));

我拿起要与订单一起放置的产品。我已根据需要在此函数中硬编码客户帐单地址。

当我运行该函数时,会创建一个没有附加任何产品或地址的空订单。

在没有个人信息或产品的情况下创建的订单:

谁能帮助我并告诉我哪里出了问题?

【问题讨论】:

  • 这就是我的意思哈哈哈,我的意思是当你创建一个订单时,你会发送一个可变的产品。
  • 首先我现在要做的是 sku wpoh-prof-webshop 已经是一个选定的可变产品。当加载这个函数时,他必须创建一个订单。一旦他创建了订单,该函数必须查看要在订单中包含的 sku + 地址详细信息。在我加载函数的那一刻,它创建了一个没有地址数据和没有产品的空订单。
  • 如果您正在阅读代码,您就会知道它的含义。 wpoh-prof-webshop 是我在 $product = new WC_Product( wc_get_product_id_by_sku( 'wpoh-prof-webshop' ) ) 上搜索的产品的 SKU;
  • @LoicTheAztec 我改了帖子你能再检查一下吗?

标签: php wordpress woocommerce orders woocommerce-subscriptions


【解决方案1】:

获取以下订阅产品对象之一:

  • WC_Product_Subscription subscription 产品类型,简单订阅)
  • WC_Product_Variable_Subscription variable-subscription 产品类型)
  • WC_Product_Subscription_Variation subscription_variation 产品类型)

您可以使用new WC_Product(),因为它会抛出错误

您应该使用wc_get_product() 函数。

现在global $woocommerce; 不是必需的,也不做任何事情。

SKU:使用wc_get_product_id_by_sku()函数从产品ID中获取产品对象:

SKU 应始终来自简单订阅或变体订阅,但绝不来自可变订阅产品……

试试下面稍加修改的函数:

function create_new_order() {
    $sku = 'wpoh-prof-webshop';
    $address = array(
        'first_name' => 'Zakup',
        'last_name'  => 'Sklepowy',
        'email'      => 'test@test.pl',
        'phone'      => '123',
        'address_1'  => 'ul. Przykladowa 1',
        'address_2'  => 'm. 2',
        'city'       => 'Wroclaw',
        'postcode'   => '50-123',
    );

    $order = wc_create_order(); // Create a WC_Order object and save it.

    $order->set_address( $address, 'billing' ); // Set customer billing adress
    
    $product = wc_get_product( wc_get_product_id_by_sku( $sku ) );
    $order->add_product( $product, 1 ); // Add an order line item
    
    // Set payment gateway
    $payment_gateways = WC()->payment_gateways->payment_gateways();
    $order->set_payment_method( $payment_gateways['cod'] );
    
    $order->calculate_totals(); // Update order taxes and totals
    $order->update_status( 'completed', 'In Store ', true ); // Set order status and save
}

经过测试并且有效。

相关回答:Get the product object from sku and update the price in WooCommerce

【讨论】:

  • 我需要在哪里添加这个? WC_Product_Subscription(订阅产品类型,简单订阅)、WC_Product_Variable_Subscription(可变订阅产品类型)、WC_Product_Subscription_Variation(订阅变体产品类型)。如果我希望它成为订阅,它可以像正常订单 atm 一样工作
  • @MaartendeWolf 此答案代码基于您的答案,它解决了空订单问题(您所问的):wc_get_product() 适用于任何产品类型,甚至适用于订阅产品类型。使wc_get_product() 成为产品类型的原因是您在其中设置的产品ID。因此,如果 SKU 来自简单的订阅产品,您将获得 WC_Product_Subscription 对象,或者如果它来自订阅变体,您将获得 WC_Product_Variable_Subscription 对象……
  • @MaartendeWolf 要获得续订订单,您必须使用set_parent_id()在订单中设置父订单ID(因此第一个初始订单的订单ID订阅)。但这是另一个问题……
【解决方案2】:

Maarten de Wolf,你可以将它添加到单独的.php文件中,但它需要通过添加来接受:

require(dirname(__FILE__) . '/wp-load.php');

在脚本之前(它加载例如会话信息 - 您以管理员身份登录)。

【讨论】:

  • 感谢我现在正在尝试为我的订单创建续订订阅。也许你可以帮我解决这个问题。订单是在加载函数时创建的。但它不会以某种方式更新
猜你喜欢
  • 2018-08-06
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2013-05-05
  • 2022-08-19
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多