Tła wideo, autoplay i lazy loading

Tła wideo, autoplay i lazy loading

Ostatnio zweryfikowano: 14 października 2026
14 min czytania
Przewodnik
Core Web Vitals

Hero video (tła wideo) to stały element nowoczesnego web designu. Wyglądają imponująco, budują nastrój i przyciągają uwagę użytkownika.

Są też w 2026 roku głównym powodem fatalnych wyników First Contentful Paint (FCP) i kilkusekundowego Total Blocking Time (TBT) na urządzeniach mobilnych.

Jeśli osadzisz standardowy iframe YouTube na górze strony, ładujesz cały odtwarzacz z jego JavaScriptem i blokujesz wątek główny, zanim użytkownik zobaczy cokolwiek poza białym tłem.

W 2026 nie „osadzamy” wideo, tylko optymalizujemy je do pierwszego bajta.

#Jak włączyć autoplay wideo w tle

Najpierw zasady. Chrome, Safari i Firefox blokują każde wideo, które próbuje uruchomić się automatycznie z dźwiękiem.

Żeby tło wideo zostało odtworzone automatycznie, musi mieć cztery atrybuty jednocześnie:

  1. autoplay
  2. muted
  3. playsinline (kluczowy dla iOS, bez tego film przechodzi do trybu pełnoekranowego)
  4. loop

#Polityka autoplay w Chrome i Media Engagement Index

Zasady Chrome są opisane na stronie Chrome for Developers o autoplay. Polityka weszła w Chrome 66 dla elementów audio i wideo, a jej pierwsza reguła zamyka temat tła wideo: wyciszony autoplay jest zawsze dozwolony. Autoplay z dźwiękiem przechodzi tylko wtedy, gdy spełniony jest jeden z warunków:

  • użytkownik wszedł w interakcję z domeną (kliknięcie, dotknięcie i podobne),
  • na desktopie użytkownik przekroczył próg Media Engagement Index,
  • na telefonie dodał stronę do ekranu głównego, a na desktopie zainstalował ją jako PWA.

Media Engagement Index (MEI) mierzy, na ile dana osoba ma skłonność do odtwarzania mediów w danym serwisie. Odtworzenie liczy się do indeksu tylko wtedy, gdy trwa dłużej niż siedem sekund, ma niewyciszony dźwięk, karta jest aktywna, a wideo jest większe niż 200x140 px. Cicha pętla w hero nigdy więc nie buduje MEI i nie musi. Własne wyniki zobaczysz pod adresem about://media-engagement.

Iframe’y działają tak samo. Iframe z tego samego originu może startować domyślnie, a iframe z innego originu (odtwarzacz YouTube albo Vimeo) potrzebuje uprawnienia przekazanego przez allow="autoplay". Bez niego play() kończy się błędem NotAllowedError, a atrybut autoplay jest ignorowany.

#Jak sprawdzić, czy autoplay jest dozwolony, przed wywołaniem play

HTMLMediaElement.play() zwraca Promise. Przewodnik MDN o autoplay pokazuje wzorzec: jeśli Promise zostanie odrzucony, a nazwa błędu to NotAllowedError, przeglądarka odmówiła odtwarzania z powodu uprawnień, więc pokaż przycisk odtwarzania albo zostaw poster. Każdy inny błąd wskazuje na problem z ładowaniem lub dekodowaniem i warto go zalogować.

const video = document.querySelector('.hero-video');
video.play().catch((error) => {
  if (error.name === 'NotAllowedError') {
    video.closest('.hero')?.classList.add('is-static'); // zostaw poster
  }
});

Istnieje też navigator.getAutoplayPolicy('mediaelement'), które zwraca "allowed", "allowed-muted" albo "disallowed", zanim cokolwiek spróbujesz odtworzyć. Według danych o zgodności przeglądarek z MDN działa ono tylko w Firefoksie (od wersji 112), więc traktuj je jako opcjonalny skrót za sprawdzeniem dostępności, nigdy jako jedyną ścieżkę.

Po stronie serwera nagłówek Permissions-Policy decyduje, które originy mogą odtwarzać automatycznie. Domyślna wartość to self. Permissions-Policy: autoplay=() wyłącza autoplay w całym dokumencie, co jest topornym, ale skutecznym przełącznikiem na stronach, gdzie ruch nigdy nie powinien startować sam.

#Co Safari na iOS robi z wideo z autoplay

WebKit opisał reguły iOS we wpisie New video policies for iOS (lipiec 2016, iOS 10) i nadal tłumaczą one większość zgłoszeń typu “na desktopie działa, na iPhonie stoi”:

  • <video muted> może startować bez gestu użytkownika, podobnie jak wideo, którego plik w ogóle nie ma ścieżki audio.
  • <video playsinline> odtwarza się na iPhonie wewnątrz strony zamiast przełączać się na pełny ekran.
  • Wideo z autoplay zatrzymuje się, gdy przestaje być widoczne, na przykład po przewinięciu poza viewport.
  • Jeśli wideo zyska ścieżkę audio albo zostanie odciszone bez gestu użytkownika, odtwarzanie się zatrzymuje.

Wynikają z tego dwie praktyczne rzeczy. Usuwaj ścieżkę audio przy kodowaniu (-an w FFmpeg), bo plik bez dźwięku zostaje uprawniony do autoplay nawet wtedy, gdy jakiś skrypt później przestawi muted. I nie pisz logiki zakładającej, że pętla na iOS kręci się dalej poza ekranem: przeglądarka już ją tam pauzuje.

#Wideo z YouTube i Vimeo jako tło strony

Żeby ukryć interfejs odtwarzacza i upodobnić go do tła, użyj parametrów URL.

#Vimeo w trybie tła (background=1)

Vimeo oferuje czystszy „tryb tła” niż YouTube:

<iframe src="https://player.vimeo.com/video/12345678?background=1&autoplay=1&loop=1&byline=0&title=0&muted=1" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>

Parametr background=1 automatycznie usuwa kontrolki, wycisza dźwięk, włącza pętlę i autoplay. Opis parametrów znajdziesz w dokumentacji odtwarzacza Vimeo.

#YouTube jako tło z zapętleniem

YouTube jest bardziej kapryśny. Nie da się całkowicie ukryć kontrolek przy najechaniu, ale można je zminimalizować:

<iframe src="https://www.youtube-nocookie.com/embed/VIDEO_ID?autoplay=1&mute=1&controls=0&loop=1&playlist=VIDEO_ID&playsinline=1" frameborder="0" allow="autoplay; encrypted-media"></iframe>

Uwaga krytyczna: żeby loop=1 zadziałało na YouTube, musisz podać parametr playlist z tym samym ID filmu. Bez tego film zatrzyma się po pierwszym przebiegu.

#Lazy loading wideo z YouTube przez fasadę

Załadowanie iframe od razu to błąd. Lazy loading jest lepszy. Fasada (facade) jest najlepsza.

Fasada to lekki obraz, który wygląda jak odtwarzacz wideo. Kiedy użytkownik kliknie albo gdy film znajdzie się w viewport, podmieniamy obraz na rzeczywisty iframe.

#Fasada YouTube z web componentem lite-youtube

Najczęściej używanym wzorcem jest lite-youtube-embed Paula Irisha. Autor opisuje w README, że element renderuje się jak prawdziwy odtwarzacz, ale około 224 razy szybciej.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lite-youtube-embed/src/lite-yt-embed.css">
<script src="https://cdn.jsdelivr.net/npm/lite-youtube-embed/src/lite-yt-embed.js" defer></script>

<lite-youtube videoid="guJLfqTFf_4" playlabel="Odtwórz: Keynote"></lite-youtube>

Renderuje miniaturę z przyciskiem play. Po kliknięciu rozgrzewa połączenie (preconnect) i ładuje pełny odtwarzacz z domeny youtube-nocookie.com. Ile JavaScriptu oszczędzisz, zależy od strony, więc zmierz to w zakładce Network przed i po zmianie.

#Autoplay tła po wejściu w viewport (IntersectionObserver)

Jeśli wideo musi startować automatycznie, ale jest poniżej linii zgięcia (below the fold), nie ładuj go przy initial load. IntersectionObserver odtworzy film dopiero, gdy stanie się widoczny:

document.addEventListener("DOMContentLoaded", function() {
  var lazyVideos = [].slice.call(document.querySelectorAll("video.lazy"));

  if ("IntersectionObserver" in window) {
    var lazyVideoObserver = new IntersectionObserver(function(entries) {
      entries.forEach(function(video) {
        if (video.isIntersecting) {
          for (var source in video.target.children) {
            var videoSource = video.target.children[source];
            if (typeof videoSource.tagName === "string" && videoSource.tagName === "SOURCE") {
              videoSource.src = videoSource.dataset.src;
            }
          }
          video.target.load();
          video.target.classList.remove("lazy");
          lazyVideoObserver.unobserve(video.target);
        }
      });
    });

    lazyVideos.forEach(function(lazyVideo) {
      lazyVideoObserver.observe(lazyVideo);
    });
  }
});

#Wideo w tle na własnym hostingu (MP4/WebM)

Czasami self-hosting jest znacznie szybszy niż YouTube czy Vimeo, bo kontrolujesz bufor i nie ładujesz zewnętrznego JavaScriptu.

Wskazówka: zawsze podawaj atrybut poster. Ten obraz wyświetla się, gdy wideo się ładuje, eliminując białe migotanie.

W hero sklepu WooCommerce można zostawić poster AVIF i nie podawać w początkowym HTML-u pobieralnego src wideo. Poniższy wariant zaczyna transfer po zdarzeniu load, tylko gdy użytkownik nie włączył ograniczenia ruchu i ekran jest odpowiednio szeroki.

<video class="hero-video" muted loop playsinline preload="none"
       poster="/images/hero-poster.avif" data-src="/videos/hero.webm"></video>
<script>
  const video = document.querySelector('.hero-video');
  const allowMotion = !matchMedia('(prefers-reduced-motion: reduce)').matches;
  if (video && allowMotion && matchMedia('(min-width: 768px)').matches) {
    addEventListener('load', () => {
      video.src = video.dataset.src;
      video.play().catch(() => {});
    }, { once: true });
  }
</script>

Jeżeli film jest częścią przekazu i ma wystartować od razu, użyj prostszego wariantu poniżej. To alternatywa, a nie drugi element renderowany obok wersji odroczonej.

<video autoplay muted loop playsinline poster="/images/poster.jpg" class="hero-video">
  <source src="/videos/hero.webm" type="video/webm">
  <source src="/videos/hero.mp4" type="video/mp4">
</video>

Bitrate ma znaczenie: przekoduj wideo poniżej 1 MB na minutę, jeśli to możliwe. Usuń ścieżki dźwiękowe, tło wideo i tak musi być wyciszone.

#Czy obraz poster wideo liczy się jako LCP

LCP mierzy moment, w którym największy widoczny element treści kończy się renderować. W układach z hero tym elementem jest często obraz poster, pierwsza klatka wideo albo blok nagłówka obok. Definicja LCP na web.dev wymienia <video> wśród elementów, które mogą być Largest Contentful Paint, i podaje, który znacznik czasu się liczy: czas załadowania obrazu poster albo czas pokazania pierwszej klatki, zależnie od tego, co nastąpi wcześniej. Szybki poster jest więc dźwignią, którą kontrolujesz: ustala czas LCP nawet wtedy, gdy wideo przychodzi później. Bez postera metryka czeka na pierwszą zdekodowaną klatkę, a ta zależy od pobrania pliku wideo.

Jeśli w początkowym HTML-u <video> ma pobieralny src, przeglądarka może ściągać bajty i dekodować klatki w oknie LCP. To konkuruje z fontami, CSS-em i posterem. Lepiej:

  1. Skompresowany poster (AVIF albo WebP z JPEG jako fallbackiem) w rozmiarze układu hero.
  2. preload="none", żeby plik wideo nie był pobierany wcześnie.
  3. Ustawienie src albo dołożenie <source> dopiero po load, po sprawdzeniu widoczności i preferencji ograniczonego ruchu.

Poster może sam zostać elementem LCP. To w porządku, jeśli jest szybki: właściwe wymiary, nowoczesny format, nagłówki cache na CDN i brak przesunięcia układu, gdy pojawi się warstwa wideo. Nie podmieniaj małej miniatury na pełnoekranową klatkę po załadowaniu, bo taki wzorzec tworzy Cumulative Layout Shift (CLS) i spóźnionego kandydata do LCP.

Cel dla hero z wideo się nie zmienia: LCP do 2,5 sekundy, mierzone na 75. percentylu odsłon, osobno dla telefonów i desktopu. Hero, które przechodzi na biurowym Wi-Fi, a nie przechodzi na 75. percentylu mobile, nie przechodzi.

#Preload wideo: none, metadata czy auto

Atrybut preload na <video> podpowiada, ile mediów przeglądarka ma pobrać przed odtworzeniem:

  • none: bez wstępnego pobierania. Najlepszy domyślny wybór dla tła w hero.
  • metadata: pobiera czas trwania i wymiary. Przydaje się, gdy potrzebujesz rozmiaru do układu bez pobierania całości.
  • auto: decyzja należy do przeglądarki, zwykle zbyt agresywna jak na dekoracyjną pętlę.

Dla dekoracyjnych teł zacznij od preload="none" i pustego lub odroczonego src. Adres podepnij po zdarzeniu load na window (albo gdy Intersection Observer zgłosi widoczność), żeby tekst i CTA wyrenderowały się pierwsze. Przykład z sekcji o własnym hostingu robi dokładnie to.

Unikaj preload="auto" na pętlach w hero. Zaprasza do wczesnego zużycia łącza na stronach, gdzie ruch jest drugorzędny wobec treści. Jeśli wideo jest produktem (zwiastun kursu, demo, które użytkownik przyszedł obejrzeć), inna strategia preloadu może mieć sens, ale to już nie jest tło.

#Jak zatrzymać wideo w tle przy prefers-reduced-motion

Część odwiedzających prosi w ustawieniach systemu o mniej ruchu. CSS prefers-reduced-motion: reduce i odpowiadające mu zapytanie matchMedia powinny blokować dekoracyjne pętle.

Gdy użytkownik prosi o ograniczenie ruchu:

  • nie ustawiaj src i nie wywołuj play(),
  • zostaw poster jako stały element hero,
  • wyłącz animacje CSS, które przesuwają albo przybliżają poster,
  • nie pokazuj kontrolki, która wznawia pętlę bez wyraźnego, opcjonalnego gestu.

Ograniczony ruch nie oznacza “żadnego wideo nigdy”. Demo produktu, które użytkownik sam uruchamia, zostaje w porządku. Wyciszać trzeba ambientowe tło, które startuje samo.

@media (prefers-reduced-motion: reduce) {
  .hero-video {
    display: none;
  }
  .hero {
    background-image: url('/images/hero-poster.avif');
    background-size: cover;
  }
}

Testuj z ustawieniami systemu (Ograniczanie ruchu w macOS i iOS, efekty animacji w Windows) i z emulacją mediów w DevTools. Sprawdź, czy sam poster dalej niesie markę i hierarchię strony.

#WCAG 2.2.2 pauza, zatrzymanie i ukrycie wideo w tle

Zapętlone wideo w tle to treść w ruchu, a WCAG obejmuje ją na poziomie A. Kryterium sukcesu 2.2.2 mówi, że dla każdej poruszającej się, migającej lub przewijającej się informacji, która (1) startuje automatycznie, (2) trwa dłużej niż pięć sekund i (3) jest prezentowana równolegle z inną treścią, musi istnieć mechanizm pozwalający ją wstrzymać, zatrzymać lub ukryć, chyba że ruch jest niezbędny. Strona Understanding 2.2.2 wyjaśnia, że pięć sekund wybrano, bo to wystarczająco długo, żeby przyciągnąć uwagę, a zarazem na tyle krótko, że użytkownik może przeczekać rozproszenie.

Pętla w hero spełnia wszystkie trzy warunki: startuje sama, powtarza się dłużej niż pięć sekund i stoi za nagłówkiem oraz CTA. Prawdziwa kontrolka pauzy jest więc wymagana, a obsługa prefers-reduced-motion jej nie zastępuje, bo wiele osób, które rozprasza ruch, nigdy nie zmienia tego ustawienia systemu.

Czego kontrolka potrzebuje w praktyce:

  • natywnego <button> dostępnego z klawiatury, umieszczonego przy wideo i widocznego zarówno na posterze, jak i na ruchomych klatkach,
  • dostępnej nazwy opisującej akcję (“Wstrzymaj wideo w tle”), aktualizowanej po zmianie stanu,
  • stanu pauzy, który przetrwa co najmniej bieżące wyświetlenie strony, żeby pętla nie ruszyła ponownie przy kolejnym przewinięciu.

Dźwięk to osobne kryterium. Jeśli klip kiedykolwiek odtwarza dźwięk automatycznie, WCAG odsyła do 1.4.2 Audio Control, co jest kolejnym powodem, żeby pętle w tle były ciche.

#Wideo w tle w bibliotece mediów WordPressa

WordPress zapisuje pliki w wp-content/uploads i serwuje to, co wgrasz. To tworzy powtarzalne pułapki wydajnościowe przy wideo w tle:

Pliki w pełnej rozdzielczości z kamery. Redaktor wgrywa MP4 o wadze 50-200 MB prosto z telefonu albo kamery. Biblioteka mediów go przyjmuje, motyw osadza ten adres w hero, a użytkownicy mobilni płacą za plik kinowej jakości użyty jako sześciosekundowa pętla.

Brak potoku przekodowania. W przeciwieństwie do obrazów WordPress nie generuje “rozmiarów wideo”. Nie ma automatycznej wersji WebM, wariantu AV1 ani drabinki bitrate, chyba że dodasz wtyczkę albo zewnętrzny krok kodowania (FFmpeg, Mux, Cloudinary, Bunny Stream).

Kreatory stron i motywy. Wzorce bloków i page buildery często wstawiają iframe YouTube albo Vimeo z pełnym interfejsem odtwarzacza. To ładuje zewnętrzny JavaScript przy każdym wyświetleniu. Dla prawdziwego tła hostuj krótki klip u siebie albo użyj fasady, która montuje iframe dopiero po kliknięciu.

Konfiguracja CDN i typów MIME. Niektóre hostingi serwują wideo bez długich nagłówków cache albo z błędnym Content-Type. Sprawdź w odpowiedziach video/mp4 lub video/webm i czas cache. Złe typy MIME powodują ciche niepowodzenie odtwarzania, a poster zostaje na zawsze.

Nawyki z obrazów responsywnych. srcset nie działa na <video> tak jak na <img>. Jeśli potrzebujesz poziomów rozdzielczości, przygotuj osobne pliki i wybieraj je zapytaniami mediów albo JS-em (min-width, connection.saveData, navigator.connection.effectiveType). Nie licz na to, że WordPress wybierze “średni” rozmiar wideo.

Praktyczny przepływ w WordPressie:

  1. Koduj lokalnie: krótki czas trwania, bez ścieżki audio, ograniczona rozdzielczość (dla hero często 1280 px szerokości), nowoczesne kodeki z H.264 jako fallbackiem.
  2. Wgrywaj skompresowane wersje, nie oryginał z kamery.
  3. Poster trzymaj jako zwykły załącznik graficzny i optymalizuj go jak każdego kandydata do LCP.
  4. Surowego pliku nie trzymaj w repozytorium motywu ani w produkcyjnych uploadach.

#Jak wyłączyć wideo w tle na telefonach i przy Save-Data

Wyciszona pętla nadal kosztuje megabajty. Na łączu komórkowym to realne pieniądze i realne czekanie. Projektuj pod:

  • Brak wideo na wąskich ekranach domyślnie. Wiele zespołów pokazuje poster poniżej 768px i podpina src dopiero na szerszych ekranach.
  • navigator.connection.saveData. Gdy Save-Data jest włączone, pomiń pobieranie.
  • effectiveType. Przy 2g i slow-2g zostaw poster. 3g to decyzja do oceny: wybieraj poster, chyba że klip jest bardzo mały.
  • Odtwarzanie na żądanie. Jeśli ruch ma znaczenie na telefonie, daj przycisk zamiast autoplay.

Mierz transfer w zakładce Network w DevTools z profilami dławienia. Porównaj sam poster z posterem i wideo. Jeśli plik dekoracyjnej pętli waży więcej niż kilka megabajtów, przekoduj go albo skróć, zanim zaczniesz dyskutować o krawędziach CDN.

#Jak sprawdzić dekodowanie AV1 przez Media Capabilities

Ustawienie AV1 jako pierwszego <source> mówi tylko, czy przeglądarka umie odtworzyć kodek, a nie czy urządzenie dekoduje go sprzętowo. Programowe dekodowanie AV1 na starszym telefonie potrafi przycinać i drenować baterię, czyli robi odwrotność tego, czego oczekujesz od dekoracyjnej pętli.

Na to pytanie odpowiada Media Capabilities API. navigator.mediaCapabilities.decodingInfo() zwraca trzy wartości logiczne: supported (plik da się w ogóle zdekodować), smooth (odtworzy się w zadanej liczbie klatek bez gubienia klatek) i powerEfficient. Dla type: "file" konfiguracja wymaga contentType, width, height, bitrate i framerate; pominięcie wartości rzuca TypeError. Dane zgodności MDN wymieniają Chrome 66, Firefox 63 i Safari 13.

const av1 = {
  type: 'file',
  video: {
    contentType: 'video/mp4; codecs="av01.0.05M.08"',
    width: 1280,
    height: 720,
    bitrate: 1500000,
    framerate: 30,
  },
};

const pickSource = async () => {
  if (!('mediaCapabilities' in navigator)) return '/videos/hero.mp4';
  const r = await navigator.mediaCapabilities.decodingInfo(av1);
  return r.supported && r.smooth && r.powerEfficient
    ? '/videos/hero.av1.mp4'
    : '/videos/hero.mp4';
};

Podawaj te wymiary i bitrate, z którymi naprawdę zakodowałeś plik, inaczej odpowiedź dotyczy innego pliku.

#Wyciszone wideo zamiast animowanego GIF-a

Jeśli “tło” to w rzeczywistości krótka animacja, GIF jest najcięższym sposobem jej dostarczenia. Poradnik web.dev o zastępowaniu GIF-ów wideo zamienia GIF o wadze 3,7 MB na MP4 o wadze 551 KB i WebM o wadze 341 KB, używając tych poleceń:

ffmpeg -i my-animation.gif -b:v 0 -crf 25 -f mp4 -vcodec libx264 -pix_fmt yuv420p my-animation.mp4
ffmpeg -i my-animation.gif -c vp9 -b:v 0 -crf 41 my-animation.webm

Element zastępczy ma ten sam zestaw atrybutów co pętla w tle: <video autoplay loop muted playsinline>. Cała reszta tego poradnika (poster, odroczone ładowanie, kontrolka pauzy) stosuje się do niego bez zmian.

#Podsumowanie

  1. Vimeo ?background=1 to najprostszy sposób na nieoznaczone tło wideo.
  2. YouTube wymaga playlist=ID, żeby zapętlać poprawnie.
  3. Zawsze używaj muted i playsinline, inaczej iOS zablokuje odtwarzanie.
  4. Stosuj fasady (lite-youtube) lub IntersectionObserver, żeby odroczyć ładowanie do widoczności.

Przeczytaj nasz poradnik o programistach WordPress, żeby pójść dalej z projektem.

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 problemem są Core Web Vitals, wolny frontend albo ciężki WordPress, rozpiszę i wdrożę konkretny plan optymalizacji.

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.

FAQ do artykułu

Często zadawane pytania

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

SEO-readyGEO-readyAEO-ready3 Q&A
Jak uruchomić autoplay w tle wideo na mobile?#
Użyj razem autoplay, muted, loop i playsinline. Bez tego iPhone i część przeglądarek zablokują odtwarzanie.
Czy YouTube i Vimeo nadają się do tła wideo?#
Tak, ale iframe ładuje dużo JavaScriptu. Dlatego lepiej dodać poster, lazy loading albo fasadę i opóźnić start odtwarzacza.
Jak poprawić Core Web Vitals przy tle wideo?#
Największą różnicę daje lżejszy plik, opóźnienie ładowania playera, obraz poster i ograniczenie wideo w pierwszym widoku.

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

Porozmawiajmy

Polecane artykuły

Za dużo wtyczek WordPress

Porównywarka ubezpieczeń trafiła do nas z 30+ wtyczkami, bazą 705 MB i LCP 7.7s. Największym sprawcą był licznik odsłon zapisujący do wp_postmeta przy każdym wczytaniu. Realny teardown wzorca nadmiaru wtyczek, który szybkie i wspomagane AI wdrożenia wciąż produkują.