Как искать по категориям и/или меткам?
На моем блоге есть функция поиска. Если я ввожу значение, например 'фрукты' в поисковую строку, и оно не совпадает ни с одним из постов, но является названием категории в блоге, то я хочу, чтобы отображались посты, принадлежащие этой категории.
Возможно ли изменить функциональность поиска, чтобы он включал поиск по всем категориям и, возможно, меткам в блоге?
Большое спасибо.
Я считаю, что приведённый выше код будет принимать ввод от пользователя и искать его в категории apple. Я имею в виду, что хочу, чтобы поиск охватывал все названия категорий и меток в блоге. Например, если я введу в поле поиска "фрукты", то, хотя у меня может не быть постов, содержащих текст "фрукты", я всё равно хочу, чтобы посты из этой категории появлялись в результатах поиска. Точно так же, если я введу в поиск "овощи" (другая категория), хочу видеть посты из категории овощей. Извиняюсь, что не уточнил это в вопросе, сейчас его отредактирую.

Почему бы просто не сделать выпадающий список со всеми вашими категориями и/или метками и ссылаться на них? Или у вас слишком много категорий/меток? Кстати: вы уже искали в репозитории плагинов что-то, что может это делать? И ещё: я отредактировал заголовок вашего вопроса для большей ясности.

Вот функция, которая ищет все категории (или другие таксономии), соответствующие заданной строке, а затем возвращает все записи, включенные в эту категорию.
function searchTermPosts(String $query) {
// Сначала получаем категории/таксономии, у которых 'name like' совпадает с запросом
$terms = get_terms([ "name__like" => $query ]);
// Преобразуем в таксономический запрос, который можно использовать в WP_Query
$tax_query = array_map(function ($term) {
return [
"taxonomy" => $term->taxonomy,
"terms" => $term->term_taxonomy_id
];
}, $terms);
// Добавляем условие "OR", чтобы найти записи во всех категориях
$tax_query["relation"] = "OR";
// Выполняем запрос
$results = new \WP_Query([
"tax_query" => $tax_query
]);
// Возвращаем результаты, термины и их названия
return [
"results" => $results,
"terms" => $terms,
"term_names" => array_map(fn ($t) => $t->name, $terms)
];
}
Пример использования:
$query = searchTermPosts("фрукты");
$count = $query['results']->found_posts;
$cats = implode(",", $query['term_names']);
echo "Найдено $count результатов в категориях: $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>";
