Jak znaleźć produkty bez zdjęć, opisu albo EAN w PrestaShop (zapytania SQL)
Katalog z kilkuset produktami da się pilnować ręcznie. Przy kilku tysiącach, do tego kombinacjach i importach od dostawców, pojawiają się braki, których nikt nie widzi w panelu: produkt z jednym zdjęciem, opis na dwie linijki, rozmiar bez kodu kreskowego, pusta marka. Poniżej gotowe zapytania SQL, które wypisują każdy rodzaj braku – wiesz dokładnie, co poprawić i w jakiej kolejności.
Zanim zaczniesz
- Wszystkie zapytania tylko odczytują dane (
SELECT). Uruchomisz je w phpMyAdmin, Adminerze albo dowolnym kliencie MySQL. - Zamień prefiks
ps_na prefiks swoich tabel. id_lang = 1iid_shop = 1to domyślny język i sklep – zmień, jeśli u Ciebie są inne (sprawdzisz wps_langips_shop).- Większość zapytań ma warunek
p.active = 1. Usuń go, żeby sprawdzić też produkty jeszcze nieopublikowane – dobry nawyk przed ich włączeniem.
1. Produkty bez marki
Google potrzebuje marki prawie dla każdego produktu, a klienci po niej filtrują. W PrestaShop marka to manufacturer (producent).
SELECT p.id_product, p.reference, pl.name
FROM ps_product p
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
AND p.id_manufacturer = 0;
2. Produkty z mniej niż 3 zdjęciami
Jedno zdjęcie rzadko sprzedaje. Zmień 3 na swoje minimum.
SELECT p.id_product, pl.name, COUNT(i.id_image) AS zdjecia
FROM ps_product p
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
LEFT JOIN ps_image i ON i.id_product = p.id_product
WHERE p.active = 1
GROUP BY p.id_product, pl.name
HAVING zdjecia < 3
ORDER BY zdjecia, p.id_product;
3. Krótkie albo puste opisy
Zapytanie usuwa znaczniki HTML i liczy pozostałe znaki. Wymaga MySQL 8 albo MariaDB 10.0.5+ (REGEXP_REPLACE).
SELECT p.id_product, pl.name,
CHAR_LENGTH(TRIM(REGEXP_REPLACE(COALESCE(pl.description, ''), '<[^>]*>', ''))) AS znaki
FROM ps_product p
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
HAVING znaki < 300
ORDER BY znaki;
Uruchom je dla każdego języka (id_lang). Nieprzetłumaczone opisy to częsty ukryty brak w sklepach wielojęzycznych.
4. Produkty i kombinacje bez EAN
-- produkty proste
SELECT p.id_product, pl.name
FROM ps_product p
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
AND NOT EXISTS (SELECT 1 FROM ps_product_attribute pa WHERE pa.id_product = p.id_product)
AND COALESCE(p.ean13, '') = '';
-- kombinacje
SELECT p.id_product, pl.name, pa.id_product_attribute, pa.reference
FROM ps_product_attribute pa
JOIN ps_product p ON p.id_product = pa.id_product
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
AND COALESCE(pa.ean13, '') = '';
Więcej o GTIN i Google Merchant Center: Jak znaleźć wszystkie produkty bez GTIN w PrestaShop.
5. Kombinacje bez przypisanego zdjęcia
Gdy klient wybiera „czerwony”, zdjęcie powinno zmienić się na czerwone. Działa to tylko wtedy, gdy zdjęcia są przypisane do kombinacji.
SELECT p.id_product, pl.name, pa.id_product_attribute, pa.reference
FROM ps_product_attribute pa
JOIN ps_product p ON p.id_product = pa.id_product
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
LEFT JOIN ps_product_attribute_image pai
ON pai.id_product_attribute = pa.id_product_attribute
WHERE p.active = 1
AND pai.id_image IS NULL;
Uwaga: jeśli sklep rozróżnia tylko rozmiary, brak zdjęć kombinacji może być w porządku. Liczy się to głównie przy kolorach i materiałach.
6. Brak na stanie
SELECT p.id_product, pl.name, sa.id_product_attribute, sa.quantity
FROM ps_stock_available sa
JOIN ps_product p ON p.id_product = sa.id_product
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
AND sa.quantity <= 0
AND (
sa.id_product_attribute > 0
OR NOT EXISTS (SELECT 1 FROM ps_product_attribute pa WHERE pa.id_product = p.id_product)
);
7. Zerowa waga, zerowa cena, brak meta tytułu
-- produkty fizyczne bez wagi (koszty wysyłki będą błędne)
SELECT id_product, reference FROM ps_product
WHERE active = 1 AND is_virtual = 0 AND weight = 0;
-- cena 0 lub mniej
SELECT ps.id_product, pl.name, ps.price
FROM ps_product_shop ps
JOIN ps_product_lang pl
ON pl.id_product = ps.id_product AND pl.id_lang = 1 AND pl.id_shop = ps.id_shop
WHERE ps.id_shop = 1 AND ps.active = 1 AND ps.price <= 0;
-- pusty meta tytuł
SELECT p.id_product, pl.name
FROM ps_product p
JOIN ps_product_lang pl
ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1 AND COALESCE(pl.meta_title, '') = '';
Co poprawić najpierw
Dziesięć list po kilkaset wierszy to jeszcze nie plan. Kolejność, która sprawdza się w większości sklepów:
- Produkty, które reklamujesz. Cena, stan, zdjęcia i GTIN wszystkiego, co jest w Google Shopping albo Meta – tam błędy kosztują codziennie.
- Bestsellery. Posortuj po sprzedaży i popraw opisy oraz zdjęcia w pierwszej pięćdziesiątce.
- Wszystko, co nowe. Dodaj sprawdzanie przed publikacją, żeby braki przestały przybywać.
- Długi ogon, partiami.
Ograniczenia SQL
Zapytania działają, ale dają dziesięć osobnych list, jeden problem na wiersz. Trzeba je połączyć w arkuszu, ocenić, który produkt jest najgorszy, i powtórzyć wszystko za miesiąc. Do tego każdy katalog traktują tak samo, a sklep z meblami potrzebuje innych reguł niż sklep z koszulkami.
Jeden skan zamiast dziesięciu zapytań
Product Data Guardian robi wszystkie te sprawdzenia w jednym skanie i daje każdemu produktowi wynik 0–100. Największe problemy widzisz na jednym ekranie, klikasz w problem i dostajesz dokładną listę produktów, a przy każdym krótkie wyjaśnienie, czego brakuje. Reguły i wagi mogą się różnić w zależności od kategorii, skany mogą działać według harmonogramu, a nieopublikowane produkty można sprawdzić przed wystawieniem.