Перейти к содержанию
  • записи
    4
  • комментариев
    68
  • просмотра
    3 303

Автоматический вывод товаров коллекции в рекомендуемые товары


mpn2005

3 669 просмотров

Для различных типов товаров часто возникает необходимость вывести товары в рекомендуемые автоматически, по определённому критерию. Нередко товары группируются по коллекциям, но штатными средствами OpenCart нет возможности их корректно объединить и добавить автоматически друг к другу как рекомендуемые товары. 

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

Данная доработка не затрагивает шаблоны, поэтому подходит для любой версии движка и сборки.

 

Для примера рассматривается вариант объединения в коллекции по совпадению поля EAN. 

По принципу - если поле EAN не пустое, то выводим такие товары в рекомендуемые.

 

В файле catalog/controller/product/product.php

Находим строку:

$results = $this->model_catalog_product->getProductRelated($this->request->get['product_id']);

И заменяем её на это:

$results = $this->model_catalog_product->getProductRelatedCollection($product_info);

 

В файле catalog/model/catalog/product.php

Перед строкой:

public function getProductRelated($product_id) {

Добавляем:

public function getProductRelatedCollection($product) {
    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';
    
    $product_data = array();

    if (!empty($product[$collection_field])) {
        $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE product_id != '" . (int)$product['product_id'] . "' AND status = '1' AND `" . $this->db->escape($collection_field) . "` LIKE '" . $this->db->escape($product[$collection_field]) . "' ORDER BY sort_order");

        foreach ($query->rows as $result) {
            $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
        }
    }

    return $product_data;
}

 

Если нужно выбирать товары только того же производителя, то функция должна выглядеть так:

public function getProductRelatedCollection($product) {
    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';
    
    $product_data = array();

    if (!empty($product[$collection_field])) {
        $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE product_id != '" . (int)$product['product_id'] . "' AND status = '1' AND manufacturer_id = '" . (int)$product['manufacturer_id'] . "' AND `" . $this->db->escape($collection_field) . "` LIKE '" . $this->db->escape($product[$collection_field]) . "' ORDER BY sort_order");

        foreach ($query->rows as $result) {
            $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
        }
    }

    return $product_data;
}

 

Если у вас много товаров, то стоит зайти в phpMyAdmin и добавить индекс для поля EAN. Это ускорит выборку товаров для коллекции. Добавить индекс можно таким запросом:

ALTER TABLE `oc_product` ADD INDEX `ean` (`ean`)

Обратите внимание на префикс 'oc_', он у вас может отличаться или отсутствовать.

18 Комментариев


Рекомендуемые комментарии

Спасибо за статью, не увидел только, для всех версий подходит это решение? И если это возможно, то как вывести если в атрибуте прописана коллекция?

Изменено пользователем Алексей
Ссылка на комментарий
В 27.05.2022 в 15:38, Алексей сказал:

Спасибо за статью, не увидел только, для всех версий подходит это решение? И если это возможно, то как вывести если в атрибуте прописана коллекция?

Вот тут написано.

Цитата

Данная доработка не затрагивает шаблоны, поэтому подходит для любой версии движка и сборки.

 

Ссылка на комментарий
В 27.05.2022 в 15:38, Алексей сказал:

если в атрибуте прописана коллекция?

Тут надо добавить запрос атрибута товара. И поменять выборку.

Как будет время, допишу данный момент.

Ссылка на комментарий
2 часа назад, Tom сказал:

А что, если по схожему названию товаров?

Тоже можно, но тут уже надо определять какой-то чёткий критерий.

Например по совпадению последнего слова в названии. Или иметь в названии какой-то чёткий разделитель для анализа.

Частичное совпадение по тексту - сам по себе не чёткий критерий, без дополнительного уточнения.

Ссылка на комментарий

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

Как вариант магазины мебели (шкаф, кровать, диван, банкетка).

Рыболовные снасти (леска, удилище, блесна).

Ну итд итп.

Ссылка на комментарий

Сделал модификатор для вывода коллекций в товарах, по описанному принципу, проверил - все работает. Если кому надо, выкладываю тут. Это мой первый опыт создания модификатора.

 

Ссылка на комментарий

Читал недавно описание одного из модулей модуля "Серии товаров".

Так вот он объединяет товары по схожему значению в поле mpn.

Имеем как вариант 15-20 товаров , у которых в поле mpn, вписано например "2022".

Получаем в карточке товара комплект схожих товаров...

Эта тема близка к данному решению.

Единственное, что принцип объединения разный.

Ну если я конечно правильно понял :
 

Цитата

По принципу - если поле EAN не пустое, то выводим такие товары в рекомендуемые.

 

Ссылка на комментарий
56 минут назад, Tom сказал:

Единственное, что принцип объединения разный.

Ну если я конечно правильно понял :

Получается всё так же.

Только поле EAN.

Но его легко и поменять:

    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';

 

Если поле пустое, то товары не тянутся, иначе туда все товары магазина могут улететь, что не очень хорошо.

Ссылка на комментарий

Спасибо, именно эта инструкция помогла мне для создания коллекций у светильников. Но есть ли вариант к примеру еще сделать альтернативу, что если товаров больше 20 добавить ссылку на посадочную страницу с этой коллекцией? К примеру есть коллекций "Star" в ней 700+ товаров, выводим рандомные 20 товаров и добавляем ссылку "Посмотреть всю коллекцию" и брать ссылку из другого поля?

Ссылка на комментарий
В 18.01.2023 в 12:59, greendaytoday сказал:

Спасибо, именно эта инструкция помогла мне для создания коллекций у светильников. Но есть ли вариант к примеру еще сделать альтернативу, что если товаров больше 20 добавить ссылку на посадочную страницу с этой коллекцией? К примеру есть коллекций "Star" в ней 700+ товаров, выводим рандомные 20 товаров и добавляем ссылку "Посмотреть всю коллекцию" и брать ссылку из другого поля?

 

Ссылка на комментарий
В 18.01.2023 в 13:59, greendaytoday сказал:

Спасибо, именно эта инструкция помогла мне для создания коллекций у светильников. Но есть ли вариант к примеру еще сделать альтернативу, что если товаров больше 20 добавить ссылку на посадочную страницу с этой коллекцией? К примеру есть коллекций "Star" в ней 700+ товаров, выводим рандомные 20 товаров и добавляем ссылку "Посмотреть всю коллекцию" и брать ссылку из другого поля?

Тут уже так просто не сделать. Нужно делать отдельный контроллер, для вывода всех этих товаров.

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

 

В 20.01.2023 в 00:48, greendaytoday сказал:

А модуль тут при чем? 

А он как раз и позволяет отобрать товары по критерию и из адмнки налепить нужных страниц.

Ссылка на комментарий
В 21.01.2023 в 22:25, mpn2005 сказал:

Тут уже так просто не сделать. Нужно делать отдельный контроллер, для вывода всех этих товаров.

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

 

А он как раз и позволяет отобрать товары по критерию и из адмнки налепить нужных страниц.

будьте добры, скажите, вот я не использую поле EAN , ну и чтобы не заполнять эти поля, могу я использовать модель для подборки рекомендуемых? заменив в коде ниже "ean" на "model"

я в рекомендемые хочу добавлять только товары из категории, а в поле "model" у меня как раз категория прописана. И еще такой момент, по сколько добавляется товаров? В идеале для меня чтобы по 4 было

public function getProductRelatedCollection($product) {
    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';
Ссылка на комментарий
В 23.04.2023 в 18:13, Леонид сказал:

заменив в коде ниже "ean" на "model"

Да. Можно.

 

В 23.04.2023 в 18:13, Леонид сказал:

В идеале для меня чтобы по 4 было

Можете добавить к запросу выборки "LIMIT 4" если надо ограничить.

Ссылка на комментарий
В 24.04.2023 в 15:45, mpn2005 сказал:

Да. Можно.

 

Можете добавить к запросу выборки "LIMIT 4" если надо ограничить.

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

Ссылка на комментарий
В 24.04.2023 в 17:51, Леонид сказал:

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

Это зависит от используемой сортировки.

Можно отсортировать по нужному критерию и они будут те же.

Можно сделать сортировку по RAND() и они будут всё время разные.

 

Ссылка на комментарий
Гость
Добавить комментарий...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...