First off, if only WordPress doesn't escape the % characters in the value (i.e. the search keyword), you could've simply replaced spaces in the search keyword with %, hence you'd get a clause like meta_value LIKE '%John%Doe%' which would match John B. Doe.
So because the % in the search keyword is being escaped (which is a good thing, BTW), then you can instead use REGEXP (regular expression search) and then replace the spaces with a .* which is equivalent to the % in a LIKE clause.
Working Example
Replace this in your code:
$args['meta_query']['name_search']['compare'] = "LIKE";
$args['meta_query']['name_search']['value'] = $_POST['search'];
with this:
// Build the regular expression pattern.
$list = preg_split( '/ +/', trim( $_POST['search'] ) );
$regex = implode( '.*', array_map( 'preg_quote', $list ) );
// Then set 'compare' to REGEXP and 'value' to the above pattern.
$args['meta_query']['name_search']['compare'] = 'REGEXP';
$args['meta_query']['name_search']['value'] = $regex;
Tried & tested working in WordPress 5.7.2, but do take note of the "not multibyte safe" warning in the MySQL reference manual.
Alternate Solution (equivalent to the one above)
If you want to use LIKE and not REGEXP, but don't want to end up with potentially lots of meta queries for the same key, then you can:
Use three search fields, namely first name, last name, and middle initial, and three meta clauses, one for each search field, but all having key set to _full_name. E.g.
/*
* Assuming your form contains these:
<input name="first_name">
<input name="last_name">
<input name="middle_initial">
*/
$name_search = array(
'relation' => 'AND',
);
// * okay, this still uses 3 clauses, but it always would be just 3 clauses
foreach ( array( 'first_name', 'last_name', 'middle_initial' ) as $name ) {
if ( ! empty( $_POST[ $name ] ) ) {
$name_search[ $name ] = array(
'key' => '_full_name',
'value' => sanitize_text_field( $_POST[ $name ] ),
'compare' => 'LIKE',
);
}
}
$args['meta_query']['name_search'] = $name_search;
REGEXPas thecomparevalue.. So you could use regular expression search. - Sally CJvalueas it is currently in the question, were you? I mean, keep in mind that special characters like.("dots") need to be properly escaped. - Sally CJJohn.*Doeas thevalue. However, if by "members" you're referring to users in the WordPress users table (wp_users), then WordPress actually adds two custom fields (first_nameandlast_name) for each user, so you could just use those fields and as for the middle initial, you could use another field, e.g.middle_initial, and then you would just query those fields with anORrelation.. - Sally CJ