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 e-mail 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…