Jak wyłączyć obrazki -scaled w WordPressie (big_image_size_threshold)
Napraw nieostre obrazki w WordPressie, podnosząc lub usuwając limit 2560px filtrem big_image_size_threshold, i sprawdź, dlaczego ponowne przesłanie pliku to krok, który wszyscy pomijają.
Opublikowano
Dodaj filtr na big_image_size_threshold, który zwraca false, a WordPress przestanie tworzyć kopie -scaled przy wysyłce. Zwróć zamiast tego liczbę, a podniesiesz limit, zamiast go usuwać. Jedno i drugie trafia do functions.php albo do małej wtyczki mu-plugin, i jedno i drugie działa wyłącznie na pliki wysłane po aktywacji filtra.
// Disable the cap entirely — no -scaled copies at all.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise it. Longest edge, in pixels.
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );
Co WordPress właściwie robi
Od wersji 5.3 każdy przesłany plik jest mierzony po dłuższym boku. Jeśli ten bok przekracza big_image_size_threshold — domyślnie 2560px — WordPress przekodowuje obrazek w dół do tego limitu, zapisuje go jako your-photo-scaled.jpg i przepisuje metadane załącznika tak, że rozmiar full wskazuje teraz na kopię przeskalowaną.
Twój oryginał nie zostaje usunięty. Zostaje na dysku pod pierwotną nazwą, jest zapisany w metadanych załącznika i dostępny w PHP przez wp_get_original_image_path(). Ale nic na froncie go nie serwuje. Ani edytor blokowy, ani srcset, ani podgląd w bibliotece mediów. Leży tam jako kopia archiwalna.
Wszystko dalej powstaje z pliku przeskalowanego, a nie z tego, co wysłałeś:
| Rozmiar | Plik źródłowy, z którego powstaje |
|---|---|
full | kopia -scaled |
large, medium_large, medium, thumbnail | kopia -scaled |
Rozmiary własne z add_image_size | kopia -scaled |
Rozmiary szablonu i wtyczek, np. woocommerce_thumbnail | kopia -scaled |
Kandydaci srcset | kopia -scaled |
Ten jeden fakt zaskakuje naprawdę wiele osób.
Dlaczego to najczęstsza przyczyna „ostre zdjęcie wygląda miękko”
Dzieją się jednocześnie dwie rzeczy i tylko jedna z nich jest oczywista.
Ta oczywista to rozdzielczość. Wysyłasz zdjęcie 4000px na nagłówek pełnej szerokości. WordPress podaje przeglądarce 2560px. Na zwykłym ekranie wypełniającym kontener 1600px nikt tego nie zauważy. Na ekranie retina o podwójnej gęstości ten sam kontener potrzebuje mniej więcej 3200 realnych pikseli, dostaje 2560, a przeglądarka dociąga różnicę przez powiększenie. Miękkie krawędzie, rozmyte detale, rozmazany tekst w obrębie zdjęcia.
Ta mniej oczywista to przekodowanie. Kopia -scaled nie jest bezstratnym wycinkiem Twojego pliku. WordPress dekoduje przesłany obrazek, zmienia jego rozmiar i kompresuje go ponownie z własnym ustawieniem jakości JPEG. Jeśli oryginał był już skompresowanym JPEG-iem z Lightrooma albo z telefonu, jest to kodowanie drugiej generacji: artefakty kompresji na artefaktach kompresji. Najbardziej obrywają drobne detale, ziarno i płaskie gradienty. Widać to nawet wtedy, gdy same wymiary w pikselach wyglądają na wystarczające.
Potwierdź to, zanim cokolwiek zmienisz. Otwórz obrazek w nowej karcie i przeczytaj nazwę pliku w adresie. -scaled.jpg oznacza, że limit zadziałał. Końcówka z wymiarami, na przykład -1536x1024.jpg, znaczy co innego — srcset wybrał zbyt mały wariant pośredni, a filtr limitu w niczym tu nie pomoże.
Na serwerze:
find wp-content/uploads -name '*-scaled.*' | wc -l
Jeśli ta liczba jest duża, limit kształtował całą Twoją bibliotekę.
Możesz też wrzucić plik do narzędzia do wyłączania obrazków scaled, żeby sprawdzić, czy dane źródło przekroczy limit i o jakich wymiarach powstałaby kopia przeskalowana, zanim zdecydujesz się na konkretne ustawienie.
Uczciwy bilans zysków i strat
Większość artykułów twierdzi, że wyłączenie limitu kosztuje miejsce na dysku. To jest odwrotnie i warto powiedzieć to precyzyjnie.
Zużycie dysku na obrazek nieco spada. Przy włączonym limicie WordPress trzyma Twój oryginał oraz dużą kopię przeskalowaną. Przy wyłączonym zostaje sam oryginał. Jeden plik zamiast dwóch.
Transfer i waga strony rosną, czasem znacząco. Przy wyłączonym limicie full to Twój nietknięty plik. Wszystko, co linkuje albo renderuje rozmiar pełny — lightbox, wtyczka galerii, link „zobacz oryginał”, szablon żądający full dla nagłówków — wysyła teraz plik ważący nie 900KB, a być może 6MB. Na urządzeniach mobilnych to realny problem z Largest Contentful Paint, a CDN-y do obrazków nie zawsze Cię uratują, bo część z nich powyżej pewnego rozmiaru po prostu przepuszcza plik dalej.
Zużycie pamięci przy wysyłce rośnie. Przeskalowanie obrazka 6000px w PHP wymaga sporo więcej pamięci niż przeskalowanie 2560px. Na tanim hostingu współdzielonym z niskim limitem pamięci PHP wyłączenie limitu to prosta droga do nieudanych wysyłek albo częściowo wygenerowanych miniatur. Podniesienie limitu do 3840 zamiast jego usunięcia to bezpieczniejsza wersja tej samej zmiany.
Dlatego rozsądnym domyślnym wyborem dla większości witryn jest podniesienie liczby, a nie usunięcie limitu. Usunięcie ma sens, gdy serwujesz obrazki, które naprawdę potrzebują pełnej rozdzielczości: galerie o jakości drukarskiej, powiększanie zdjęć produktów, fotografia architektury — wszystko, gdzie użytkownik ma oglądać oryginał z bliska.
Jak wdrożyć zmianę porządnie
1. Umieść filtr tam, gdzie przetrwa. functions.php w motywie potomnym się nada. Jednoplikowa wtyczka mu-plugin jest lepsza, bo zmiana szablonu nie cofnie jej po cichu.
<?php
/**
* Plugin Name: Raise big image threshold
*/
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );
2. Wyślij dotknięte obrazki ponownie. To ten krok, który wszyscy pomijają, a potem uznają, że filtr nie zadziałał. Limit jest sprawdzany raz, w momencie wysyłki. Istniejące załączniki zachowują stare metadane na zawsze. Usuń załącznik, wyślij go ponownie, a potem popraw odwołania w treści wpisów.
3. Nie licz na to, że regeneracja miniatur cokolwiek uratuje. wp media regenerate z WP-CLI odbudowuje rozmiary pośrednie z tego, co metadane uznają za plik pełny — a przy obrazku już przyciętym jest to kopia -scaled. Nie odtworzy detali, które zostały odrzucone. Przydaje się jako porządkowanie po ponownym wysłaniu plików. Jako samodzielne rozwiązanie jest bezużyteczna.
4. Sprawdź wynik, nie zakładaj go. Po ponownym wysłaniu otwórz obrazek na froncie i jeszcze raz przeczytaj nazwę pliku. Brak -scaled oznacza, że filtr działa.
Kiedy wyłączanie limitu jest złym ruchem
Jeśli Twoje pliki źródłowe mają poniżej 2560px, a mimo to wyglądają miękko, limit nigdy nie wchodził w grę. Problem polega na tym, że kontener jest większy niż dostępna liczba pikseli, a rozwiązaniem jest większy plik źródłowy albo mniejszy kontener — nie ten filtr.
Jeśli serwowana nazwa pliku ma końcówkę z wymiarami zamiast -scaled, to srcset wybrał mały wariant. Zwykle wynika to z rozjazdu między szerokością treści zadeklarowaną w szablonie a kontenerem, w którym obrazek faktycznie się renderuje. Wyłączenie limitu niczego tu nie zmienia.
A jeśli wtyczka przepisuje atrybut src na optymalizator albo proxy CDN, nic z tego nie ma zastosowania, dopóki nie sprawdzisz, co serwuje to proxy. Porównaj to, co WordPress powinien generować, z tym, co przeglądarka faktycznie pobiera; gdy te dwie rzeczy się nie zgadzają, przyjrzyj się temu, co siedzi pomiędzy nimi.
FAQ
Pytania
Jak wyłączyć obrazki -scaled w WordPressie?
Dodaj filtr na big_image_size_threshold, który zwraca false. Wstaw go do functions.php albo do małej wtyczki mu-plugin. Zwrócenie false całkowicie wyłącza limit, więc pliki zachowują oryginalne wymiary i żadna kopia -scaled nie powstaje. Zwrócenie liczby, na przykład 3840, podnosi limit zamiast go usuwać.
Co oznacza końcówka -scaled w nazwie pliku w WordPressie?
Oznacza kopię przekodowaną przez WordPressa, bo przesłany plik przekroczył 2560px na dłuższym boku. Ta kopia staje się rozmiarem pełnym w całym serwisie. Oryginał zostaje na dysku pod swoją zwykłą nazwą, ale nic na froncie do niego nie prowadzi, a każda miniatura i każdy kandydat w srcset powstaje z kopii przeskalowanej.
Czy wyłączenie obrazków -scaled zajmuje więcej miejsca na dysku?
Na pojedynczy obrazek zwykle nieco mniej, bo WordPress przestaje zapisywać drugi duży plik obok oryginału. Prawdziwym kosztem jest transfer, a nie miejsce na dysku. Przy wyłączonym limicie wszystko, co linkuje rozmiar pełny, serwuje Twój nietknięty plik, który na łączu komórkowym może ważyć kilka megabajtów.
Czy wyłączenie limitu naprawi obrazki, które już są nieostre?
Nie. Filtr działa wyłącznie na nowe pliki. Obrazki, które są już w bibliotece, mają metadane wskazujące na kopię przeskalowaną, a regeneracja miniatur odbudowuje rozmiary z tego samego przyciętego pliku. Żeby odzyskać rozdzielczość, musisz usunąć załącznik i wgrać go ponownie, już przy aktywnym filtrze.
Czy warto zostawić limit 2560px?
W większości serwisów treściowych tak. Źródło o szerokości 2560px obsłuży kontener 1280px przy podwójnej gęstości pikseli, a to najczęstszy przypadek. Podnieś limit do 3840, jeśli używasz szerokich nagłówków na całą szerokość, powiększania zdjęć produktów albo galerii fotograficznych. Wyłącz go całkowicie tylko wtedy, gdy naprawdę musisz serwować nietknięte oryginały.