woocommerce: как использовать wc_create_order с подписным продуктом

Я хочу создать новый порядок программно.

Этот код хорошо работает с простым продуктом,

$product = get_product($product_id); $order = wc_create_order(); $order->add_product( $product , 1 ); $order->calculate_totals(); // assign the order to the current user update_post_meta($order->id, '_customer_user', get_current_user_id() ); // payment_complete $order->payment_complete(); 

но когда я использую его для подписного продукта, он не добавляет подписку, он только добавляет заказ.

Solutions Collecting From Web of "woocommerce: как использовать wc_create_order с подписным продуктом"

Вот мой код для создания подписки – для того, чтобы все это понять, потребовалось много проб и ошибок. Удачи!

 function create_test_sub() { $email = 'test@test.com'; $start_date = '2015-01-01 00:00:00'; $address = array( 'first_name' => 'Jeremy', 'last_name' => 'Test', 'company' => '', 'email' => $email, 'phone' => '777-777-777-777', 'address_1' => '31 Main Street', 'address_2' => '', 'city' => 'Auckland', 'state' => 'AKL', 'postcode' => '12345', 'country' => 'AU' ); $default_password = wp_generate_password(); if (!$user = get_user_by('login', $email)) $user = wp_create_user( $email, $default_password, $email ); // I've used one product with multiple variations $parent_product = wc_get_product(22998); $args = array( 'attribute_billing-period' => 'Yearly', 'attribute_subscription-type' => 'Both' ); $product_variation = $parent_product->get_matching_variation($args); $product = wc_get_product($product_variation); // Each variation also has its own shipping class $shipping_class = get_term_by('slug', $product->get_shipping_class(), 'product_shipping_class'); WC()->shipping->load_shipping_methods(); $shipping_methods = WC()->shipping->get_shipping_methods(); // I have some logic for selecting which shipping method to use; your use case will likely be different, so figure out the method you need and store it in $selected_shipping_method $selected_shipping_method = $shipping_methods['free_shipping']; $class_cost = $selected_shipping_method->get_option('class_cost_' . $shipping_class->term_id); $quantity = 1; // As far as I can see, you need to create the order first, then the sub $order = wc_create_order(array('customer_id' => $user->id)); $order->add_product( $product, $quantity, $args); $order->set_address( $address, 'billing' ); $order->set_address( $address, 'shipping' ); $order->add_shipping((object)array ( 'id' => $selected_shipping_method->id, 'label' => $selected_shipping_method->title, 'cost' => (float)$class_cost, 'taxes' => array(), 'calc_tax' => 'per_order' )); $order->calculate_totals(); $order->update_status("completed", 'Imported order', TRUE); // Order created, now create sub attached to it -- optional if you're not creating a subscription, obvs // Each variation has a different subscription period $period = WC_Subscriptions_Product::get_period( $product ); $interval = WC_Subscriptions_Product::get_interval( $product ); $sub = wcs_create_subscription(array('order_id' => $order->id, 'billing_period' => $period, 'billing_interval' => $interval, 'start_date' => $start_date)); $sub->add_product( $product, $quantity, $args); $sub->set_address( $address, 'billing' ); $sub->set_address( $address, 'shipping' ); $sub->add_shipping((object)array ( 'id' => $selected_shipping_method->id, 'label' => $selected_shipping_method->title, 'cost' => (float)$class_cost, 'taxes' => array(), 'calc_tax' => 'per_order' )); $sub->calculate_totals(); WC_Subscriptions_Manager::activate_subscriptions_for_order($order); print "<a href='/wp-admin/post.php?post=" . $sub->id . "&action=edit'>Sub created! Click here to edit</a>"; } 

Вот пример

  $order_data = array( 'status' => 'completed', 'customer_id' => 1, 'customer_note' => '', 'total' => '', ); $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; // Required, else wc_create_order throws an exception $order = wc_create_order( $order_data );