Dlaczego wideo w google merchant center ma status przetwarzania i jak naprawić feed produktowy w woocommerce

Dlaczego wideo w google merchant center ma status przetwarzania i jak naprawić feed produktowy w woocommerce

Ostatnio zweryfikowano: 16 października 2026
18 min czytania

#Dlaczego wideo w Google Merchant Center ma status przetwarzania i jak naprawić feed produktowy w WooCommerce

Materiały wideo prezentujące produkty w akcji stały się jednym z najsilniejszych czynników decyzyjnych w nowoczesnym handlu elektronicznym. Google Shopping oraz bezpłatne karty produktów w wyszukiwarce Google intensywnie promują oferty wzbogacone o krótkie prezentacje multimedialne, testy w użyciu oraz animacje 360 stopni. Google opisuje cel nowego atrybutu wprost: filmy pokazują produkty w użyciu lub pod różnymi kątami i służą do ulepszania sposobu wyświetlania produktów w Google (aktualizacja specyfikacji danych produktów Merchant Center 2026).

Wielu właścicieli sklepów opartych na WooCommerce doświadcza jednak frustrującej bariery technicznej. Po przesłaniu adresu wideo w atrybucie produktowym panel Google Merchant Center potrafi wyświetlać komunikat o przetwarzaniu wideo przez wiele dni, po czym materiał po cichu znika lub zostaje odrzucony bez czytelnego raportu błędu. W sklepach z tysiącami SKU filmy po prostu się nie pojawiają, a status nie podpowiada, co jest przyczyną.

Niniejszy przewodnik techniczny szczegółowo analizuje architekturę przetwarzania multimediów przez roboty Google, przedstawia mechanikę kontenerów MP4, metody omijania barier sieciowych na poziomie CDN i WAF, a także dostarcza kompletne implementacje kodu PHP dla WooCommerce oraz skryptów diagnostycznych CLI.

#Dlaczego przetwarzanie wideo w Google Merchant Center się zawiesza

Gdy sklep przekazuje adres URL pliku wideo w feedzie produktowym lub przez Merchant API, Google Merchant Center nie osadza bezpośrednio zewnętrznego pliku w interfejsie użytkownika. Zamiast tego uruchamia asynchroniczny potok przetwarzania (ingestion pipeline). Pierwszym krokiem jest pobranie pliku: strona pomocy atrybutu wymaga, aby Googlebot miał dostęp do filmu, a lista robotów Google wskazuje Googlebot-Video jako agenta usług zależnych od wideo. Jeśli to pobranie się nie uda albo przekroczy limit czasu, film nigdy nie trafia do weryfikacji.

Proces ten zawiesza się w nieskończonej pętli przetwarzania z kilku konkretnych powodów inżynieryjnych:

Pierwszą przyczyną jest niewłaściwa struktura kontenera MP4, a w szczególności umiejscowienie atomu moov (tabeli indeksu klatek i metadanych pliku). W standardowo renderowanych plikach wideo programy montażowe zapisują metadane na samym końcu pliku, tuż po bloku danych audiowizualnych mdat. Dla tradycyjnego odtwarzacza pobierającego cały plik na dysk nie stanowi to problemu. Jednak robot Google pobiera nagłówki i pierwsze kilkaset kilobajtów, aby odczytać długość, rozdzielczość i kodek. Gdy atom moov znajduje się na końcu 80-megabajtowego pliku, bot musi pobrać cały plik od początku do końca. Jeżeli serwer sklepu działa powoli, crawler przerywa połączenie po przekroczeniu limitu czasu (timeout), pozostawiając zadanie w kolejce ze statusem zawieszonym.

Drugą przyczyną jest brak obsługi żądań zakresu bajtów (HTTP Range Requests). Mechanizm pobierania wideo przez Google opiera się na żądaniach nagłówka Range: bytes=0-1048575. Serwer WWW musi odpowiedzieć kodem stanu 206 Partial Content i przesłać wyłącznie żądany fragment pliku wraz z nagłówkiem Content-Range. Jeśli serwer WordPressa, wtyczka buforująca lub skrypt PHP przekazujący plik ignoruje ten nagłówek i zwraca pełną odpowiedź 200 OK, robot musi pobrać cały plik, żeby go odczytać, i trafia na ten sam limit czasu co przy atomie moov na końcu pliku.

Trzecim powodem są zbyt restrykcyjne zapory sieciowe WAF (Web Application Firewall) oraz reguły ochrony przed botami, szczególnie w usługach takich jak Cloudflare, Sucuri czy AWS CloudFront. Zapytania od Googlebot-Video często nie pochodzą z tych samych zakresów adresów IP co klasyczny Googlebot indeksujący tekst HTML. W rezultacie automatyczne reguły antybotowe rzucają botowi wyzwanie JavaScript (Managed Challenge) lub zwracają błąd 403 Forbidden. Panel Merchant Center nie otrzymuje wtedy pliku, lecz stronę HTML z blokadą, co traktuje jako błąd przetwarzania bez podania szczegółów w panelu głównym.

Czwartym problemem jest sam plik. Specyfikacja Google wymienia dopuszczalne kontenery i twarde limity (opisane w następnej sekcji), a nie profile kodeków, więc zmienna liczba klatek (VFR), podpróbkowanie YUV 4:4:4 czy 10-bitowa głębia koloru nie są udokumentowanymi powodami odrzucenia. Normalizacja do H.264 z yuv420p i stałym klatkażem, jak w poleceniu FFmpeg poniżej, i tak usuwa te zmienne podczas diagnozy.

Zanim zaczniesz diagnozować serwer, porównaj plik z opublikowanymi limitami. Strona pomocy atrybutu (Link do filmu [video_link]) wymienia je wprost:

WymaganieWartość w specyfikacji Google
Długośćod 6 do 240 sekund
Rozmiar plikudo 500 MB
Proporcje obrazu9:16, 16:9 lub 1:1
Rozdzielczośćco najmniej 720p (1280 x 720)
Filmy na produktdo 10
Adres URLdo 2000 znaków, zaczyna się od http:// lub https://
Typy plikówMPG, MP4, WMV, AVI, MOV, FLV, MPEG-1, MPEGPS

Trzy zasady z tej samej strony wyjaśniają wiele przypadków “przetwarzania”, które nie mają nic wspólnego z serwerem. Adres spoza YouTube musi prowadzić bezpośrednio do pliku wideo, a nie do strony z odtwarzaczem, więc link do karty produktu się nie nadaje. Film musi być publicznie dostępny: Googlebot ma go pobrać bez logowania i tokenu, a robots.txt nie może go blokować. Link musi też być stały, czyli nie może wygasać ani być później użyty dla innego filmu. Podpisane adresy CDN o krótkiej ważności łamią tę zasadę.

Google dodaje, że sprzedawca musi mieć prawa licencyjne do użycia filmu w celach marketingowych, że film nie może być rozmazany ani nieostry i że dźwięk jest opcjonalny. Przy kilku filmach na produkt adresy w feedzie tekstowym rozdziela się przecinkami, a w XML powtarza się element.

#Jak poprawnie przygotować plik MP4 z flagą faststart do Google Shopping

Aby wyeliminować problem zawieszania na poziomie samego materiału źródłowego, każdy plik wideo przed publikacją w mediach WordPressa lub w dedykowanym magazynie chmurowym musi zostać przetworzony z przesunięciem atomu indeksującego na sam początek pliku. W terminologii narzędzia FFmpeg operacja ta nosi nazwę faststart.

Flaga faststart reorganizuje strukturę pliku MP4 w taki sposób, że tablica atomów moov zostaje wstrzyknięta przed surowe pakiety audio i wideo mdat. Dzięki temu dowolny klient HTTP, w tym Googlebot-Video, natychmiast po odebraniu pierwszych 32 kilobajtów odczytuje proporcje obrazu, czas trwania, sygnatury czasowe klatek kluczowych oraz kodeki, co pozwala na natychmiastową akceptację materiału.

Oto uniwersalne polecenie FFmpeg, które bezstratnie przepakowuje istniejący plik wideo i przesuwa indeks na początek kontenera bez obciążającego ponownego kodowania:

ffmpeg -i produkt-oryginal.mp4 -c copy -movflags +faststart produkt-faststart.mp4

Jeżeli surowy materiał pochodzi ze smartfona lub aparatu studyjnego i wymaga pełnej normalizacji parametrów technicznych do standardu akceptowanego bezproblemowo przez Google Shopping, należy zastosować pełne przekodowanie ze stałym klatkażem 30 fps, profilem High, poziomem 4.1 oraz formatem pikseli YUV 4:2:0:

ffmpeg -i produkt-surowy.mov \
  -c:v libx264 \
  -preset slow \
  -crf 21 \
  -profile:v high \
  -level:v 4.1 \
  -pix_fmt yuv420p \
  -r 30 \
  -g 60 \
  -c:a aac \
  -b:a 160k \
  -ar 48000 \
  -movflags +faststart \
  -max_muxing_queue_size 1024 \
  produkt-sklep-zoptymalizowany.mp4

W powyższym poleceniu parametr -g 60 wymusza umieszczenie klatki kluczowej (Keyframe / IDR) dokładnie co 2 sekundy przy klatkażu 30 fps. Pozwala to robotom Google na błyskawiczne wygenerowanie miniatur podglądu (scrubbing thumbnails) w dowolnym punkcie osi czasu bez konieczności kosztownego dekodowania dziesiątek klatek pośrednich.

Dla sklepów generujących setki filmów produktowych ręczna konwersja jest nierealistyczna. W środowiskach Linux zoptymalizowany skrypt powłoki Bash potrafi automatycznie przetwarzać całe katalogi wideo przed wgraniem ich do zasobów sklepu:

#!/usr/bin/env bash
set -euo pipefail

INPUT_DIR="./surowe-wideo"
OUTPUT_DIR="./gotowe-do-feedu"

mkdir -p "$OUTPUT_DIR"

for video in "$INPUT_DIR"/*.{mp4,mov,m4v}; do
  [[ -f "$video" ]] || continue
  filename=$(basename -- "$video")
  name="${filename%.*}"
  output="${OUTPUT_DIR}/${name}.mp4"
  
  echo "Przetwarzanie: $filename -> $output"
  
  ffmpeg -y -i "$video" \
    -c:v libx264 -preset medium -crf 22 \
    -profile:v high -level:v 4.1 -pix_fmt yuv420p \
    -r 30 -g 60 \
    -c:a aac -b:a 128k -ar 44100 \
    -movflags +faststart \
    "$output"
done

echo "Wszystkie pliki wideo zostaly przetworzone z flaga faststart."

#Jak skonfigurować schemat VideoObject w WooCommerce dla Google Shopping

Dane strukturalne na karcie produktu to inny kanał niż feed: Merchant Center czyta video_link, a wyszukiwarka Google czyta znacznik VideoObject na stronie. Przewodnik Google po danych strukturalnych wideo (Dane strukturalne wideo) wymaga pól name, thumbnailUrl i uploadDate, definiuje contentUrl jako adres samego pliku wideo, a embedUrl jako adres odtwarzacza, i zastrzega, że znacznik musi być na stronie, na której użytkownik może obejrzeć film. Poniższy kod włączaj więc tylko w szablonach produktów, które faktycznie pokazują wideo.

Aby zbudować nienaganną spójność encji, karta produktu w WooCommerce powinna zawierać pełny schemat VideoObject powiązany z głównym schematem Product. W standardzie Schema.org wideo produktowe powinno być zadeklarowane we właściwości video lub subjectOf obiektu handlowego.

Poniższy fragment kodu PHP, gotowy do umieszczenia w pliku functions.php motywu potomnego lub w dedykowanej wtyczce must-use, automatycznie integruje dane wideo z natywnym filtrem danych strukturalnych WooCommerce woocommerce_structured_data_product:

<?php
/**
 * Dodawanie Schema VideoObject do danych strukturalnych produktu WooCommerce.
 */
declare(strict_types=1);

if (!defined('ABSPATH')) {
    exit;
}

add_filter('woocommerce_structured_data_product', 'wpp_inject_product_video_schema', 20, 2);

function wpp_inject_product_video_schema(array $markup, WC_Product $product): array
{
    $product_id = $product->get_id();
    
    // Pobranie metadanych wideo przypisanych do produktu
    $video_url = get_post_meta($product_id, '_wpp_product_video_url', true);
    if (empty($video_url) || !filter_var($video_url, FILTER_VALIDATE_URL)) {
        return $markup;
    }

    $video_title = get_post_meta($product_id, '_wpp_product_video_title', true);
    if (empty($video_title)) {
        $video_title = sprintf('Prezentacja produktu %s w akcji', $product->get_name());
    }

    $video_description = get_post_meta($product_id, '_wpp_product_video_desc', true);
    if (empty($video_description)) {
        $video_description = wp_strip_all_tags($product->get_short_description());
        if (empty($video_description)) {
            $video_description = sprintf('Oficjalny film prezentujący specyfikację i zastosowanie %s.', $product->get_name());
        }
    }

    $thumbnail_id = $product->get_image_id();
    $thumbnail_url = $thumbnail_id ? wp_get_attachment_image_url($thumbnail_id, 'full') : '';
    if (empty($thumbnail_url)) {
        $thumbnail_url = wc_placeholder_img_src('full');
    }

    $upload_date = get_the_date('c', $product_id);
    
    $video_object = [
        '@type' => 'VideoObject',
        'name' => esc_html($video_title),
        'description' => esc_html($video_description),
        'thumbnailUrl' => [esc_url($thumbnail_url)],
        'uploadDate' => $upload_date,
        'contentUrl' => esc_url($video_url),
        'inLanguage' => get_bloginfo('language'),
    ];

    // Jesli link pochodzi z YouTube, dodajemy pole embedUrl
    if (preg_match('~(?:youtube\.com/watch\?v=|youtu\.be/)([\w-]{11})~', $video_url, $yt)) {
        unset($video_object['contentUrl']);
        $video_object['embedUrl'] = 'https://www.youtube.com/embed/' . $yt[1];
    }

    // Dodanie schematu wideo do wlasciwosci subjectOf oraz video dla pelnej zgodnosci
    $markup['subjectOf'] = $video_object;
    $markup['video'] = $video_object;

    return $markup;
}

Dzięki powyższemu wdrożeniu robot Google odwiedzający witrynę natychmiast rejestruje bezpośredni link do pliku wideo, miniaturę oraz pełne powiązanie semantyczne z unikalnym numerem GTIN, kodem SKU oraz ceną produktu.

W oficjalnej specyfikacji Google Merchant Center atrybut służący do przekazywania wideo produktowego nosi nazwę [video_link] (w przestrzeni nazw XML zapisywany jako <g:video_link>). Dozwolone jest podanie:

  1. Bezpośredniego adresu URL do pliku wideo w formacie MP4 hostowanego na wydajnym serwerze sklepu lub zewnętrznym CDN z obsługą nagłówków częściowych.
  2. Bezpośredniego linku do filmu w serwisie YouTube (akceptowane są formaty https://www.youtube.com/watch?v=VIDEO_ID oraz https://youtu.be/VIDEO_ID).

Użycie serwisu YouTube jest często wygodniejsze, ponieważ infrastruktura Google nie musi wówczas w ogóle pobierać zewnętrznego pliku. Transkodowanie, generowanie miniatur i weryfikacja praw autorskich odbywają się wewnątrz tego samego ekosystemu serwerowego. Jeśli jednak marka pragnie zachować pełną niezależność i korzysta z własnych serwerów wideo, plik MP4 musi być serwowany bez jakichkolwiek przekierowań HTTP 301/302 i z nagłówkiem MIME Content-Type: video/mp4.

Oto kompletny moduł generatora feedu produktowego XML dla WooCommerce, który wykorzystuje bibliotekę XMLWriter do bezpiecznego i wydajnego generowania strumieniowego pliku feedu z uwzględnieniem atrybutu video_link:

<?php
/**
 * Generator kanalu XML dla Google Merchant Center z obsluga wideo w WooCommerce.
 */
declare(strict_types=1);

if (!defined('ABSPATH')) {
    exit;
}

add_action('init', 'wpp_register_feed_endpoint');

function wpp_register_feed_endpoint(): void
{
    add_feed('google-merchant-video', 'wpp_render_merchant_video_feed');
}

function wpp_render_merchant_video_feed(): void
{
    header('Content-Type: application/xml; charset=UTF-8');
    
    $writer = new XMLWriter();
    $writer->openURI('php://output');
    $writer->startDocument('1.0', 'UTF-8');
    $writer->setIndent(true);
    
    $writer->startElement('rss');
    $writer->writeAttribute('version', '2.0');
    $writer->writeAttribute('xmlns:g', 'http://base.google.com/ns/1.0');
    
    $writer->startElement('channel');
    $writer->writeElement('title', get_bloginfo('name') . ' - Google Shopping Video Feed');
    $writer->writeElement('link', home_url('/'));
    $writer->writeElement('description', 'Kanal produktowy zoptymalizowany pod katem wideo w Google Merchant Center.');

    $query = new WC_Product_Query([
        'status' => 'publish',
        'limit' => 250,
        'orderby' => 'date',
        'order' => 'DESC',
    ]);
    
    $products = $query->get_products();
    
    foreach ($products as $product) {
        $product_id = $product->get_id();
        $video_url = get_post_meta($product_id, '_wpp_product_video_url', true);
        
        $writer->startElement('item');
        $writer->writeElement('g:id', (string)$product_id);
        $writer->writeElement('g:title', $product->get_name());
        $writer->writeElement('g:description', wp_strip_all_tags($product->get_short_description() ?: $product->get_description()));
        $writer->writeElement('g:link', $product->get_permalink());
        
        $image_id = $product->get_image_id();
        if ($image_id) {
            $writer->writeElement('g:image_link', wp_get_attachment_image_url($image_id, 'full'));
        }
        
        $writer->writeElement('g:price', $product->get_price() . ' ' . get_woocommerce_currency());
        $writer->writeElement('g:availability', $product->is_in_stock() ? 'in_stock' : 'out_of_stock');
        $writer->writeElement('g:condition', 'new');
        
        // Dolaczenie atrybutu video_link, jesli produkt posiada przypisane wideo
        if (!empty($video_url) && filter_var($video_url, FILTER_VALIDATE_URL)) {
            $writer->writeElement('g:video_link', esc_url_raw($video_url));
        }
        
        $writer->endElement(); // item
    }
    
    $writer->endElement(); // channel
    $writer->endElement(); // rss
    $writer->endDocument();
    
    $writer->flush();
    exit;
}

Po zarejestrowaniu kodu wystarczy odświeżyć reguły przepisywania adresów URL: w panelu WordPressa otwórz Ustawienia, następnie Bezpośrednie odnośniki, i zapisz zmiany. Gotowy feed będzie dostępny pod adresem twoj-sklep.pl/feed/google-merchant-video/.

#Ile trwa przetwarzanie wideo produktu w Google Merchant Center

Atrybut video_link jest nowy. Google ogłosiło go w aktualizacji specyfikacji na 2026 rok (aktualizacja specyfikacji danych produktów Merchant Center 2026): filmy można było przesyłać od razu, błędy weryfikacji technicznej są zgłaszane od 14 kwietnia 2026 r., a wyświetlanie razem ze sprawdzaniem zgodności z zasadami i jakości ruszyło 30 czerwca 2026 r. Feed, który wysyłał video_link przed tą datą, nie wyświetlał żadnych filmów. Wyglądało to na zawieszoną kolejkę, a było zaplanowanym wdrożeniem.

Dla późniejszych zmian strona pomocy atrybutu podaje dwie liczby. Gdy film zostaje podmieniony pod nowym, unikalnym adresem URL, Google zwykle indeksuje go ponownie w ciągu 24 do 72 godzin, produkt jest oznaczony jako “W trakcie sprawdzania”, a w tym czasie wyświetla się poprzedni film. Gdy plik zmienia się pod tym samym adresem, wykrycie zmiany może potrwać nawet sześć tygodni.

Problemy z filmami pojawiają się w sekcji “Wymaga uwagi” na koncie Merchant Center. Błędy dotyczące zasad lub jakości blokują wyświetlanie filmu, ale według Google nie wpływają na wyświetlanie powiązanej oferty, więc odrzucony film nie powoduje odrzucenia produktu.

Sklepy, które wysyłają produkty przez API zamiast przez pobierany plik XML, mają drugi termin. Content API for Shopping zakończyło działanie 18 sierpnia 2026 r.; od 1 września 2026 r. żądania bez zatwierdzonego przedłużenia okresowo kończą się błędem HTTP 410, a całkowite wyłączenie zaplanowano na początek 2027 r. (Wycofanie i wyłączenie). Wtyczka, która nadal woła stare API, może gubić aktualizacje filmów tylko z tego powodu, więc zanim obwinisz plik, sprawdź, z którego API korzysta integracja feedu. Feed pobierany przez Merchant Center z adresu URL, taki jak powyższy, nie przechodzi przez Content API.

#Jak stworzyć dedykowaną mapę witryny wideo dla produktów WooCommerce

Oprócz feedu w Google Merchant Center, organiczny indeks wyszukiwarki Google wymaga obecności mapy witryny wideo (Google Video Sitemap). Pozwala ona wyszukiwarce na odkrywanie filmów produktowych w standardowych wynikach wyszukiwania, w sekcji Wideo oraz w podglądach Google Discover.

Standard mapy wideo wymaga zdefiniowania specyficznej przestrzeni nazw xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" oraz elementów takich jak <video:thumbnail_loc>, <video:title>, <video:description>, a także <video:content_loc> (dla bezpośredniego pliku MP4) lub <video:player_loc> (dla odtwarzacza osadzonego, np. YouTube).

Poniższy skrypt rejestruje niezależny punkt końcowy mapy witryny wideo w WordPressie:

<?php
/**
 * Dedykowany generator Video Sitemap dla WooCommerce.
 */
declare(strict_types=1);

if (!defined('ABSPATH')) {
    exit;
}

add_action('init', 'wpp_register_video_sitemap_feed');

function wpp_register_video_sitemap_feed(): void
{
    add_feed('video-sitemap.xml', 'wpp_render_video_sitemap_xml');
}

function wpp_render_video_sitemap_xml(): void
{
    header('Content-Type: application/xml; charset=UTF-8');
    
    $writer = new XMLWriter();
    $writer->openURI('php://output');
    $writer->startDocument('1.0', 'UTF-8');
    $writer->setIndent(true);
    
    $writer->startElement('urlset');
    $writer->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
    $writer->writeAttribute('xmlns:video', 'http://www.google.com/schemas/sitemap-video/1.1');

    $products = wc_get_products([
        'status' => 'publish',
        'limit' => 500,
        'meta_key' => '_wpp_product_video_url',
        'meta_compare' => 'EXISTS',
    ]);

    foreach ($products as $product) {
        $product_id = $product->get_id();
        $video_url = get_post_meta($product_id, '_wpp_product_video_url', true);
        
        if (empty($video_url)) {
            continue;
        }

        $thumbnail_id = $product->get_image_id();
        $thumbnail_url = $thumbnail_id ? wp_get_attachment_image_url($thumbnail_id, 'full') : '';
        if (empty($thumbnail_url)) {
            continue;
        }

        $writer->startElement('url');
        $writer->writeElement('loc', $product->get_permalink());
        
        $writer->startElement('video:video');
        $writer->writeElement('video:thumbnail_loc', esc_url($thumbnail_url));
        $writer->writeElement('video:title', esc_html($product->get_name()));
        $writer->writeElement('video:description', esc_html(wp_strip_all_tags($product->get_short_description() ?: $product->get_name())));
        
        if (preg_match('~(?:youtube\.com/watch\?v=|youtu\.be/)([\w-]{11})~', $video_url, $yt)) {
            $writer->writeElement('video:player_loc', 'https://www.youtube.com/embed/' . $yt[1]);
        } else {
            $writer->writeElement('video:content_loc', esc_url($video_url));
        }

        $writer->writeElement('video:publication_date', get_the_date('c', $product_id));
        $writer->writeElement('video:family_friendly', 'yes');
        $writer->endElement(); // video:video
        
        $writer->endElement(); // url
    }

    $writer->endElement(); // urlset
    $writer->endDocument();
    
    $writer->flush();
    exit;
}

Adres twoj-sklep.pl/video-sitemap.xml należy zgłosić w usłudze Google Search Console, żeby wyszukiwarka Google mogła odkryć filmy produktowe.

#Jak rozwiązać problem blokowania Googlebot-Video przez Cloudflare i CDN

Nawet jeśli plik wideo jest doskonale zoptymalizowany pod kątem flagi faststart, a feed zawiera nienaganny kod XML, robot Googlebot-Video może nie być w stanie pobrać pliku z powodu zabezpieczeń brzegowych.

Nowoczesne sieci CDN, a w szczególności Cloudflare, posiadają rygorystyczne moduły analizy ruchu botów:

  1. Bot Fight Mode: mechanizm ten analizuje sygnatury TLS, brak nagłówków przeglądarkowych oraz nietypowe sekwencje zapytań. Żądania sondowania wideo wysyłane przez crawlery Google często wyzwalają automatyczne blokady 403 Forbidden lub wyzwanie (challenge).
  2. Hotlink Protection: zabezpieczenie przed kradzieżą pasma sprawdza nagłówek Referer. Ponieważ robot indeksujący wysyła zapytanie bez nagłówka odsyłającego (pusty Referer), serwer odrzuca połączenie.
  3. Brak buforowania zakresów bajtów: niektóre konfiguracje CDN ignorują nagłówki Range i próbują najpierw zbuforować cały obiekt; jeśli serwer źródłowy odpowiada wolno, połączenie wygasa.

Aby skonfigurować niezawodny przepływ w Cloudflare, należy utworzyć dedykowaną regułę niestandardową WAF (Custom Rule), która bezwarunkowo przepuszcza zweryfikowany ruch robotów wyszukiwarek dla plików multimedialnych:

(cf.client.bot and http.request.uri.path contains "/wp-content/uploads/" and (http.request.uri.path.extension in {"mp4" "webm" "mov"})) or (http.user_agent contains "Googlebot-Video" and cf.client.bot)

Akcję reguły ustaw na Skip, pomijając zarządzane reguły WAF, Super Bot Fight Mode i limity żądań dla pasujących zapytań. Super Bot Fight Mode jest dostępny w planach Pro, Business i Enterprise, a Cloudflare dokumentuje, że reguły niestandardowe ze Skip działają przed nim (Super Bot Fight Mode). Darmowy Bot Fight Mode działa inaczej: według Cloudflare nie da się go obejść ani pominąć regułami niestandardowymi WAF ani Page Rules, a akcje Skip, Bypass i Allow nie mają na niego wpływu (Bot Fight Mode). W darmowym planie zostaje wyłączenie Bot Fight Mode albo reguła IP Access, która jest sprawdzana wcześniej.

Dodatkowo w konfiguracji serwera Nginx należy upewnić się, że nagłówki zapytań częściowych są poprawnie przekazywane do klienta:

location ~* \.(mp4|webm|m4v)$ {
    # Wlaczenie obslugi zapytań czesciowych
    max_ranges 100;
    
    # Dodanie naglowka informujacego o akceptacji bajtow
    add_header Accept-Ranges bytes always;
    add_header Access-Control-Allow-Origin "*" always;
    add_header Cache-Control "public, max-age=31536000, immutable";
    
    # Wylaczenie buforowania zapisu dla bezposredniego strumieniowania
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    
    expires 365d;
    access_log off;
}

Dyrektywa max_ranges 100 oraz sendfile on gwarantują, że jądro systemu Linux przesyła pakiety wideo bezpośrednio z pamięci podręcznej dysku do gniazda sieciowego bez pośrednictwa procesu Nginx, co eliminuje ryzyko opóźnień i zawieszania pobierania przez robota.

#Jak sprawdzić, czy żądanie naprawdę pochodzi od Googlebot-Video

Zanim otworzysz wyjątek w zaporze, potwierdź w logu dostępu, że zablokowane żądania pochodzą od Google. Dokumentacja robotów Google (Popularne roboty Google) podaje dla Googlebot-Video token robots.txt Googlebot-Video i user agent Googlebot-Video/1.0 oraz ostrzega, że nagłówek user agent można podrobić. Zgodna nazwa niczego jeszcze nie dowodzi.

Dowodzą tego dwa testy. Odwrotne zapytanie DNS dla adresu IP musi zwrócić nazwę hosta w domenie googlebot.com (w postaci crawl-***-***-***-***.googlebot.com lub geo-crawl-***-***-***-***.geo.googlebot.com), a zapytanie w przód dla tej nazwy musi zwrócić ten sam adres IP. Alternatywnie adres IP musi mieścić się w zakresach, które Google publikuje w pliku common-crawlers.json.

host 66.249.66.1
host crawl-66-249-66-1.googlebot.com

Ta sama strona mówi, że reguły ustawione dla tokenu Googlebot-Video obowiązują w funkcjach wideo wyszukiwarki i w innych usługach zależnych od wideo. Plik robots.txt, który blokuje /wp-content/uploads/ dla wszystkich agentów, ukrywa więc także filmy produktowe hostowane w sklepie, a pomoc Merchant Center wprost wymaga, żeby robots.txt nie blokował adresu filmu. Sprawdź opublikowany plik, zanim zmienisz cokolwiek w CDN:

curl -s https://twoj-sklep.pl/robots.txt | grep -i -A5 "user-agent"

#Jak zdiagnozować nagłówki HTTP i żądania zakresu przy użyciu curl i ffprobe

Przed ponownym przesłaniem feedu do Google Merchant Center inżynier e-commerce powinien przeprowadzić symulację z poziomu terminala, sprawdzając, jak serwer reaguje na żądania bota.

Krok 1: Weryfikacja nagłówka Accept-Ranges oraz kodu odpowiedzi na zapytanie o próbkę bajtów przy użyciu narzędzia curl:

curl -I -X GET \
  -H "User-Agent: Googlebot-Video/1.0" \
  -H "Range: bytes=0-1024" \
  https://twoj-sklep.pl/wp-content/uploads/produkt-wideo.mp4

Prawidłowa odpowiedź serwera musi zawierać następujące elementy:

  • Kod statusu: HTTP/2 206 lub HTTP/1.1 206 Partial Content.
  • Nagłówek Accept-Ranges: bytes.
  • Nagłówek Content-Range: bytes 0-1024/CAŁKOWITY_ROZMIAR_PLIKU.
  • Nagłówek Content-Type: video/mp4.

Jeśli w odpowiedzi pojawi się kod 200 OK, 403 Forbidden lub 301 Moved Permanently, Google Merchant Center nie zaakceptuje pliku i zawiesi zadanie przetwarzania.

Krok 2: Sprawdzenie struktury atomów wideo za pomocą polecenia ffprobe:

ffprobe -v trace -show_packets https://twoj-sklep.pl/wp-content/uploads/produkt-wideo.mp4 2>&1 | head -n 40

Jeśli w pierwszych linijkach strumienia pojawia się deklaracja type:'moov', oznacza to, że plik posiada poprawną flagę faststart. Jeśli natomiast jako pierwszy pojawia się atom type:'mdat', plik wymaga natychmiastowego przepakowania przed ponowną publikacją w katalogu.

#Najczęstsze pytania o przetwarzanie wideo w Google Merchant Center

W praktyce inżynierskiej integracji multimediów w Google Shopping najczęściej powtarzają się konkretne wątpliwości techniczne:

  1. Czy hosting wideo na YouTube jest lepszy od własnego hostingu MP4 Dla stabilności Google Merchant Center wideo z YouTube jest rozwiązaniem najbezpieczniejszym. Eliminuje problemy z serwerem, pasmem transferu i blokadami firewalli. Jednak własne pliki MP4 (np. zoptymalizowane na Cloudflare Stream lub Bunny CDN) dają pełną kontrolę nad wyglądem odtwarzacza, brakiem reklam konkurencji na karcie produktu i czystym brandingiem.

  2. Jak długo trwa standardowe przetwarzanie wideo w Merchant Center Pomoc Google podaje od 24 do 72 godzin na ponowne zindeksowanie, gdy film trafia pod nowy adres URL, i nawet sześć tygodni, gdy plik zmienia się pod tym samym adresem. Jeśli film długo po tym czasie nadal się nie wyświetla, a w sekcji “Wymaga uwagi” nic nie ma, problem leży zwykle w pobieraniu: zablokowane żądanie, przekierowanie albo adres, który zwraca stronę zamiast pliku.

  3. Czy po poprawieniu pliku MP4 na serwerze muszę zmienić adres URL w feedzie Tak. Pomoc Google prosi o nowy, unikalny adres URL przy podmianie filmu, bo zmiana pod tym samym adresem może pozostać niezauważona nawet sześć tygodni. Najczystszym rozwiązaniem jest nowa nazwa pliku, np. produkt-v2.mp4.

Wdrożenie standardu faststart, odblokowanie zapytań zakresowych w serwerze WWW, właściwa integracja schematu VideoObject w WooCommerce oraz bezbłędny feed XML to sprawdzona ścieżka do uzyskania pełnej widoczności produktów w nowoczesnych, wizualnych formatach Google Shopping.

Następny krok

Przekuj artykuł w realne wdrożenie

Pod tym wpisem dokładam linki, które domykają intencję użytkownika i prowadzą dalej w strukturze serwisu.

Chcesz wdrożyć ten temat na swojej stronie?

Jeśli zależy Ci na widoczności w Google i systemach AI, mogę przygotować architekturę treści, FAQ, schema i linkowanie pod GEO, AEO i SEO.

Powiązany klaster

Sprawdź inne usługi WordPress i bazę wiedzy

Wzmocnij swój biznes dzięki profesjonalnemu wsparciu technicznemu w kluczowych obszarach ekosystemu WordPress.

Często zadawane pytania

Najważniejsze odpowiedzi, które pomagają wdrożyć temat w praktyce.

Dlaczego wideo produktu w Google Merchant Center ma status przetwarzania przez wiele dni#
Najczęstsze powody to adres, którego Googlebot nie może pobrać (zapora zwracająca 403, przekierowanie, logowanie), link do strony zamiast do pliku wideo, plik poza limitami Google albo atom moov na końcu pliku MP4. Zmiana pliku pod niezmienionym adresem może też czekać na wykrycie do sześciu tygodni.
Jakie formaty wideo akceptuje Google Merchant Center#
Google wymienia MPG, MP4, WMV, AVI, MOV, FLV, MPEG-1 i MPEGPS, długość od 6 do 240 sekund, rozmiar do 500 MB, rozdzielczość co najmniej 720p i proporcje 9:16, 16:9 lub 1:1. Google nie narzuca kodeka; H.264 w MP4 z flagą faststart to bezpieczny wybór dla sieci.
Czy w atrybucie video_link w WooCommerce można podać link do YouTube#
Tak, Merchant Center przyjmuje adresy YouTube. Film musi być publicznie dostępny, osiągalny dla Googlebota bez logowania i nie może być zablokowany w robots.txt, więc filmy prywatne odpadają.
Jak sprawdzić czy plik wideo wspiera faststart bez ponownego renderowania#
Można użyć narzędzia ffprobe lub mediainfo w wierszu poleceń. Jeśli atom moov znajduje się za atomem mdat, plik wymaga szybkiego przepakowania poleceniem ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4.

Potrzebujesz FAQ dopasowanego do branży i rynku? Przygotujemy wersję pod Twoje cele biznesowe.

Porozmawiajmy

Polecane artykuły