Jonas Lundman
Jonas Lundman

Reputation: 1490

Woocommerce Get the order_id from one of the item_id?

I try to get the related order (the order id) from one of the line items id.

One case for example: When editing an order, and deleting a line item (done by Ajax) the Woocommerce only provide the hook "woocommerce_before_delete_order_item" and passes $item_id only. (The woo function performs sql and not WP enviroment). I need the "belonging" order id to make some action!

My solution so far, is to loop through all orders and compare the Items ID, and break and return order ID when the match occurs.

This is way to slow, or "bulky clumsy", when keeping 10000 orders and more alive in the current shop.

This does NOT work:

wp_get_post_parent_id ( $item_id )

But Im hoping there is a similar call, or do I need to make a DB SQL search? Any answer involving mySQL, please make it "copy and paste ready". Im great at PHP but dont handle or never write my own SQL.

Thanks for any help! Below is my solution so far:

$order_id = my_wc_get_order_from_item_id($item_id);

function my_wc_get_order_from_item_id($id) {

    $orders = get_posts('post_type=shop_order&numberposts=-1&post_status=publish');
    foreach($orders as $obj) {
        $order = new WC_Order($obj->ID);
        if ( count( $order->get_items('line_item') ) > 0 ) { 
            foreach($order->get_items('line_item') as $item_id => $item ) {
                if($item_id == $id) $return_value = $obj->ID;
                if(isset($return_value)) break;
            }
        }
        unset($order);
        if(isset($return_value)) break;
    }

    if(isset($return_value)) return $return_value;
        else return 0;
}

Upvotes: 3

Views: 2198

Answers (2)

Dmitriy
Dmitriy

Reputation: 804

Use the built-in woocommerce function wc_get_order_id_by_order_item_id($item_get_id) to get order ID

// define the woocommerce_before_delete_order_item callback 
 function my_func_before_delete_order_item( $item_get_id ) { 
    
     $order_id = wc_get_order_id_by_order_item_id($item_get_id);

     // do what you need...
}; 
         
 // add the action 
add_action( 'woocommerce_before_delete_order_item', 'my_func_before_delete_order_item', 10, 1 ); 

Upvotes: 2

helgatheviking
helgatheviking

Reputation: 26329

Your approach didn't work because order items are not posts in the wp_posts table, so they can't have a post_parent.

However, all is not lost and this was easier than I expected considering that my SQL isn't that strong. Looking at the woocommerce_order_item table in the database you can see that order_id and order_item_id are both there: woocommerce_order_item table

so I borrowed a little SQL statement from WooCommerce and modified it to find the order_id given a particular order_item_id row. Let me know how that works.

function so_38286531_get_order_item_order_id( $item_id ) {
    global $wpdb;

    $order_id = $wpdb->get_var( $wpdb->prepare(
        "SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items
         WHERE order_item_id = %d",
        $item_id
    ) );

    return $order_id;
}

Upvotes: 2

Related Questions