Here's a function that will search for any categories (or other taxonomies) that match the given string and then returns all the posts that are included in that category.
function searchTermPosts(String $query) {
// First get the categories / taxonomies that have a 'name like' the query
$terms = get_terms([ "name__like" => $query ]);
// Now convert to a taxonomy query we can use in WP_Query
$tax_query = array_map(function ($term) {
return [
"taxonomy" => $term->taxonomy,
"terms" => $term->term_taxonomy_id
];
}, $terms);
// Add an "OR" clause to find posts in all categories
$tax_query["relation"] = "OR";
// Now do the query
$results = new \WP_Query([
"tax_query" => $tax_query
]);
// Return both results and the terms, as well as term names
return [
"results" => $results,
"terms" => $terms,
"term_names" => array_map(fn ($t) => $t->name, $terms)
];
}
And then use it like this:
$query = searchTermPosts("fruits");
$count = $query['results']->found_posts;
$cats = implode(",", $query['term_names']);
echo "Found $count results in these categories: $cats";
echo "<ul>";
while ($query['results']->have_posts()) {
$query['results']->the_post();
echo '<li><a href="' . get_the_permalink() . '">';
the_title();
echo '</a></li>';
}
echo "</ul>";