WooCommerce: Search Products By Custom Field (Backend)

In WooCommerce, there are two kinds of search: the customer one (frontend) and the admin one (backend). We’ve already covered how to let customers search into custom field values on top of the default product title and description, so this time we’ll talk about the backend search.

Let’s say, as a WooCommerce store admin, that you’ve added a product custom field (e.g. “gtin“), and you want to make sure the backend search also returns products where “gtin” is equal to the search term. The snippet below will help you do that. Enjoy!

I’d like to search products by “ABC” as per the screenshot above, where “ABC” could also be present in some custom fields. The snippet below fixes that.

PHP Snippet: Allow Admin to Search Products By Custom Field @ WordPress Dashboard

/**
 * @snippet       Search by Custom Field @ WP Dashboard
 * @how-to        Get CustomizeWoo.com FREE
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 7
 * @community     https://businessbloomer.com/club/
 */

add_filter( 'posts_where', 'bbloomer_search_products_by_custom_field_in_admin', 9999, 2 );

function bbloomer_search_products_by_custom_field_in_admin( $where, $wp_query ) {	
    global $wpdb, $pagenow;
    $post_type = 'product';
    $custom_fields = array(
        "gtin",
		  "ean",
    );
    if ( is_admin() && 'edit.php' === $pagenow && $wp_query->query['post_type'] === $post_type && isset( $_GET['s'] ) ) {
		$get_post_ids = array();
		foreach ( $custom_fields as $custom_field_name ) {
			$args = array(
				'posts_per_page' => -1,
				'post_type' => $post_type,
				'meta_query' => array(
					array(
						'key' => $custom_field_name,
						'value' => wc_clean( wp_unslash( $_GET['s'] ) ),
						'compare' => 'LIKE'
					)
				),
				'fields' => 'ids',
			);
			$posts = get_posts( $args );
			if ( ! empty( $posts ) ) {
				foreach ( $posts as $post_id ) {
					$get_post_ids[] = $post_id;
				}
			}
		}
		$search_ids = array_filter( array_unique( array_map( 'absint', $get_post_ids ) ) );
		if ( count( $search_ids ) > 0 ) {
			$where = str_replace( "wp_posts.ID IN (0)", "wp_posts.ID IN (" . implode( ',', $search_ids ) . ")", $where );
		}		
	}	
    return $where;	
}

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: Add Second Description @ Product Category Pages
    In terms of SEO, if you’re trying to rank your product category pages, you really need to make the most of the default WooCommerce product category “description” and “thumbnail”. Most themes, if compatible with WooCommerce, will show this content right below the product category name and above products. Nothing new so far. But what if […]
  • WooCommerce: Add Custom Field to Product Variations
    Adding and displaying custom fields on WooCommerce products is quite simple. For example, you can add a “RRP/MSRP” field to a product, or maybe use ACF and display its value on the single product page. Easy, yes. Unfortunately, the above only applies to “simple” products without variations (or the parent product if it’s a variable […]
  • WooCommerce: Add Custom Product Fields (e.g. RRP) Without a Plugin
    The manufacturer’s suggested retail price (MSRP), or the recommended retail price (RRP), is the price at which the manufacturer recommends that the retailer sells the product at. You might have seen this in an ad, on a magazine, on a price tag: “RRP: $50. Our price: $39!”. WooCommerce entrepreneurs can take advantage of this “marketing […]
  • WooCommerce: Show Product Custom Field in the Category Pages
    A client asked me to show a given custom field in the loop (i.e. Shop page, Category pages, Tag pages = anywhere woocommerce products are returned). Interestingly enough, she didn’t want to show the product short description (see “show product short description on the homepage only” snippet) but a custom field, so here’s how you […]
  • 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

14 thoughts on “WooCommerce: Search Products By Custom Field (Backend)

  1. I had to replace

    $where = str_replace( "wp_posts.ID IN (0)", "wp_posts.ID IN (" . implode( ',', $search_ids ) . ")", $where );

    to

    $where = str_replace( "wp_posts.ID IN (0,0)", "wp_posts.ID IN (" . implode( ',', $search_ids ) . ")", $where );

    in order to make it work for some reason.

  2. Is it possible to make for publicy in a search bar to search a product by custom fields?

  3. I have a gtin_code custom field created like this :

    woocommerce_wp_text_input(
    		array(
    			'id' => 'gtin_code',
    			'label' => __('GTIN', 'fpe_themes'),
    			'description'   => __( 'UPC, EAN, and ISBN', 'fpe_themes' ),
    			'desc_tip' => 'true'
    		)
    	);
    

    I’ve changed the array gtin to gtin_code but doen’t look like it work.
    Do I have to launch an re-index or something.

    1. Uhm. Can you try with “_gtin_code” out of curiosity?

  4. Hi Rodolfo
    I’ve placed the “PHP Snippet: Allow Admin to Search Products By Custom Field @ WordPress Dashboardis PHP” code into a new Code snippet but the results aren’t the right one (see screenshot)
    Can you help me please? Grazie in anticipo
    Eric
    Where can I send you a screen shot?

    1. Weird. You can upload your screenshot somewhere online and send me the link. Let me know

      1. Hi Rodolfo
        Sorry for the late reply. Here the link
        https://capture.dropbox.com/OVGMhDdOTnAmvW9c
        I create a new snippet and I paste the code inside
        I try it but it didn’t get me the right results
        Quiet al my fields are personalized
        Eric

        1. And your custom field keys are definitely “gtin” and “ean”?

          1. No, I’ve type for example the name of a winemaker like RΓ©gis Descotes

            1. Thank you. In the snippet, you need to make sure you’re using the right custom field keys. If the winemaker field has the key “winemaker”, then you need to use this inside the snippet, otherwise it will look for “gtin” or “ean” custom fields, which you probably don’t use. Makes sense?

              1. Does this work with HPOS?

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 *