WooCommerce: Check if Product / Variation ID is in the Order

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!

The default Thank You page in WooCommerce

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
    }
});

Where to add custom code?

You should place custom PHP in functions.php and custom CSS in style.css of your child theme: where to place WooCommerce customization?

This code still works, unless you report otherwise. To exclude conflicts, temporarily switch to the Storefront theme, disable all plugins except WooCommerce, and test the snippet again: WooCommerce troubleshooting 101

Related content

  • WooCommerce: How to Add a Custom Checkout Field
    Let’s imagine you want to add a custom checkout field (and not an additional billing or shipping field) on the WooCommerce Checkout page. For example, it might be a customer licence number – this has got nothing to do with billing and nothing to do with shipping. Ideally, this custom field could show above the […]
  • WooCommerce: Get Order Data (total, items, etc) From $order Object
    As a WooCommerce development freelancer, every day I repeat many coding operations that make me waste time. One of them is: “How to get ____ if I have the $order variable/object?“. For example, “How can I get the order total“? Or “How can I get the order items“? Or maybe the order dates, customer ID, […]
  • WooCommerce: Allow Users to Edit Processing Orders
    How can WooCommerce customers edit an order they just placed and paid for? I swear I looked on search engine results and other places before coming to the conclusion I needed to code this myself. For example, a user might want to change the delivery date (if you provide this on the checkout page). Or […]
  • WooCommerce: How to Add a Custom Order Status
    All WooCommerce orders go to either “processing“, “completed“, “on-hold” and other default order statuses based on the payment method and product type. Sometimes these statuses are not enough. For example, you might need to mark certain orders in a different way for tracking, filtering, exporting purposes. Or you might want to disable default emails by […]
  • WooCommerce: Add Column to Orders Table @ WP Dashboard
    The WooCommerce Orders Table, which can be found under WP Dashboard > WooCommerce > Orders, provides us with 7 default columns: Order – Date – Status – Billing – Ship to – Total – Actions. This is used by shop managers to have an overview of all orders, before eventually clicking on a specific one. […]

Rodolfo Melogli

Business Bloomer Founder

Author, WooCommerce expert and WordCamp speaker, Rodolfo has worked as an independent WooCommerce freelancer since 2011. His goal is to help entrepreneurs and developers overcome their WooCommerce nightmares. Rodolfo loves travelling, chasing tennis & soccer balls and, of course, wood fired oven pizza. Follow @rmelogli

10 thoughts on “WooCommerce: Check if Product / Variation ID is in the Order

  1. You know, you are the best ๐Ÿ˜‰

  2. 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

    1. 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 ๐Ÿ™‚

  3. not working for product id now . i think woocommerce chnages its structure

    1. Hey Ranjit thanks for your comment! I don’t think they have changed it – can you try one more time please?

  4. 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.

    1. 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

  5. Is there a way to do this with the product category instead of ID? I’ve been searching for a solution with no luck.

    1. 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

Questions? Feedback? Customization? Leave your comment now!
_____

If you are writing code, please wrap it like so: [php]code_here[/php]. Failure to complying with this, as well as going off topic or not using the English language will result in comment disapproval. You should expect a reply in about 2 weeks - this is a popular blog but I need to get paid work done first. Please consider joining the Business Bloomer Club to get quick WooCommerce support. Thank you!

Your email address will not be published. Required fields are marked *