Программное создание заказа WooCommerce для продукта по подписке

В woocommerce я использую плагин WooCommerce Subscriptions. Я создал функцию, которая может создавать заказ на основе артикула продукта с помощью функции wc_get_product_id_by_sku() из продукта по подписке.

Это моя функция на данный момент:

function create_new_order() {
    global $woocommerce;

    $address = array(
        'first_name' => 'Zakup',
        'last_name'  => 'Sklepowy',
        'email'      => '[email protected]',
        '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'));

Я забираю товар и ставлю его вместе с заказом. Я жестко запрограммировал платежный адрес клиента в этой функции, как это требуется.

Когда я запускаю функцию, создается пустой заказ, к которому не привязан ни продукт, ни адрес.

заказ создан без личной информации или продукта:

заказ создан без личной информации или продукта

Может ли кто-нибудь помочь мне и сказать, где что-то пошло не так?


person Maarten de Wolf    schedule 29.05.2019    source источник
comment
Вот что я имею в виду, хахаха, я имел в виду, когда вы создаете заказ, вы отправляете с ним переменный продукт.   -  person Maarten de Wolf    schedule 29.05.2019
comment
Прежде всего, я сейчас пытаюсь сделать sku wpoh-prof-webshop уже выбранным переменным продуктом. При загрузке этой функции он должен создать заказ. Как только он создаст заказ, функция должна увидеть, какой артикул включить в заказ + детали адреса. В тот момент, когда я загружаю функцию, она создает пустой заказ без адресных данных и без товара.   -  person Maarten de Wolf    schedule 29.05.2019
comment
Если вы читаете код, вы знаете, что он означает. wpoh-prof-webshop - это артикул продукта, который я ищу в $ product = new WC_Product (wc_get_product_id_by_sku ('wpoh-prof-webshop'));   -  person Maarten de Wolf    schedule 29.05.2019
comment
@LoicTheAztec, я изменил сообщение, вы можете проверить его еще раз?   -  person Maarten de Wolf    schedule 29.05.2019


Ответы (2)


Чтобы получить один из следующих объектов продукта подписки:

  • WC_Product_Subscription (subscription тип продукта, простая подписка),
  • WC_Product_Variable_Subscription (variable-subscription тип продукта),
  • WC_Product_Subscription_Variation (subscription_variation тип продукта).

Вы можете не использовать new WC_Product(), так как это вызовет ошибку.

Вместо этого вы должны использовать wc_get_product(). функция.

Теперь global $woocommerce; не требуется и ничего не делает.

Артикул: получите объект продукта из идентификатора продукта с помощью функции wc_get_product_id_by_sku():

Артикул всегда должен принадлежать простой подписке или вариативной подписке, но никогда не относиться к продукту с переменной подпиской ...

Попробуйте следующую слегка измененную функцию:

function create_new_order() {
    $sku = 'wpoh-prof-webshop';
    $address = array(
        'first_name' => 'Zakup',
        'last_name'  => 'Sklepowy',
        'email'      => '[email protected]',
        '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
}

Проверено и работает.

Связанный ответ: Получить объект продукта из артикула и обновить цену в WooCommerce

person LoicTheAztec    schedule 29.05.2019
comment
Куда мне это добавить? WC_Product_Subscription (тип продукта подписки, простая подписка), WC_Product_Variable_Subscription (тип продукта с переменной подпиской), WC_Product_Subscription_Variation (тип продукта subscription_variation). если я хочу, чтобы это была подписка, она работает как обычный банкомат заказа - person Maarten de Wolf; 03.06.2019
comment
@MaartendeWolf Этот код ответа основан на вашем, и он решает проблему пустого заказа (то, что вы просили): wc_get_product() работает для любого типа продукта, даже для типов продуктов по подписке. Что делает тип продукта с wc_get_product(), так это идентификатор продукта, который вы в нем задаете. Таким образом, если SKU из простого продукта подписки, вы получите объект WC_Product_Subscription или, если он из варианта подписки, вы получите объект WC_Product_Variable_Subscription… - person LoicTheAztec; 03.06.2019
comment
@MaartendeWolf Чтобы получить заказ на продление подписки, вы должны установить в этом порядке идентификатор родительского заказа, используя set_parent_id() (т.е. идентификатор заказа из первого первоначального заказа для подписки). Но это другой вопрос ... - person LoicTheAztec; 03.06.2019

Maarten de Wolf, вы можете добавить его в отдельный файл .php, но его нужно принять, добавив:

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

перед скриптом (он загружает, например, информацию о сеансе - вы вошли в систему как администратор).

person Virgin71    schedule 03.06.2019
comment
Спасибо, я сейчас пытаюсь создать продленную подписку для моего заказа. Может ты сможешь мне с этим помочь. заказ создается при загрузке функции. Но это как-то не возобновится - person Maarten de Wolf; 03.06.2019