Wordpress (Woocommerce extension) - Create new order programmatically

后端 未结 8 1627
小蘑菇
小蘑菇 2021-01-31 11:29

I want to create a new order programmatically.

Workflow is simple: After submitting simple form, user will be created and along with that, a new order.

I managed

8条回答
  •  逝去的感伤
    2021-01-31 11:55

    There's a much easier way of doing it, using wc_create_order(). Here's an example, which also adds shipping and product line items. It also creates a Woocommerce subscription, but you can ignore that part for a normal product, the same code will work.

    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 "Sub created! Click here to edit";
    }
    

提交回复
热议问题