Menu Close

WooCommerce: Search Products By Custom Field (Backend)

default

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
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

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;	
}
View Source
Posted in WooCommerce Tips