Jak wyłączyć responsywne obrazy w WP 4.4?

37

Udało mi się przekonwertować moją instalację 4.3.1 na wszystkie https. Po aktualizacji do 4.4. Mam problem z nowym srcsetatrybutem. Podczas gdy srcatrybut obrazów jest ustawiany za pomocą https, srcsetatrybut to http. To powoduje, że przeglądarki nie wyświetlają żadnego obrazu.

Czekając na lepszą poprawkę, chcę srcsetcałkowicie wyłączyć ustawienie atrybutu, aby wszystkie obrazy miały tylko srcatrybut. W jaki sposób mogę to zrobić?

brokkr
źródło
2
Chciałbym również to wiedzieć - właśnie zrobiło to porządny bałagan na naszej stronie!
Chris
Próbowałem różnych sposobów bezskutecznie, ale chciałem pozostawić główne pytanie otwarte na nowe podejścia. Najbardziej drastyczną z moich prób było skomentowanie add_filterlinii, w której default-filters.phpuważałem, że jestem odpowiedzialny://add_filter( 'the_content', 'wp_make_content_images_responsive' );
brokkr,
1
Zamiast wyłączać responsywne obrazy, powinieneś poszukać mieszania HTTP i HTTPS, ponieważ funkcja responsywnych obrazów nie jest źródłem problemu. Wszystkie moje strony są objęte HTTPS i srcsetzostały poprawnie utworzone przez WordPress. Jak przeprowadziłeś migrację z HTTP na HTTPS?
cybmeta,
Zobacz core.trac.wordpress.org/ticket/25449 .
Artem Russakovskii,
Wygląda na to, że teraz całkiem dobrze. Przepraszam za podwójne wysyłanie - główny problem (srcset powinien używać https) został również rozwiązany w wątku, który zacząłem na wordpress.org ( wordpress.org/support/topic/… ) W mojej obronie wątek wydawał się całkiem martwy po dniu lub więc kiedy został ożywiony. Dzięki joemcgill, który tam go rozwiązał.
brokkr

Odpowiedzi:

43

Oto kilka rzeczy, które możesz spróbować usunąć responsywną obsługę obrazów w 4.4:

/**
 * Disable responsive image support (test!)
 */

// Clean the up the image from wp_get_attachment_image()
add_filter( 'wp_get_attachment_image_attributes', function( $attr )
{
    if( isset( $attr['sizes'] ) )
        unset( $attr['sizes'] );

    if( isset( $attr['srcset'] ) )
        unset( $attr['srcset'] );

    return $attr;

 }, PHP_INT_MAX );

// Override the calculated image sizes
add_filter( 'wp_calculate_image_sizes', '__return_empty_array',  PHP_INT_MAX );

// Override the calculated image sources
add_filter( 'wp_calculate_image_srcset', '__return_empty_array', PHP_INT_MAX );

// Remove the reponsive stuff from the content
remove_filter( 'the_content', 'wp_make_content_images_responsive' );

ale jak wspomniano w @cybmeta, problem może być gdzie indziej.

Wymuś włączenie protokołu https srcset

Możesz przeprowadzić debugowanie z wp_calculate_image_srcsetfiltrem, a nawet wypróbować tę szybką poprawkę :

add_filter( 'wp_calculate_image_srcset', function( $sources )
{
    foreach( $sources as &$source )
    {
        if( isset( $source['url'] ) )
            $source['url'] = set_url_scheme( $source['url'], 'https' );
    }
    return $sources;

}, PHP_INT_MAX );

ustawić schemat adresu URL na https. Innym podejściem byłoby pozbawienie go schematów //.

Sprawdź Kodeks dla innych set_url_scheme()opcji:

$source['url'] = set_url_scheme( $source['url'], null );        
$source['url'] = set_url_scheme( $source['url'], 'relative' );

Ale powinieneś spróbować kopać głębiej i znaleźć podstawową przyczynę.

Aktualizacja:

Mogliśmy wcześniej wyskoczyć z wp_calculate_image_srcset()funkcji za pomocą:

add_filter( 'wp_calculate_image_srcset_meta', '__return_empty_array' );

następnie używając filtrów wp_calculate_image_srcsetlub max_srcset_image_width.

Zaktualizowano również zgodnie z biletem # 41895 , aby zwrócić pustą tablicę zamiast false / null.

birgire
źródło
Aby potwierdzić, że oba podejścia działały, ponieważ każde z nich było dla mnie przeznaczone, wyłącz srcset usunął srcset (a więc przywrócił „naprawione” obrazy), a siła https zmieniła adresy URL srcset na https. Oba podejścia usunęły ostrzeżenie o mieszanej zawartości.
brokkr,
4
add_filter( 'wp_calculate_image_srcset_meta', '__return_null' );Rozwiązanie pracował wielki dla mnie. Dziękuję Ci!
Tim Bowen,
Cieszę się, że to pomogło.
birgire,
Spowoduje to wyświetlenie ostrzeżeń na walidatorze: „Atrybut rozmiarów można określić tylko wtedy, gdy atrybut srcset jest również obecny”.
Michael Rogers,
Wygląda na to, że odfiltrowałeś srcset, ale nie ma atrybutu rozmiary. @MichaelRogers
birgire
13

Najprostszym i najczystszym sposobem na zrobienie tego jest po prostu:

add_filter( 'wp_calculate_image_srcset', '__return_false' );

Aby powtórzyć to, co mówi większość innych ludzi, srcset to dobry pomysł i jest przyszłością (najlepsza praktyka teraz), ale jeśli potrzebujesz szybkiej poprawki, aby utrzymać działanie witryny, powyższy fragment działa bez żadnego hakowania.

źródło: WP Core Blog

Trevor
źródło
5
Wystarczy użyć __return_falsezamiast disable_srcset, wp ma funkcje do takich prostych zadań.
Jake,
3
Oboje moglibyście ulepszyć swój kod, nie tworząc zupełnie nowej funkcji tylko po to, by zwracać fałsz. WordPress zapewnia do tego celu funkcje. codex.wordpress.org/Function_Reference/_return_false
Jake
1
To jest właściwe rozwiązanie. Ta funkcja jest równie dobrze przemyślana jak wp_autop. Używam <picture>, aby uzyskać kierunek artystyczny, a także responsywne obrazy, ale to nie rozwiązuje tego.
Peter Wooster
1
@Jake w skali od 1 do 10, „utworzenie nowej funkcji tylko w celu zwrócenia false” dodaje około -2 wzdęcia do WordPressa. Kod samo-dokumentujący, który każdy (nie tylko programista WP) może zrozumieć, ma pewną wartość.
Mahmoud Al-Qudsi
1
@ MahmoudAl-Qudsi Ponieważ „__return_false” jest tak mylące? Ta dyskusja na forum WordPress dotyczy wyłączenia funkcji WordPress. Nie jest szalone, aby użyć do tego domyślnej, bardzo podstawowej i dobrze udokumentowanej funkcji powrotu WordPress wbudowanej w WordPress. Fakt, że funkcja nosi nazwę „return_false”, jest dość samo-dokumentujący. Zgadnij, co to robi?
Jake
7

Najprawdopodobniej przyczyną srcsetnieprawidłowego wyświetlania adresów URL w atrybutach jest HTTPS, ponieważ adresy URL wszystkich obrazów są tworzone przy użyciu wartości opcji siteurl w tabeli wp_options. Jeśli obsługujesz interfejs przez HTTPS, powinieneś również zmienić te wartości (poprzez Ustawienia> Ogólne).

Oto powiązany bilet w systemie śledzenia problemów WordPress: https://core.trac.wordpress.org/ticket/34945

joemcgill
źródło
5

Spowoduje to wyłączenie kodu srcset, eliminując wszelkie obrazy szersze niż 1 piksel.

add_filter( 'max_srcset_image_width', create_function( '', 'return 1;' ) );

Na dłuższą metę powinieneś spróbować naprawić rzeczywisty problem. Działa to jednak, jeśli potrzebujesz szybkiej poprawki.

Otto
źródło
1
create_function()
Pieter Goosen,
1
Co z funkcją create_function ()? Lubię też moje odpowiedzi do pracy w PHP 5.2.
Otto,
2

W Ustawieniach / Ogólne upewnij się, że adres WordPress (URL) i adres strony (URL) są ustawione na https://twojadomena.com

Zobacz http://wptavern.com/how-to-fix-images-not-loading-in-wordpress-4-4-while-using-ssl

Joe McGill, który pomógł w przygotowaniu responsywnych obrazów do WordPress, odpowiedział również w wątku na forum i potwierdził, że sugestia Cree jest poprawna: „Jeśli używasz HTTPS na interfejsie, powinieneś zmienić adresy URL swojego domu i witryny Adres URL w Ustawieniach> Ogólne, aby korzystali ze schematu HTTPS ”- powiedział.

użytkownik2969141
źródło