Ако във вашия 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` );