[OpenCart] 1.5.5.1.x Убрать дубли товаров, более простой способ

Добрый день, уважаемые читатели!

Нашел более простой способ убрать дубли товаров, но версия OpenCart должна быть не менее 1.5.5.1.2

В новом OpenCart появились пути категорий и в таблице product_to_category появилось новое поле main_category

Внимание! Данный метод также будет работать ТОЛЬКО на уровень вложенности 2 (родительская -> дочерняя)

Т.е. в товаре во вкладке «Связи» -> категории должно быть выделено (пример):

[v] Компьютеры

[v] Компьютеры -> Ноутбуки

идем в catalog/controller/catalog/category.php

ищем (в чистом opencart это примерно 237 строка)

ОБРАТИТЕ ВНИМАНИЕ:

в этом контроллере есть еще один такой же цикл, который перебирает полученные категории, ОН НАМ НЕ НУЖЕН 🙂 ищите цикл именно после строчки

$results = $this->model_catalog_product->getProducts($data);
foreach ($results as $result) {


$results = $this->model_catalog_product->getProducts($data);
//Вызов метода getFoundProducts должен проводится сразу же после getProducts
//только тогда он выдает правильное значения количества товаров
$product_total = $this->model_catalog_product->getFoundProducts();

foreach ($results as $result) {

после foreach ($results as $result) { :


// Получаем дочернюю категорию к товару
$product_to_child_category = $this->model_catalog_category->getChildCategoryByProduct($result['product_id']);
$request_path = $product_to_child_category['main_category'] . '_' . $product_to_child_category['category_id'];

Далее переходим в массив товаров, ищем


$this->data['products'][] => array(

...

'href'        => $this->url->link('product/product', 'path=' . $this->request['path'] . '&product_id=' . $result['product_id'] . $url)

...

);

и меняем на:


'href'        => $this->url->link('product/product', 'path=' . $request_path . '&product_id=' . $result['product_id'] . $url)

Теперь идем в catalog/model/catalog/category.php и в конец класса модели добавляем функцию


public function getChildCategoryByProduct($product_id)
{
$query = $this->db->query("
SELECT `category_id`, `main_category` FROM `" . DB_PREFIX . "product_to_category`
WHERE `product_id` = '" . (int)$product_id . "' AND
`main_category` <> 0
");

return $query->row;
}

После этого в категориях будут отображаться полные пути к товарам

Далее, по такому же шаблону переделываем все модули, которые выводят ссылки на товары. Модель лучше использовать одну model_catalog_category с этой функцией.

Для гарантии качества сделаем проверку URL на странице товара!

Для этого в контроллере catalog/controller/product/product.php после


if($product_info) {

...

if (isset($this->request->get['page'])) {
$url .= '&page=' . $this->request->get['page'];
}

if (isset($this->request->get['limit'])) {
$url .= '&limit=' . $this->request->get['limit'];
}

дописываем


// Получаем дочернюю категорию к товару
$product_to_child_category = $this->model_catalog_category->getChildCategoryByProduct($product_id);
$request_path = $product_to_child_category['main_category'] . '_' . $product_to_child_category['category_id'];

if(!isset($this->request->get['path']) || $this->request->get['path'] !== $request_path) {
// 301
$this->redirect301($this->url->link('product/product', 'path=' . $request_path . '&product_id=' . $product_id . $url));
}

Обратите внимание, что я использую функцию $this->redirect301, это самописная функция, которая отправляет заголовки с 301 редиректом (перманентным). Я пробовал через функцию главного контроллера $this->redirect(), но получал всегда 302.. можете проверить у себя, но на всякий случай даю Вам мою функцию, которую нужно поместить в контроллер catalog/controller/product/product.php


protected function redirect301($url) {
header("HTTP/1.1 301 Moved Permanently");
header('Location: ' . $url);
exit();
}

Этот метод гораздо лаконичней и проще, чем мой первый метод, описанный в первой статье

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

  1. производители
  2. новинки
  3. рекомендуемые
  4. фильтры
  5. последние
  6. акции
  7. сравнение товаров
  8. закладки
  9. корзина и корзина-модуль
  10. оформление заказа
  11. и другие
No tags for this post.

10 комментариев

  1. подскажите, а как убрать дубли страниц по этой же методике в разделе рекомендуемых товаров? С каждым товаром можно связать другие товары, ссылки на которые будут выводиться на странице товара в разделе «см. так же».

Leave a Reply