Produkty odrzucone w Google Merchant Center? Pola WooCommerce, które za tym stoją
Dwa objawy, jedna przyczyna. Mniej produktów w feedzie, niż masz w sklepie, i pozycje odrzucone po wysyłce sprowadzają się zwykle do pola w produkcie — a każde z nich znajdziesz z wiersza poleceń, bez instalowania czegokolwiek.
Google Merchant Center to panel Google, do którego sklep wysyła feed — listę produktów, z której powstają oferty w Zakupach Google i reklamy produktowe. Po drodze psują się dwie różne rzeczy, a z zewnątrz wyglądają tak samo.
Produkt może nie trafić do feedu wcale — nie został wyeksportowany, bo sklep nie dał wtyczce czego eksportować. Albo trafia na kanał i tam zostaje odrzucony. W obu przypadkach wtyczka do feedów jest zwykle tylko posłańcem: wymóg, który nie został spełniony, siedzi w polu produktu, a nie w linijce feedu.
Rozpoznanie, który to przypadek, oszczędza dzień pracy. Jeśli feed ma po prostu mniej produktów niż katalog, zacznij od ceny, dostępności i widoczności — pozycja bez ceny, bez stanu magazynowego albo ukryta z katalogu odpada, zanim eksport w ogóle się zacznie, i żadne ustawienie feedu jej nie przywróci. Jeśli produkty są w feedzie, a kanał je odrzuca, zacznij od zdjęć i identyfikatorów.
Ta strona przechodzi te wymogi po kolei — czym każdy jest, co go łamie w katalogu WooCommerce i jak znaleźć to samodzielnie. Każda kontrola niżej to polecenie, które możesz uruchomić dziś, na własnym sklepie, bez wtyczki i bez zakładania konta.
Procenty pochodzą z raportu Zero czystych: 72 sklepy WooCommerce,
w którym przeszukaliśmy publiczne katalogi 72 polskich sklepów; wynik każdego sklepu z osobna jest
opublikowany na licencji CC BY 4.0. W każdym zapytaniu podmień
wp_ na swój przedrostek tabel.
Cena — towar bez ceny nie jest ofertą
Google wymaga pola price przy każdym produkcie. WooCommerce opublikuje produkt z pustą ceną bez
słowa ostrzeżenia; na sklepie po prostu nie da się go kupić.
38 % sklepów miało produkty bez ceny albo bez możliwości zakupu — 1 138 pozycji. Z trzech liczb cytowanych na tej stronie raport oznacza tę jako najmniej pewną i mówi dlaczego.
wp db query "SELECT p.ID, p.post_title FROM wp_posts p LEFT JOIN wp_postmeta m ON m.post_id = p.ID AND m.meta_key = '_price' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (m.meta_value IS NULL OR m.meta_value = '' OR m.meta_value = '0')"
Dostępność — feed mówi „jest”, sklep mówi „nie ma”
availability musi zgadzać się z tym, co klient naprawdę zastanie. Łamią to dwa stany i potrzebują
dwóch różnych zapytań.
Pierwszy jest prosty — wszystko, co ma dziś zero na stanie:
wp db query "SELECT p.ID, p.post_title FROM wp_posts p JOIN wp_postmeta m ON m.post_id = p.ID AND m.meta_key = '_stock_status' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND m.meta_value = 'outofstock'"
Drugi się chowa: produkt wariantowy, w którym wyprzedane są wszystkie warianty. Rodzic nadal podaje się za dostępnego, więc wygląda dobrze i w zestawieniu, i w zapytaniu wyżej — a klient, który w niego kliknie, nie ma czego włożyć do koszyka.
wp db query "SELECT par.ID, par.post_title FROM wp_posts par \
JOIN wp_posts v ON v.post_parent = par.ID AND v.post_type = 'product_variation' AND v.post_status = 'publish' \
JOIN wp_postmeta s ON s.post_id = v.ID AND s.meta_key = '_stock_status' \
WHERE par.post_type = 'product' AND par.post_status = 'publish' \
GROUP BY par.ID, par.post_title HAVING SUM(s.meta_value = 'instock') = 0"
Żadne z tych zapytań nie wie, czy towar kiedykolwiek się sprzedawał — do tego potrzebne są tabele zamówień, i to jest różnica między listą 400 produktów bez stanu a czterema, które zarabiały do dnia, w którym się skończyły.
Zdjęcie — bez obrazka nie ma oferty
image_link jest wymagane, a trzy różne stany kończą się tak samo: produkt nie ma zdjęcia w ogóle,
wpis w bazie wskazuje plik, którego już nie ma na dysku, albo plik jest, ale jest pusty lub ma parę
pikseli.
29 % sklepów miało produkty bez własnego zdjęcia — 421 pozycji.
wp db query "SELECT p.ID, p.post_title FROM wp_posts p LEFT JOIN wp_postmeta t ON t.post_id = p.ID AND t.meta_key = '_thumbnail_id' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (t.meta_value IS NULL OR t.meta_value = '' OR t.meta_value = '0')"
Dwa pozostałe przypadki wychodzą przy wp media regenerate --dry-run — polecenie przechodzi całą
bibliotekę i zgłasza każdy plik, którego nie da się odczytać.
Opis — za krótki, żeby być ofertą
description jest wymagane, a opis jednolinijkowy jest traktowany właśnie jako taki. To zarazem
pole, które decyduje, czy osoba, która kliknęła, znajdzie odpowiedź, czy wyjdzie.
wp db query "SELECT ID, post_title, CHAR_LENGTH(post_content) AS znakow FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' AND CHAR_LENGTH(post_content) < 200 ORDER BY znakow"
Odnośnik — strona produktu musi być osiągalna
link musi prowadzić do strony, którą klient zobaczy. Produkt, który sprzedawał się kiedyś,
a potem został ukryty z katalogu albo cofnięty do szkicu, wciąż siedzi w źródle feedu, choć jego
strony już nie ma.
wp db query "SELECT p.ID, p.post_title FROM wp_posts p JOIN wp_term_relationships tr ON tr.object_id = p.ID JOIN wp_term_taxonomy tt ON tt.term_taxonomy_id = tr.term_taxonomy_id JOIN wp_terms t ON t.term_id = tt.term_id WHERE p.post_type = 'product' AND p.post_status = 'publish' AND tt.taxonomy = 'product_visibility' AND t.slug = 'exclude-from-catalog'"
Jednoznaczny identyfikator — dwa produkty, jedna tożsamość
Google wymaga, żeby id było unikalne dla każdego produktu, a większość wtyczek feedowych mapuje
je na SKU. Dwa produkty z tym samym SKU znaczą, że jeden z nich przepada.
10 % sklepów miało powtórzony SKU — 134 pozycje.
wp db query "SELECT meta_value AS sku, COUNT(*) AS n FROM wp_postmeta pm JOIN wp_posts p ON p.ID = pm.post_id WHERE pm.meta_key = '_sku' AND pm.meta_value <> '' AND p.post_type IN ('product','product_variation') AND p.post_status = 'publish' GROUP BY meta_value HAVING n > 1"
Warianty są tu celowo: feed eksportuje każdy wariant jako osobną pozycję, więc wariant dzielący SKU z produktem to tam prawdziwa kolizja. Warto o tym wiedzieć, zanim porównasz liczby z jakimkolwiek narzędziem — w WooCommerce własne kontrole duplikatów Merchlinta, SKU i GTIN, zestawiają tylko opublikowane produkty, więc mogą pokazać mniej par niż oba zapytania o duplikaty na tej stronie.
Jeśli sklep jest wielojęzyczny, tłumaczenia jednego produktu dzielą SKU całkiem poprawnie. To jeden towar, a nie duplikat — licz grupy tłumaczeń, nie wpisy.
GTIN — numer, który wiąże Twoją ofertę z tym samym towarem u innych
gtin jest zalecane, jeśli istnieje, a mpn staje się wymagane wtedy, gdy produkt GTIN-u nie ma.
W praktyce towar bez obu stoi w ofercie sam: bez cen konkurencji, bez opinii i ze znacznie słabszą
pozycją.
WooCommerce ma to pole od wersji 9.2 — Dane produktu → Magazyn → GTIN, UPC, EAN, lub ISBN. Nic w panelu na nie nie wskazuje i nic nie mówi, gdy dwa produkty niosą ten sam numer.
wp db query "SELECT p.ID, p.post_title FROM wp_posts p LEFT JOIN wp_postmeta g ON g.post_id = p.ID AND g.meta_key = '_global_unique_id' WHERE p.post_type IN ('product','product_variation') AND p.post_status = 'publish' AND (g.meta_value IS NULL OR TRIM(g.meta_value) = '')"
wp db query "SELECT TRIM(meta_value) AS gtin, COUNT(*) AS n FROM wp_postmeta pm JOIN wp_posts p ON p.ID = pm.post_id WHERE pm.meta_key = '_global_unique_id' AND TRIM(pm.meta_value) <> '' AND p.post_type IN ('product','product_variation') AND p.post_status = 'publish' GROUP BY TRIM(meta_value) HAVING n > 1"
W produkcie wariantowym identyfikator należy do każdego wariantu — każdy rozmiar i kolor jest osobnym towarem handlowym z własnym numerem, a wariant nie dziedziczy numeru po rodzicu. Rodzic z numerem i sześć wariantów bez niego wyeksportują się jako sześć pozycji bez identyfikatora.
Jeśli Twój sklep w ogóle nie prowadzi identyfikatorów — rękodzieło, usługi, własna produkcja — nie ma czego wymyślać, a wymyślanie jest gorszym błędem: zmyślony numer zderzy się z prawdziwym towarem i oferta zostanie odrzucona, zamiast tylko pominięta.
Jedną rzecz trzeba wtedy ustawić, i należy ona do feedu, a nie do produktu. Google oczekuje
identifier_exists równego no, gdy pozycja nie ma ani GTIN-u, ani pary MPN + marka; większość
wtyczek feedowych potrafi to ustawić — na sztywno albo per produkt. Odwrotność też jest pułapką:
wysłanie no przy produkcie, który identyfikator ma, potrafi skończyć się odrzuceniem.
Czego ta strona nie sprawdza
Uczciwość co do granic jest tu sednem. To są prawdziwe wymogi, których żadna kontrola wyżej za Ciebie nie znajdzie:
| Wymóg | Dlaczego go tu nie ma |
|---|---|
brand | Wymagany przy większości nowych produktów, ale WooCommerce nie ma na markę jednego natywnego pola — siedzi w taksonomii albo we wtyczce, więc nie da się o nią zapytać uczciwie jednym poleceniem. |
mpn | Wymagany, gdy produkt nie ma GTIN-u. Ten sam powód: brak natywnego pola. |
| GTIN trzymany poza polem WooCommerce | Zapytanie wyżej czyta _global_unique_id, czyli pole dołożone w WooCommerce 9.2. Sklep, który trzyma numer gdzie indziej — osobna wtyczka do EAN-ów, pola Yoasta dla WooCommerce, atrybut produktu w rodzaju pa_ean — wyjdzie w nim całkiem pusty. Zanim uwierzysz w wynik, sprawdź, skąd Twój feed mapuje gtin. I pułapka odwrotna: jeśli Twoja wtyczka feedowa pokazuje pole WooCommerce tylko w ogólnej grupie „custom attributes”, ta lista bywa cache’owana — a zapis produktu jej nie odświeża — albo budowana z jednego produktu, ostatnio opublikowanego. Wypełnione pole może więc pozostać niewidoczne w mapowaniu, dopóki nie wyczyścisz pamięci podręcznej atrybutów we wtyczce; zrób to najpierw, zanim uznasz, że pole jest puste. |
| Zgodność ceny ze stroną produktu | Wymaga porównania feedu z wyrenderowaną stroną. Zapytanie do bazy nie zobaczy, co strona pokazuje po podatku, przeliczeniu waluty i cenach dynamicznych. |
| Zgodność tytułu ze stroną | Tak samo. Długość da się zmierzyć, zgodność nie. |
Osobna uwaga o rozdzielczości zdjęć: Merchant Center zaczyna egzekwować minimum 500 × 500 px 31 stycznia 2027, a za małe obrazki to częsty powód cichego odrzucenia.
Wszystko powyżej to zapytania, które uruchamiasz sam, na własnej bazie. Jeśli wolisz, żeby te
kontrole przeszły cały katalog naraz — z liczbami, listą produktów i kwotą przy każdym znalezisku —
robi to Merchlint. Jest darmowy, tylko czyta i nie zmienia w sklepie ani jednego bajtu. Jedno
zostawia Tobie: trzeci stan zdjęcia z listy wyżej — plik, który jest, ale nie da się go pokazać —
znajduje wp media regenerate --dry-run.