Rozwiązanie testowane w PrestaShop 8.2.3
Zawartość artykułu
Opis modyfikacji
Jeśli nie przypiszemy produktu do danej kateogrii nie będzie w niej wyświetlany. Także tyczy się to podkategorii. Samo ulokowanie produktu w kategorii podrzędnej nie skutkuje tym, że pojawi się on w nadrzędnej. Przedstawmy to na przykładzie:
Powiedzmy że mamy drzewo kategorii:
- Ubrania
- podkoszulki
- bluzy
- spodnie
- Pamiątki
- kubki
- pocztówki
- magnesy
- Literatura
- książki
- czasopisma
- gazety
Np. jeśli produkty znajdują się w którejś z podkategorii:
- podkoszulki
- bluzy
- spodnie
Nie powoduje to, że automatyczne pojawią się w „Ubrania”. Należy wejść do każdego produktu z osobna i przypisać do niego też kategorię „Ubrania”
Zatem wystarczy przeedytować produkt i przypisać go także do kategorii „Ubrania”. Sprawa nie jest taka prosta jak mamy do edycji kilka tys. produktów. Z pomocą przyjdzie poniższe zapytanie.
UWAGA! Zanim będziesz manipulować w bazie danych wykonaj jej kopię poprzez opcję w menu PrestaShop:
Zaawansowane -> Baza danych -> Kopia zapasowa DB -> Wykonaj kopię
Zapytania SQL.
Najpierw wykonajmy (dodatkowo) backup tabeli, która będziemy zmieniać:
CREATE TABLE ps_category_product_backup AS SELECT * FROM ps_category_product;
W naszych przykładach stosujemy domyślny prefix tabel „ps_” w Twoich przykładach użyj stosowanego w Twojej tabeli.
Następnie wykonaj zapytanie:
INSERT INTO ps_category_product (id_category, id_product, position)
SELECT DISTINCT c.id_parent, cp.id_product, 0
FROM ps_category_product cp
JOIN ps_category c ON cp.id_category = c.id_category
WHERE c.id_parent != 0
AND NOT EXISTS (
SELECT 1
FROM ps_category_product cp2
WHERE cp2.id_product = cp.id_product
AND cp2.id_category = c.id_parent
);
Wyjaśnienie zapytania krok po kroku
cp JOIN c– łączymy produkty z ich kategoriami, żeby pobraćid_parent.c.id_parent != 0– bierzemy tylko podkategorie (nie główne).NOT EXISTS (...)– upewniamy się, że produkt jeszcze nie jest przypisany do kategorii nadrzędnej.DISTINCT– chroni przed wielokrotnym dodaniem tego samego produktu do tej samej kategorii nadrzędnej.position = 0– możesz zmienić, jeśli chcesz określoną pozycję w kategorii.
Jak działa w praktyce
- Produkt przypisany tylko do podkategorii
id_category = 10, którejid_parent = 2, po tym zapytaniu będzie też przypisany do kategorii 2. - Produkt już przypisany do nadrzędnej kategorii nie będzie dodawany ponownie.
- Nie zmienia produktów przypisanych do wielu kategorii nadrzędnych – tylko te, które mają nadrzędną kategorię jeszcze nieprzypisaną.
UWAGA! Zadziała to dla prostego drzewa kategorii. Zatem 2-poziomowego jak na przykładzie z „Ubrania”. Jeśli Twój sklep ma podkategorie 3,4,5 poziomu spróbuj użyć tego zapytania. Niestety nie było ono testowane przez nasz zespól i wymaga sprawdzenia
WITH RECURSIVE parent_categories AS (
-- Poziom 1: produkty z podkategorii
SELECT cp.id_product, c.id_parent AS id_category
FROM ps_category_product cp
JOIN ps_category c ON cp.id_category = c.id_category
WHERE c.id_parent != 0
UNION ALL
-- Poziomy wyżej: idziemy rekurencyjnie w górę drzewa
SELECT pc.id_product, c.id_parent AS id_category
FROM parent_categories pc
JOIN ps_category c ON pc.id_category = c.id_category
WHERE c.id_parent != 0
)
INSERT INTO ps_category_product (id_category, id_product, position)
SELECT DISTINCT pc.id_category, pc.id_product, 0
FROM parent_categories pc
WHERE NOT EXISTS (
SELECT 1
FROM ps_category_product cp
WHERE cp.id_product = pc.id_product
AND cp.id_category = pc.id_category
);
WAŻNA UWAGA
Wyżej wymienione manipulacje są jednorazowe. Zatem jeśli dodajesz nowe produkty musisz uwględnić w nich przypisanie do nadrzędnych kategorii jeśli mają się tam pojawić. Ewentualnie co jakiś czas wywołuj zapytania aby aktualizować to przypisanie.

