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        businessbloomer.com/woocommerce-customization
 * @author        Rodolfo Melogli, Business Bloomer
 * @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

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

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

  1. Is there a way to make this work also in the Upsells and Cross-sall ajax search box available under linked products field?
    Thank you!

    1. Razvan, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!

  2. I’m looking for a way to search by tag in the backend search, specifically on a WooCommerce site where I need to search for products with a particular tag in the admin. They’re not custom fields, so I don’t think this solution is directly applicable, but I’m wondering if there’s a way to make this work. Thanks!

    1. Steve, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!

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

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

  5. 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?

  6. 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 *