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