Looking at WP_Tax_Query and WP_Meta_Query used by Wp_Query, they return their respective where clauses with an AND relation, and no hook or $args to change that behavior.
Furthermore, the tax_query is computed before the rest of the main query so that it’s included in the main query in term_taxonomy_id IN (...)
form. Also the WP_Tax_Query doesn’t accept a LIKE operator (see doc)
You can see the final query in WP_Query->request
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (1))
AND ( ( wp_postmeta.meta_key = 'city' AND wp_postmeta.meta_value LIKE '%Strip%' )
OR ( wp_postmeta.meta_key = 'state' AND wp_postmeta.meta_value LIKE '%Strip%' )
OR ( wp_postmeta.meta_key = 'salelease' AND wp_postmeta.meta_value LIKE '%Strip%' )
OR ( wp_postmeta.meta_key = 'zip' AND wp_postmeta.meta_value LIKE '%Strip%' ) )
AND wp_posts.post_type="post"
AND ((wp_posts.post_status="publish"))
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC LIMIT 0, 10
The solution for your issue is to do your own request with $wpdb
to get all posts ID that match your search value and then convert it to WP_Post objects array.
function search_posts($value)
{
global $wpdb;
$value="%".$wpdb->esc_like($value).'%';
$sql = $wpdb->prepare("SELECT p.ID
FROM {$wpdb->prefix}posts p
LEFT JOIN {$wpdb->prefix}postmeta m ON m.post_id = p.ID
LEFT JOIN {$wpdb->prefix}term_relationships r ON r.object_id = p.ID
LEFT JOIN {$wpdb->prefix}term_taxonomy tt ON tt.term_taxonomy_id = r.term_taxonomy_id AND tt.taxonomy = 'type'
LEFT JOIN {$wpdb->prefix}terms t ON t.term_id = tt.term_id
WHERE p.post_status="publish" AND p.post_type="property"
AND ((m.meta_key = 'city' AND m.meta_value LIKE %s)
OR (m.meta_key = 'state' AND m.meta_value LIKE %s)
OR (m.meta_key = 'salelease' AND m.meta_value LIKE %s)
OR (m.meta_key = 'zip' AND m.meta_value LIKE %s)
OR (t.name LIKE %s))
GROUP BY p.ID", $value, $value, $value, $value, $value);
$ids = $wpdb->get_col($sql);
if (is_array($ids) && count($ids) > 0)
return array_map('get_post', $ids);
else
return []; // or whatever you like
}