Как сделать поиск не только по товарам а и по категориям

категория: , Дорабатываем, Полезности


Опубликовано: 30.11.2017 Просмотров: 5575 Комментарии: 7


Как сделать поиск не только по товарам а и по категориям

Дорабатываем поиск что бы искал не только товары, но и категории


Приветствую друзья! Сегодня я хочу поделиться решением которое позволит выполнять поиск не только по товарам а и по категориям.

Зачем это нужно

Во-первых, идет более понятная выдача, многие покупатели просто не хотят искать в категориях ту что надо, особенно если их много. Они просто вбивают в поиск название того что ищут. Например, это может быть запрос Велосипед или Мотоцикл.

Во-вторых, в магазинах часто идет название категории а в ней идут модели товаров, часто без названия что это именно. Тот же пример на велосипедах. Есть категория Велосипеды в ней идут товары в названия которых есть только бренд и модель. В таком случае в стандартном поиске ничего не будет найдено из-за того что нет вхождений поискового запроса в названии товара.

Совсем другое дело когда мы добавим поиск по категориям, и тогда при поиске у нас будет выведена категория Велосипеды, перейдя в которую покупатель найдет то, что он искал.

Как это сделать

Для начала нам надо в модель добавить метод выборки категорий по исковому запросу. Для этого открываем файл catalog/model/catalog/category.php и добавляем эту функцию:

	public function getCategoriesLive($search) {
$category_data = array();
$sql = "SELECT * FROM " . DB_PREFIX . "category c
LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id)
LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE
cd.name LIKE '%" . $search . "%' 
AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "'
AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)";
$query = $this->db->query($sql);
foreach ($query->rows as $result) {
$category_data[$result['category_id']] = $this->getCategory($result['category_id']);
}
return $category_data;
}

После этого надо перейти в контроллер и добавить код для формирования массива найденных категорий. Открываем файл catalog/controller/product/search.php и перед строкой

$data['products'] = array();

Добавить строки:

		$data['cats'] = array();
$categories = $this->model_catalog_category->getCategoriesLive($search);
foreach($categories as $category){
$data['cats'][] = array(
'product_id' => $category['category_id'],
'name' => html_entity_decode($category['name'], ENT_QUOTES, 'UTF-8'),
'url'        => $this->url->link('product/category', 'path=' . $category['category_id'])
);
}

После чего переходим в шаблон и добавим вывод найденных категорий. Для этого открываем файл catalog/view/theme/ТЕМА/template/product/search.tpl где в нужном месте добавляем вывод категорий строками:

      <?php if ($cats) { ?>
        <h2>Найденные категории</h2>
        <ul>
          <?php foreach($cats as $cat) { ?>
            <li><a href="<?php echo $cat['url']; ?>"><?php echo $cat['name']; ?></a></li>
          <?php } ?>
        </ul>
      <?php } ?>

Этим кодом мы заставляем поиск искать и по категориям. На этом конечно не ограничивается, это как заготовка, которую можно расширять по своему усмотрению. Понятно, по аналогии можно можно сделать и в быстром поиске, да и везде где есть поиск.


Комментарии:


Фото комментатора

Сергей 26.02.2018

Доброго времени суток. У меня вопрос ,подскажите пожалуйста, этот метод "Поиск по категориям" написанный Вами ,подходит для Осторе 1.5.4.1
Администратор

Ответ for-opencart.com 26.02.2018

Добрый день! Конечно, на самом деле отличие версии 1.5 от 2 или 3 не такие уж и большие, весь приведенный код будет работать на всех версиях. Да, конечно, возможны какие-то правки под ту или иную версию, но код работает везде.
Фото комментатора

Антон 05.05.2018

Спасибо за материал. Очень было нужно. Работает. Только два вопроса как его улучшить: 1. Как выводить картинку категории? 2. если категория с таким названием есть, а товара нет, то ничего не выводится. как это решить?
Администратор

Ответ for-opencart.com 05.05.2018

1) Да, как и везде, посмотрите как это сделано в категории например что бы код портировать в поиск 2) Пока что не подскажу, смотрите по коду
Фото комментатора

Wild 15.11.2018

Спасибо, вы очень помогли! Как раз клиент попросил реализовать подобное. Сделал себе OCMod модификатор, чтобы использовать в будущем. Еще раз ОГРОМНОЕ спасибо!
Администратор

Ответ for-opencart.com 15.11.2018

Это хорошо, значит не зря веду блог :)
Фото комментатора

Михаил 25.02.2019

Круто, большое спасибо. Маленькая доработка запроса к базе - и он ищет не только по имени, но и по описанию категорий, где может быть немало ключевых слов.
Администратор

Ответ for-opencart.com 25.02.2019

Да, можно конечно, здесь по сути базовый код который можно доработать максимально :)
Фото комментатора

Александр 16.01.2020

А как сделать, чтобы при пустом запросе, не выводились категории или текст, как в товарах "Нет категорий, которые соответствуют критериям поиска". Сейчас выводятся все категории портянкой. Если категорий несколько сотен или тысяч, то сайт очень долго все это загружает.
Фото комментатора

Александр 16.03.2020

Добрый день. А я пытаюсь сделать поиск по атрибутам. Создал второе поле для поиска, добавил код, но в результате поиска выдает сразу два товара где присутствует этот атрибут. А нужно, чтобы совпадение было по двум атрибутам и в выводе один товар. Реализовывал через filter_name в модели
Администратор

Ответ for-opencart.com 16.03.2020

Добрый день! Надо смотреть код. Тяжело сказать
Фото комментатора

Илья 06.04.2020

Здравствуйте. У меня OcStroe 2.3 после изменения в файле catalog/model/catalog/category.php магазин перестает работать, при обновлении страницы белый пустой экран. Хорошо, что сделал резервную копию файла. В чем может быть причина? В каком месте страницы нужно прописывать код? Пробовал и в начале и в конце, результат один и тот же - сайт перестает открываться.
Администратор

Ответ for-opencart.com 06.04.2020

тяжело сказать, надо смотреть что это может быть

Быстрый поиск

Новое на сайте