Как искать по категориям и/или меткам?

15 мая 2011 г., 14:18:32
Просмотры: 18.1K
Голосов: 4

На моем блоге есть функция поиска. Если я ввожу значение, например 'фрукты' в поисковую строку, и оно не совпадает ни с одним из постов, но является названием категории в блоге, то я хочу, чтобы отображались посты, принадлежащие этой категории.

Возможно ли изменить функциональность поиска, чтобы он включал поиск по всем категориям и, возможно, меткам в блоге?

Большое спасибо.

0
Все ответы на вопрос 2
2
// Перед циклом в шаблоне результатов поиска:
if ( is_search() ) // Мы на странице результатов поиска?
{
    global $wp_query, $query_string;
    // теперь модифицируем/фильтруем запрос (результаты)
    query_posts( $query_string . 'cat=1&tag=apples+apples' );
}
15 мая 2011 г. 17:02:30
Комментарии

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

Mr B Mr B
15 мая 2011 г. 23:54:01

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

kaiser kaiser
16 мая 2011 г. 04:17:29
0

Вот функция, которая ищет все категории (или другие таксономии), соответствующие заданной строке, а затем возвращает все записи, включенные в эту категорию.

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>";
23 июл. 2020 г. 17:39:12