Search code examples
woocommerce-rest-api

Woocommerce Custom Place Order API not working cart empty


public function RetriveCart($request){
    
    global $woocommerce;

    $woocommerce->frontend_includes();
    

    $user_id = $request['user_id']; 
    wp_set_current_user( $user_id );
    add_action('woocommerce_cart_calculate_fees', array($this,'woo_cart_fee_update'));  
    
    $woocommerce->session = new WC_Session_Handler();
    $woocommerce->session->init();
    $woocommerce->customer = new WC_Customer( get_current_user_id(), true );
    $woocommerce->cart = new WC_Cart();     
            
    $items = $woocommerce->cart->get_cart();
    if(empty($items)){
        $response['status'] = 0;
        $response['message'] = __("Cart is empty", self::domainText);
        $response['data'] = new stdClass();
        return new WP_REST_Response($response, 200);
    }
    
    foreach($items as $item => $values) { 
        $_product =  wc_get_product( $values['product_id']);        

        $cart[] = array('key'=>$item,
                        'product_id'=>$values['product_id'],
                        'title'=>$_product->get_title(),
                        'quantity'=>$values['quantity'],
                        'price'=>$_product->get_price(),
                        'subtotal'=> strval(($_product->get_price()+$addons_price) * $values['quantity']),                          
                        'currency_symbol'=>get_woocommerce_currency_symbol(),
                        

                    );
    }   
    
    WC()->cart->calculate_totals();
    $shipping = $woocommerce->cart->fee_total;
    
    $cart_summary = array('sub_total'=>$woocommerce->cart->subtotal,                            
                        'shipping_amount'=>$shipping,
                        'order_type'=>$order_type,
                        'is_deliverable'=>$is_deliverable,
                        'discount_amount'=>$woocommerce->cart->get_cart_discount_total(),
                        'tax_amount'=>$woocommerce->cart->tax_total,
                        'total_amount'=>$woocommerce->cart->total,
                        'currency_symbol'=>get_woocommerce_currency_symbol(),
                        
                        );
                        
    $output['cart_summary'] = $cart_summary;
    $output['items'] = $cart;
    $response['status'] = 1;
    $response['message'] = __("Cart Items found", self::domainText);
    $response['data'] = $output;
    return new WP_REST_Response($response, 200);
}


public function newOrder($request){
    global $wpdb,$woocommerce;
    $woocommerce->frontend_includes();
    $orderRequest = $request['order'];
    $user_id = $orderRequest['user_id']; 

    wp_set_current_user( $user_id ); 
    $woocommerce->session = new WC_Session_Handler();
    $woocommerce->session->init();
    $woocommerce->customer = new WC_Customer( get_current_user_id(), true );
    $woocommerce->cart = new WC_Cart();
    
    if ($woocommerce->cart->get_cart_contents_count() == 0) {
        $response['status'] = 0;
        $response['message'] = __('Cart is empty', self::domainText);
        $response['data'] = new stdClass();
        return new WP_REST_Response($response, 200);
    }

    $cart = $woocommerce->cart->get_cart();
            

    $order = wc_create_order(array('customer_id' => get_current_user_id()));
    $order_id = $order->id;
    foreach($cart as $item => $values) {
        $product = wc_get_product($values['product_id']);
        $quantity = (int)$values['quantity'];
        
        if(wc_prices_include_tax()){
            $product_price = wc_get_price_including_tax($product);
        }else{
            $product_price = wc_get_price_excluding_tax($product);  
        } 

        $variationsArray = array();
        $order->add_product($product, $quantity, $variationsArray);
       
    }



    $order->set_address( $orderRequest['billing_address'], 'billing' );
    $order->set_address( $orderRequest['shipping_address'], 'shipping' );
    $order->set_payment_method($orderRequest['payment_method']['id']);
    $get_fees = $woocommerce->cart->get_fees();

    foreach($get_fees as $fee_data){
        $item_fee = new WC_Order_Item_Fee();
        $item_fee->set_name($fee_data->name);
        $item_fee->set_amount($fee_data->amount);
        $item_fee->set_tax_class( '' );
        $item_fee->set_tax_status( 'none' );
        $item_fee->set_total($fee_data->total);
        $item_fee->save();
        $order->add_item($item_fee);
    } 
    if(!empty($coupon)){
        $order->apply_coupon($coupon[0]);
    }
    
    $order->update_status('created');
    $order->calculate_totals();  
    $woocommerce->cart->empty_cart();       

    
    $customer_id = $order->get_user_id();
    $response['status'] = 1;
    $response['message'] = __("Order $order_id is successfully placed", self::domainText);
    $response['order_id'] = $order_id;
    return new WP_REST_Response($response, 200);
}

In RetriveCart() all datas are there when I try place order. Its give me an empty cart and fees not added.


Solution

  • Found the solution here

    https://github.com/woocommerce/woocommerce/issues/23584#issuecomment-492592148

    just add something like

    add_filter( 'woocommerce_is_rest_api_request', 'simulate_as_not_rest' );
    
    function simulate_as_not_rest( $is_rest_api_request ) {
    
        if ( empty( $_SERVER['REQUEST_URI'] ) ) {
             return $is_rest_api_request;
        }
    
        // Bail early if this is not our request.
        if ( false === strpos( $_SERVER['REQUEST_URI'], 'MYCUSTOMROUTE/V1' ) ) {
            return $is_rest_api_request;
        }
    
        return false;
    }