Массово добавить главную категорию товара в OpenCart
Нужно назначить главные категории для всех товаров SeoPro OpenCart? Легко!
1. Создайте файл main_category_solve.php
2. Вставьте в него следующий код:
<?php require_once 'config.php'; require_once DIR_SYSTEM . 'library/db/' . DB_DRIVER . '.php'; $db = new \DB\MySQLi(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT); $sql = "SELECT DISTINCT p2c.product_id" . " FROM " . DB_PREFIX . "product_to_category as p2c" . " WHERE p2c.product_id NOT IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE main_category = '1')"; //echo $sql; $query = $db->query($sql); if ($query->num_rows > 0) { foreach ($query->rows as $row) { $main_category_id = solveMainCategory($row['product_id']); echo $row['product_id'] . " -- $main_category_id<br>"; $sql = "UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE product_id = '" . (int)$row['product_id'] . "' AND category_id = '" . (int)$main_category_id . "'"; $query = $db->query($sql); } } function solveMainCategory($product_id) { global $db; $result_category_id = 0; $sql = "SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"; $query = $db->query($sql); if (1 == $query->num_rows) { $result_category_id = $query->row['category_id']; } if ($query->num_rows > 1) { // Определяем главную категорию товара по уровню вложенности // Но! // Товар может принадлежать двум подкатегориями с одинаковым уровнем вложенности, // которые при это имеют совершенно разные родительские категории!! $array = []; foreach ($query->rows as $row) { $level = getPath($row['category_id']); $array[$row['category_id']] = $level; } $max_level = max($array); foreach ($array as $category_id => $level) { if ($level < $max_level) { unset($array[$category_id]); } } $result_category_id = max(array_keys($array)); } return $result_category_id; } function getPath($category_id) { global $db; $sql = "SELECT level FROM " . DB_PREFIX . "category_path WHERE category_id = '" . (int)$category_id . "' AND path_id = '" . (int)$category_id . "'"; $query = $db->query($sql); return $query->row['level']; }
3. Загрузите получившийся файл в корневую папку сайта (там еще должны быть файлы, вроде robots.txt, yandex-verification*)
4. Откройте ссылку [ваш_сайт]/main_category_solve.php
5. При открытии ссылки скрипт обработает данные и добавит главные категории для всех товаров, которые есть на данный момент в системе OpenCart. Однако, если на вашем сайте настроен регулярный импорт товаров, то новые товары могут снова не содержать главной категории. В таком случае эту ссылку либо надо открывать каждый день, либо добавить ее в крон-задачи (например, через wget).
На заметку:
В OpenCart 2.x / ocStore 2.x, чтобы модуль SeoPro работал, каждому товару нужно назначить главную категорию товара. В SeoPro, который встроен в ocStore 3, а также в обоих вариантах модуля SeoPro, которые доступны для OpenCart 3 это уже не нужно. Ведь при открытии товара, вы все равно попадете на ссылку, которая уже будет содержать автоматически подобранную главную категорию.
В общем, данный скрипт может понадобиться только, если Вы используете OpenCart 2 или ocStore 2.