Konfigurator ceny
Blog Webmistrz · poradnik

Feed XML odrzucony przez Merchant Center: skąd bierze się błąd formatowania i jak go naprawić

Gdy plik feedu nie przechodzi przetwarzania, produkty znikają z Google razem z reklamami, które na nich stoją. Przyczyna to zwykle jeden znak albo jedno puste pole. Opisujemy sześć najczęstszych błędów i kolejność naprawy.

Programista przy biurku z laptopem i monitorem, na którym widać kod

Bezpłatne narzędzie: sprawdź swój feed XML w przeglądarce. Pokaże wiersz błędu, zdublowane id, braki pól i zły format ceny. Plik nie jest nigdzie wysyłany.

Dwa rodzaje problemów: plik nie wchodzi albo wchodzą tylko niektóre produkty

Zanim zaczniesz szukać przyczyny, ustal, z którym przypadkiem masz do czynienia. Pierwszy to błąd składni XML: plik jest zepsuty jako całość, Merchant Center go nie przetwarza, a liczba produktów w koncie spada albo przestaje się odświeżać. Drugi to błędy danych: plik jest poprawnym XML-em, ale część produktów nie ma wymaganych pól albo ma cenę w złym formacie, więc Google odrzuca je pojedynczo i pokazuje powód w diagnostyce.

Poniżej pierwsze cztery sekcje dotyczą składni, kolejne dwie danych. Całość da się sprawdzić w naszym narzędziu, ale warto rozumieć, skąd te błędy się biorą, bo naprawa ma sens tylko tam, gdzie powstają.

1. Znak & bez zamiany na &

To najczęstsza przyczyna. W XML znak & zaczyna odwołanie do encji, więc w treści musi być zapisany jako &. Problem dotyczy nie tylko tytułów w rodzaju „Kubek Hot & Cold”, ale też adresów URL z kilkoma parametrami:

<!-- źle -->
<link>https://sklep.example/p/1001?kolor=bialy&rozmiar=300</link>
<title>Kubek Hot & Cold 300 ml</title>

<!-- dobrze -->
<link>https://sklep.example/p/1001?kolor=bialy&amp;rozmiar=300</link>
<title>Kubek Hot &amp; Cold 300 ml</title>

Drugim sposobem jest opakowanie wartości w sekcję CDATA (<![CDATA[ ... ]]>), w której znaki specjalne nie wymagają zamiany. Ważniejsze od wyboru metody jest miejsce: zamiana ma się dziać w kodzie, który zapisuje feed, przy każdej wartości z bazy. Jeśli ktoś poprawi samą nazwę produktu w sklepie na „Hot i Cold”, problem zniknie tylko do następnego produktu z ampersandem. Jeden produkt z & potrafi wyłączyć cały feed.

2. Znaki sterujące, których XML nie przyjmuje

XML 1.0 dopuszcza tylko tabulator, nowy wiersz, powrót karetki i znaki od U+0020 wzwyż (z wyłączeniem kilku zakresów technicznych). Pozostałe znaki sterujące, na przykład U+0007 czy U+0000, są niedozwolone wszędzie, także w CDATA i jako odwołania w postaci &#7;. W opisach produktów trafiają się one po skopiowaniu tekstu z Worda lub PDF-a, po imporcie z arkusza, ze starej bazy w innym kodowaniu albo po obcięciu wielobajtowego znaku w pół.

Co z tym zrobić: usuwać te znaki w momencie zapisu feedu, jedną funkcją dla wszystkich pól tekstowych. Na jednym produkcie błąd bywa niewidoczny gołym okiem, bo znak nic nie wyświetla. Narzędzie pokazuje jego wiersz, kolumnę i kod.

3. Spacje przed deklaracją, BOM i kodowanie

Deklaracja <?xml version="1.0" encoding="UTF-8"?> musi być pierwszą rzeczą w pliku. Pusty wiersz albo spacja przed nią to błąd, który zwykle robi szablon: ktoś zostawił znak nowej linii przed otwierającym tagiem PHP albo w pliku włączanym. Znacznik BOM na początku pliku UTF-8 jest w XML dozwolony, ale gdy feed jest sklejany z kilku części, BOM potrafi trafić w środek pliku, i wtedy parser kończy pracę.

Kodowanie w deklaracji powinno zgadzać się z faktycznym. Najbezpieczniej jest przyjąć UTF-8 w całym łańcuchu: baza, generator, plik na dysku i nagłówek odpowiedzi serwera. Rozjazd objawia się krzakami w polskich znakach albo błędem na pierwszym znaku spoza ASCII.

4. Obcięty plik i zdublowane id

Gdy generowanie feedu przerwie się w połowie (limit czasu, brak pamięci, restart procesu), na dysku zostaje plik bez zamykających tagów </channel> i </rss>. Parser zgłasza wtedy nieoczekiwany koniec pliku, a rozmiar jest wyraźnie mniejszy niż zwykle. Zabezpieczenie jest proste: zapisuj do pliku tymczasowego, sprawdzaj go parserem i dopiero po sukcesie podmieniaj ten, który widzi Google.

Zdublowane id nie psują składni, ale psują dane: identyfikator ma być w feedzie unikalny i stały w czasie, a przy powtórzeniu Merchant Center traktuje wpisy jak ten sam produkt, więc jeden może zostać pominięty lub nadpisać drugi. Zwykle dzieje się tak przy wariantach (rozmiar, kolor) eksportowanych bez własnego id albo gdy dwa źródła danych używają tej samej numeracji. Warianty łączy się atrybutem item_group_id, a każdy wariant dostaje własne id.

5. Pola wymagane dla każdego produktu

Specyfikacja Merchant Center wymaga dla każdego produktu co najmniej poniższych atrybutów. Brak któregokolwiek oznacza odrzucenie tej pozycji:

PoleCo ma zawieraćTypowy błąd
idUnikalny, stały identyfikator, do 50 znakówPowtórzony przy wariantach, zmieniany po aktualizacji sklepu
titleNazwa produktu, do 150 znakówPusta lub skopiowana z innej wersji językowej
descriptionOpis tekstem, do 5000 znakówBrak opisu w produktach importowanych z hurtowni
linkPełny adres strony produktu z httpsAdres względny, przekierowanie, adres z błędnym znakiem &
image_linkAdres zdjęcia produktuPuste dla produktów bez zdjęcia, link do pliku, który już nie istnieje
priceKwota i kod waluty, bruttoPatrz niżej
availabilityin_stock, out_of_stock, preorder lub backorderZapis polski albo inny, np. „dostępny”

Do tego dochodzą atrybuty zależne od branży (marka, GTIN, rozmiar dla odzieży), których to narzędzie nie sprawdza. Jeśli o nie pytasz, zajrzyj do poradnika o przygotowaniu feedu.

6. Format ceny

Google oczekuje liczby z kropką jako separatorem dziesiętnym, spacji i trzyliterowego kodu waluty: 1999.00 PLN. W eksportach ze sklepów zdarza się zapis z przecinkiem (1999,00 zł), ze spacją jako separatorem tysięcy (1 999.00 PLN) albo bez waluty. Każdy z tych wariantów to powód odrzucenia. Cena w feedzie ma być taka sama jak na stronie produktu, czyli brutto, z VAT. Gdy w feedzie jest netto, a na stronie brutto, Google pokaże niezgodność ceny nawet przy poprawnym formacie.

Co zrobić po znalezieniu błędu

  1. Napraw w źródle. Zmiana w pliku, który wygenerował sklep, wraca przy następnym eksporcie. Popraw funkcję zapisującą feed: zamiana znaków specjalnych, usuwanie znaków sterujących, zapis do pliku tymczasowego.
  2. Sprawdź plik niezależnie od naszego narzędzia. Na serwerze wystarczy xmllint --noout feed.xml: brak wyjścia oznacza poprawną składnię.
  3. Wymuś ponowne pobranie w Merchant Center i obejrzyj status przetwarzania źródła danych. Dopiero tam widać, czy Google zaakceptował plik.
  4. Porównaj liczbę produktów przed awarią i po niej. Jeśli nie wróciła, wejdź w diagnostykę i zobacz powody odrzuceń pojedynczych produktów.
  5. Dodaj automatyczną kontrolę po każdej generacji: parser XML, liczba produktów w porównaniu z poprzednim plikiem i alert, gdy spadnie gwałtownie. Wtedy następna awaria nie zostanie odkryta dopiero po spadku sprzedaży.

Produkty nie wracają natychmiast po naprawie: czas ponownej weryfikacji ustala Merchant Center. Dlatego przy dużych zmianach w sklepie lepiej najpierw sprawdzić feed, a potem wypuścić go do Google.

Prywatność: co dzieje się z plikiem w narzędziu

Narzędzie Sprawdź feed XML działa w przeglądarce. Kod, który analizuje feed, jest na stronie i nie wysyła treści pliku do żadnego serwera. Możesz to zweryfikować w narzędziach deweloperskich: po kliknięciu „Sprawdź” w zakładce „Sieć” nie pojawia się żadne zapytanie (przy wczytaniu strona, jak cała witryna, zgłasza standardową analityką samą odsłonę, ale nie treść pliku). Zamiast całego pliku możesz wkleić też jego początek z kilkoma produktami.

Najczęstsze pytania

Dlaczego Merchant Center odrzuca cały feed, a nie pojedyncze produkty?

Gdy plik nie jest poprawnym XML-em (na przykład ma niezamieniony znak & albo obcięty koniec), Google nie może go odczytać w ogóle. Brak pola czy zła cena dotyczą pojedynczych produktów, a błąd składni blokuje cały plik.

Czy mogę wkleić feed do narzędzia, jeśli zawiera dane sklepu?

Tak, narzędzie działa wyłącznie w przeglądarce i nie wysyła pliku na serwer. Jeśli wolisz, możesz sprawdzić też sam fragment z kilkoma produktami, bo błędy składni wyłapie parser tak samo.

Jak zamienić & w pliku feedu?

Zamiana powinna dziać się w generatorze, przy zapisie każdej wartości, na przykład przez funkcję escapującą XML albo opakowanie tekstu w CDATA. Ręczna poprawa pliku wróci przy następnym eksporcie.

Jak długo czekać na produkty po naprawie feedu?

Po poprawce wymuś ponowne pobranie pliku w Merchant Center i sprawdź status przetwarzania w danych źródłowych. Czas ponownej weryfikacji produktów zależy od Google, więc nie należy obiecywać go sobie z góry.

Sprawdź swój feed XML →

Specyfikacja atrybutów: Google Merchant Center, specyfikacja danych produktów. Pytania do nas: kontakt@webmistrz.pro.

Przeczytaj też