Woocommerce membership plugin : include custom field in admin search

I had a hard time finding how to add custom field to admin search under woocommerce > members list. The woocommerce membership plugin is in fact using the ‘posts_clauses’ filter to filter the search result. So to add custom fields, here is the code I use :

 
function advanced_admin_custom_search($pieces, WP_Query $wp_query) {
    global $wpdb;

    if (!is_admin() ) return $pieces;

    if (!array_key_exists('post_type', $wp_query->query)) return $pieces;

    // bail out if not the correct post type
    if ( 'wc_user_membership' === $wp_query->query['post_type'] ) {
       
        // $wp_query->set( 'post_type',  'wc_user_membership' );

        // search
        if ( isset( $wp_query->query['s'] ) ) {
            
            // add here your acf fields
            $list_searcheable_acf = array("my_acf_field_name");

            // get search expression
            $terms = $wp_query->query_vars[ 's' ];
                    
            // explode search expression to get search terms
            $exploded = explode( ' ', $terms );
            if( $exploded === FALSE || count( $exploded ) == 0 )
                $exploded = array( 0 => $terms );
                
            // reset search in order to rebuilt it as we whish
            $where = $pieces['where'];
            
            foreach( $exploded as $tag ) :
                $where .= " 
               OR EXISTS (
                    SELECT * FROM " . $wpdb->postmeta . "
                        WHERE post_id = " . $wpdb->posts . ".ID
                            AND " . $wpdb->posts . ".post_type = 'wc_user_membership'
                            AND (";
                foreach ($list_searcheable_acf as $searcheable_acf) :
                    $where .= " (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value REGEXP '[[:<:]]{$tag}[[:>:]]') ";
                endforeach;
                    $where .= ")
                )";
            endforeach;

            // replace the where clauses
            $pieces['where'] = $where;
        }
    }

	return $pieces;
}


add_filter( 'posts_clauses', 'advanced_admin_custom_search', 500, 2 ); 

 

Leave a Reply

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