1. Начало
  2. Уеб сайт
  3. Уеб приложения
  4. OpenCart
  5. OpenCart 1.5 – Бавно зареждане при голям брой продукти в магазина

OpenCart 1.5 – Бавно зареждане при голям брой продукти в магазина

Ако във вашия OpenCart онлайн магазин има много голям брой продукти и забележите забавено зареждане, може да опитате да оптимизирате скоростта със следните две настройки.

Преди да започнете с оптимизацията направете бекъп на сайта.

1. Спиране на изчисляването и показването на броя продукти

Една от основните причини за бавно зареждане на сайтове на OpenCart е броят на категориите и продуктите. Причината за това е, че системата на много места в кода си изчислява общия им брой. Нарастването на броя води до увеличаване на забавянето при зареждане на сайта.

За да спрете изчисляването на броя продукти по категории, извършете малка редакция в три файла на OpenCart:

/catalog/controller/product/category.php

В този файл намерете следните редове и ги променете от:

$product_total = $this->model_catalog_product->getTotalProducts($data);
 
$this->data['categories'][] = array(
'name'  => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url)
);

на:

//$product_total = $this->model_catalog_product->getTotalProducts($data);
$product_total = 0;
$this->data['categories'][] = array(
//'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'name' => $result['name'],
'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url)
);

/catalog/controller/common/header.php

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

Намерете следните редове в този файл и ги променете от:

$product_total = $this->model_catalog_product->getTotalProducts($data);
 
$children_data[] = array(
'name' => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
);

на:

//$product_total = $this->model_catalog_product->getTotalProducts($data);
 
$children_data[] = array(
  'name'  => $child['name'],
  'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']) 
);

/catalog/controller/module/category.php

Спиране на изчислението и за категориите, в менюто вляво на сайта.

Променете следните редове от:

$product_total = $this->model_catalog_product->getTotalProducts($data);
 
$total += $product_total;
 
$children_data[] = array(
'category_id' => $child['category_id'],
'name'        => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'href'        => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']) 
);

на:

//$product_total = $this->model_catalog_product->getTotalProducts($data);
//$total += $product_total;
$total = 0;
$product_total = 0;
 
$children_data[] = array(
'category_id' => $child['category_id'],
//'name' => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),
'name' => $child['name'],
'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
);

В същия файл се премахва броя и за основните категории.

Променете следните редове от:

$this->data['categories'][] = array(
'category_id' => $category['category_id'],
'name'        => $category['name'] . ($this->config->get('config_product_count') ? ' (' . $total . ')' : ''),
'children'    => $children_data,
'href'        => $this->url->link('product/category', 'path=' . $category['category_id'])
);

на:

$this->data['categories'][] = array(
'category_id' => $category['category_id'],
//'name' => $category['name'] . ($this->config->get('config_product_count') ? ' (' . $total . ')' : ''),
'name' => $category['name'],
'children' => $children_data,
'href' => $this->url->link('product/category', 'path=' . $category['category_id'])
);

2. Оптимизация на базата данни

Тази оптимизация засяга базата данни на онлайн магазина, като се поставят индекси в определени таблици.

Описаните редове с код представляват SQL заявки, които можете да копирате, поставите в секция SQL на phpMyAdmin и изпълните. Веднъж поставен, индексът е постоянен и не е необходимо в бъдеще да го поставяте отново. Обърнете внимание и ако е необходимо, променете префикса на таблиците (в посочените примери префиксът е oc_).

Таблиците за категориите

ALTER TABLE `oc_category` ADD INDEX ( `parent_id` ) ;
ALTER TABLE `oc_category` ADD INDEX ( `top` ) ;
ALTER TABLE `oc_category` ADD INDEX ( `sort_order` ) ;
ALTER TABLE `oc_category` ADD INDEX ( `status` ) ;
ALTER TABLE `oc_category_description` ADD INDEX ( `language_id` );
ALTER TABLE `oc_category_to_store` ADD INDEX ( `store_id` );

В случай че имате много подкатегории с подкатегории, с подкатегории и т.н., поставете индекс на колоната path_id:

ALTER TABLE `oc_category_path` ADD INDEX ( `path_id` );

Таблиците за продуктите

ALTER TABLE `oc_product` ADD INDEX ( `model` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `sku` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `upc` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `manufacturer_id` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `sort_order` ) ;
ALTER TABLE `oc_product` ADD INDEX ( `status` ) ;
ALTER TABLE `oc_product_option` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `product_option_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `product_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_product_option_value` ADD INDEX ( `option_value_id` ) ;
ALTER TABLE `oc_product_to_category` ADD INDEX ( `category_id` );
ALTER TABLE `oc_product_attribute` ADD INDEX ( `attribute_id` );
ALTER TABLE `oc_product_attribute` ADD INDEX ( `language_id` );
ALTER TABLE `oc_product_description` ADD INDEX ( `language_id` );
ALTER TABLE `oc_product_to_store` ADD INDEX ( `store_id` );

Таблиците за опциите към продуктите

В случай че имате богат избор от опции към продуктите, добавете индекси и в следните таблици:

ALTER TABLE `oc_option` ADD INDEX ( `sort_order` ) ;
ALTER TABLE `oc_option_description` ADD INDEX ( `name` ) ;
ALTER TABLE `oc_option_value` ADD INDEX ( `option_id` ) ;
ALTER TABLE `oc_option_value_description` ADD INDEX ( `option_id` ) ;

Таблицата за приятелските адреси

ALTER TABLE `oc_url_alias` ADD INDEX ( `query` ) ;
ALTER TABLE `oc_url_alias` ADD INDEX ( `keyword` ) ;
ALTER TABLE `oc_url_alias` ADD INDEX ( `url_alias_id` );
Обновена: 18.03.2022

Беше ли Ви полезна тази статия?

Вижте още