Once a customer places an order, you might want to know if such an order contains a given product or variation ID. You can use this for tracking purposes, for redirecting to a custom thank you page or running your custom functions.
You can also run the check in the admin or in your custom functions, as long as you have access to the order ID or order object.
Enjoy!
PHP Snippet: Check If Order Contains Product ID
This PHP function bbloomer_check_order_product_id
checks if a specific product ID is present in an order. Here is a detailed explanation of the function and its usage.
wc_get_order( $order_id )
fetches the order object based on the given order ID. If no order is found, the function will return null
. Which means, the following line – if ( ! $order ) return;
– means that if the order is not found, the function exits early.
$items = $order->get_items();
retrieves all items associated with the order. We than loop through each item in the order, and retrieve their respective product ID. If the item is a variation, it gets the variation ID; otherwise, it gets the standard product ID.
if ( $this_product_id === $product_id )
checks if the current item’s product ID matches the given product ID (the one you want to find inside the order). If a match is found, the function returns true
. If the loop completes without finding a matching product ID, the function returns false
.
/**
* @snippet WooCommerce: Check if Product ID is in the Order
* @how-to Get CustomizeWoo.com FREE
* @author Rodolfo Melogli
* @compatible WooCommerce 9
* @community https://businessbloomer.com/club/
*/
function bbloomer_check_order_product_id( $order_id, $product_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) return;
$items = $order->get_items();
foreach ( $items as $item_id => $item ) {
$this_product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
if ( $this_product_id === $product_id ) {
return true;
}
}
return false;
}
Usage: as long as you have an order ID (e.g. 1234) and a product ID (e.g. 5678) you want to find inside the order, you would call the function as follows:
$order_id = 1234;
$product_id = 5678;
if ( bbloomer_check_order_product_id( $order_id, $product_id ) ) {
// The product is in the order
echo "Product is in the order.";
} else {
// The product is not in the order
echo "Product is not in the order.";
}
You can integrate this function into various WooCommerce hooks and actions to automate checks and custom actions. For example, you might use it in the woocommerce_thankyou
action, which runs after an order is completed:
add_action( 'woocommerce_thankyou', function( $order_id ) {
$product_id = 5678; // ID of the product you want to check
if ( bbloomer_check_order_product_id( $order_id, $product_id ) ) {
// Perform custom actions because the product is in the order
// For example, send a custom email or apply a special tag to the customer
}
});
You know, you are the best ๐
Cheers Neil ๐
Hi Rodolfo,
If I wanted to check if a certain ordered item in an order has a certain shipping class, and I want a notice to display a notice in the order processing email should that item be present – how would I adjust this code to achieve that?
Thanks,
Ryan
Hey Ryan! In a previous blog, I showed how to loop through the cart to look for shipping classes (just do a search on Business Bloomer for “shipping class” and you’ll find it). The order is slightly different, but you can learn the basics from that article anyway ๐
not working for product id now . i think woocommerce chnages its structure
Hey Ranjit thanks for your comment! I don’t think they have changed it – can you try one more time please?
Your video images are pointing to your staging site, I would do a search and replace on any of those so they don’t make a staging authentication box appear.
Dear Steven, thank you so much for spotting that issue! I’m having quite a few issues with the staging right now, but thankfully this has now been sorted. Can you please try again and report back? I really appreciate your help! Cheers, R
Is there a way to do this with the product category instead of ID? I’ve been searching for a solution with no luck.
Hello Tia, thanks so much for your comment! Answer: there is always a way ๐
Take a look at this guide https://businessbloomer.com/woocommerce-conditional-logic-ultimate-php-guide/ and try to see if there is a conditional rule you can apply to the products if they belong to a given category slug ๐
Let me know