Массово добавить главную категорию товара в 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.

Добавить комментарий