I’m using the most recent versions of WordPress and WooCommerce.
I’m aware this might seem weird out of context, but I wanna add a hook to my functions.php that removes a certain product by ID from an order after the order has been placed.
Here is what I am working with so far:
add_action('woocommerce_new_order', 'custom_process_order', 10, 1);
function custom_process_order($order_id) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ($items as $item) {
if ($item->get_id()==10766) {
$order->remove_item( $item->get_id() );
}
}
return $order_id;
}
I am trying to remove the product with the ID 10766 from the order if said product is part of the order. I took this from a different, older post here so the code itself might not be perfect. It definitely isn’t working.
Update after some experimentation:
With the help of Cameron Hurd, I tried the following code:
add_action('woocommerce_new_order', 'custom_process_order', 10, 1);
function custom_process_order($order_id) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ($items as $item) {
if ($item->get_id() === 10766) {
$order->remove_item( $item->get_id() );
}
}
$order->save_items();
return $order_id;
}
This seemed promising, but pressing the checkout button will submit an empty order while also throwing an empty WooCommerce error message leaving the user on the checkout page.
After this I had 2 ideas:
1.) Changing remove_item
to wc_delete_order_item
. I really don’t know the difference and changing it didn’t seem to make a difference either.
2.) Changing the hook so it happens after the order is in the back end. I tried changing it from woocommerce_new_order
to woocommerce_thankyou
. This however broke the thank you page in addition to doing nothing to the order.
This is what I’m sitting with now:
add_action('woocommerce_checkout_create_order', 'custom_process_order', 10, 1);
function custom_process_order($order_id) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ($items as $item) {
$current_item_id = $item->get_id();
if ( $current_item_id === 10766) {
$order->remove_item($current_item_id);
}
}
$order->save_items();
return $order_id;
}
Still looking for a working answer.
Advertisement
Answer
You could use the woocommerce_checkout_order_processed
action hook,
where you then specify the product id.
So you get:
function custom_process_order( $order_id ) {
if( ! $order_id ) return;
// get order object
$order = new WC_Order( $order_id );
// get order items = each product in the order
$items = $order->get_items();
foreach ( $items as $item ) {
$product = wc_get_product( $item['product_id'] );
if ( $product->get_id() == 10766 ) {
$order->remove_item( $item->get_id() );
}
}
// Calculate
$order->calculate_totals();
// Save
$order->save();
}
add_action( 'woocommerce_checkout_order_processed', 'custom_process_order', 10, 1 );