以编程方式为订阅产品创建WooCommerce订单

时间:2019-05-29 09:48:26

标签: php wordpress woocommerce orders woocommerce-subscriptions

通过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'));

我拿起要与订单一起放置的产品。我已按要求将此功能的客户帐单地址硬编码。

当我运行该函数时,将创建一个空订单,其中未附加任何产品或地址。

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

order created without personal information or product

有人可以帮助我,告诉我哪里出了问题吗?

2 个答案:

答案 0 :(得分:0)

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

  • 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() {
    $product_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

答案 1 :(得分:0)

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

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

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