Обновление main_category (главной категории)

Baco

Baco

architect
#1
недавно столкнулся с проблемой, где товаров овер 80К и нужно было обновить для них main_category по алгоритму выборки родителя ($path = родитель_дитя_внук), для чего и с какой целью - упущу, сам факт логики следующий:
0. обнуляем по всей таблице значения на 0:
PHP:
$this->db->query("UPDATE `" . DB_PREFIX . "product_to_category` SET `main_category` = 0");
1. выбираем по нужному алгоритму (родитель\внук) ID категорию для обновления (ASC\DESC) :
PHP:
$this->db->query("SELECT `category_id` FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product['product_id'] . "' ORDER BY `category_id` ASC LIMIT 1");
p.s. $product['product_id'] - идентификатор товара, в контексте обновления приведу пример кода ниже.
2. собственно само обновление:
PHP:
$this->db->query("UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE category_id = '" . (int)$query->row['category_id'] . "' AND product_id = '" . (int)$product['product_id'] . "'");
___
в итоге данной логики, мой код на обновление родителя выглядит вот так:
PHP:
// выборка всех товаров, у которых статус "включено"
$product_data = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE status = 1");    
if ($product_data->num_rows) {
    // обнуление всех главных категорий
    $this->db->query("UPDATE `" . DB_PREFIX . "product_to_category` SET `main_category` = 0");
    foreach ($product_data->rows as $product) {
        // выборка родительских категорий по товару
        $query = $this->db->query("SELECT `category_id`, `main_category` FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product['product_id'] . "' ORDER BY `category_id` ASC LIMIT 1");
        // для выборки внуков (последних категорий в иерархии) нужно заменить "...ORDER BY `category_id` ASC LIMIT 1");" на "...ORDER BY `category_id` DESC LIMIT 1");"
        if ($query->num_rows) {
            // если ранее не задано положение main_category = '1', тогда проставляем его
            if (!$query->row['main_category']) {
                $this->db->query("UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE category_id = '" . (int)$query->row['category_id'] . "' AND product_id = '" . (int)$product['product_id'] . "'");
            }            
        }
    }
}
 
OP
Baco

Baco

architect
Thread Starter #3
то по надобности, если такое случилось, если нужно поменять массово с конечного урла на начальный в иерархии привязку к главной категории, например:
есть URL: www.mysite.com/parent-category/subcategory/child-category/product.html - смоделированный урл товара 4-го уровня вложенности, что не сильно айс для поисковиков, проходит Артур и говорит, что если хотите, чтобы я взялся за SEO, нужно уменьшить вложенность в длинне урла в товарах. товаров - овер 15К, даже с батч-эдитором это довольно ресурсоёмкий процесс. поэтому, можно использовать алгоритм вышеописанный с дополнительным внесением "старого" урл-а в базу редиректов (301), если он отличителен от нового и сформировать новый урл по логике, чтобы было по типу: www.mysite.com/parent-category/product.html, хотя шаманский инструмент от Славы, позволяет указывать урл товара без привязки к разделу, но не все имеют такой функционал, а решение - оно так, не только для шопмейкеров под бро.
 
Зверху