Press "Enter" to skip to content

[LIFEHACK] Przypisanie wszystkich produktów do kategorii nadrzędnej

Admin 0

 

Rozwiązanie testowane w PrestaShop 8.2.3

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

  1. cp JOIN c – łączymy produkty z ich kategoriami, żeby pobrać id_parent.
  2. c.id_parent != 0 – bierzemy tylko podkategorie (nie główne).
  3. NOT EXISTS (...) – upewniamy się, że produkt jeszcze nie jest przypisany do kategorii nadrzędnej.
  4. DISTINCT – chroni przed wielokrotnym dodaniem tego samego produktu do tej samej kategorii nadrzędnej.
  5. 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órej id_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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Ta strona używa Akismet do redukcji spamu. Dowiedz się, w jaki sposób przetwarzane są dane Twoich komentarzy.

Zobacz także !
Prezentujemy 2 moduły w naszej ofercie usprawniające sprzedaż oraz płatności…