Как отключить адаптивные изображения в WordPress 4.4?

10 дек. 2015 г., 12:15:04
Просмотры: 36.5K
Голосов: 39

Я успешно перевел свою установку WordPress 4.3.1 полностью на HTTPS. После обновления до версии 4.4 у меня возникла проблема с новым атрибутом srcset. В то время как атрибут src для изображений установлен с использованием HTTPS, атрибут srcset использует HTTP. Это приводит к тому, что браузеры вообще не отображают изображения.

В ожидании лучшего решения, я хочу полностью отключить установку атрибута srcset, чтобы все изображения имели только атрибут src. Как это сделать?

7
Комментарии

Мне тоже хотелось бы узнать это — это просто устроил полный беспорядок на нашем сайте!

Chris Chris
10 дек. 2015 г. 12:24:35

Я пробовал разные способы без успеха, но хотел оставить основной вопрос открытым для новых подходов. Самое радикальное, что я попробовал, — это закомментировать строку add_filter в default-filters.php, которая, как я думал, отвечает за это: //add_filter( 'the_content', 'wp_make_content_images_responsive' );

brokkr brokkr
10 дек. 2015 г. 12:27:06

Вместо того чтобы отключать адаптивные изображения, вам стоит разобраться в проблеме смешивания HTTP и HTTPS, потому что функционал адаптивных изображений не является источником проблемы. Все мои сайты работают на HTTPS, и WordPress корректно создает атрибут srcset. Как вы выполняли миграцию с HTTP на HTTPS?

cybmeta cybmeta
10 дек. 2015 г. 12:29:56

Смотрите https://core.trac.wordpress.org/ticket/25449.

Artem Russakovskii Artem Russakovskii
11 дек. 2015 г. 14:47:53

Кажется, сейчас всё достаточно ясно. Извиняюсь за двойную публикацию - основная проблема (srcset должен использовать https) также решена в теме, которую я создал на wordpress.org (https://wordpress.org/support/topic/responsive-images-src-url-is-https-srcset-url-is-http-no-images-loaded) В своё оправдание скажу, что тема казалась довольно мёртвой после дня или около того, когда её возродили. Спасибо joemcgill, который решил проблему там.

brokkr brokkr
12 дек. 2015 г. 17:51:30

Просто установите этот плагин, и ваша проблема решена, дружище https://wordpress.org/support/view/plugin-reviews/disable-responsive-images

Mandeep Maan Mandeep Maan
12 февр. 2016 г. 07:43:10

Я думал, что они исправили это в ядре WP недавно?

NoBugs NoBugs
27 дек. 2016 г. 21:07:54
Показать остальные 2 комментариев
Все ответы на вопрос 5
5
43

Вот несколько способов, которые можно попробовать для отключения поддержки адаптивных изображений в WordPress 4.4:

/**
 * Отключение поддержки адаптивных изображений (тест!)
 */

// Очистка атрибутов изображения из 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 );

// Переопределение рассчитанных размеров изображений
add_filter( 'wp_calculate_image_sizes', '__return_empty_array',  PHP_INT_MAX );

// Переопределение рассчитанных источников изображений
add_filter( 'wp_calculate_image_srcset', '__return_empty_array', PHP_INT_MAX );

// Удаление адаптивных функций из контента
remove_filter( 'the_content', 'wp_make_content_images_responsive' );

но, как упомянул @cybmeta, проблема может быть в другом.

Принудительное использование HTTPS в srcset

Вы можете провести отладку с помощью фильтра wp_calculate_image_srcset и попробовать этот быстрый фикс:

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 );

чтобы установить схему URL на https. Другой подход - использовать схему без указания протокола //.

Смотрите в Кодексе другие set_url_scheme() варианты:

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

Но вам стоит попытаться копнуть глубже и найти коренную причину.

Обновление:

Мы можем выйти раньше из функции wp_calculate_image_srcset() с помощью:

add_filter( 'wp_calculate_image_srcset_meta', '__return_empty_array' );

затем используя фильтры wp_calculate_image_srcset или max_srcset_image_width.

Также обновлено в соответствии с тикетом #41895, чтобы возвращать пустой массив вместо false/null.

10 дек. 2015 г. 12:59:50
Комментарии

Просто чтобы подтвердить, что оба подхода сработали так, как и задумывалось: отключение srcset убрало атрибут srcset (и тем самым вернуло 'фиксированные' изображения), а принудительное использование https изменило URL в srcset на https. Оба подхода устранили предупреждение о смешанном содержимом.

brokkr brokkr
12 дек. 2015 г. 17:47:02

Решение add_filter( 'wp_calculate_image_srcset_meta', '__return_null' ); отлично сработало у меня. Спасибо!

Tim Bowen Tim Bowen
10 янв. 2016 г. 20:28:27

Рад, что помогло.

birgire birgire
8 мар. 2017 г. 10:27:05

Это вызовет предупреждения в валидаторе: "Атрибут sizes может быть указан только если также присутствует атрибут srcset."

Michael Rogers Michael Rogers
1 нояб. 2017 г. 21:17:29

Похоже, вы отфильтровали srcset, но не атрибут sizes. @MichaelRogers

birgire birgire
1 нояб. 2017 г. 23:53:21
6
13

Самый простой и чистый способ сделать это — просто добавить следующий код:

add_filter( 'wp_calculate_image_srcset', '__return_false' );

Как уже отмечали многие, использование srcset — это хорошая практика и будущее веб-разработки (уже считается лучшей практикой). Но если вам нужно быстрое решение, чтобы сайт продолжал работать, приведённый выше код отлично справится с задачей без каких-либо хаков.

источник: Блог WP Core

16 дек. 2015 г. 03:17:20
Комментарии

Просто используйте __return_false вместо disable_srcset, в WordPress есть функции для таких простых задач.

Jake Jake
17 мар. 2016 г. 15:56:06

И вы оба могли бы улучшить свой код, не создавая целую новую функцию только для возврата false. WordPress предоставляет функции для этого. https://codex.wordpress.org/Function_Reference/_return_false

Jake Jake
19 мар. 2016 г. 00:49:22

Это правильное решение. Эта функция продумана примерно так же хорошо, как wp_autop. Я использую <picture> для арт-дирекшна и адаптивных изображений, и это решение не учитывает этот случай.

Peter Wooster Peter Wooster
10 мая 2016 г. 14:40:34

@Jake по шкале от 1 до 10, "создание новой функции только для возврата false" добавляет около -2 баллов к раздуванию WordPress. Самодокументируемый код, который может понять любой (не только WP-разработчик), имеет определенную ценность.

Mahmoud Al-Qudsi Mahmoud Al-Qudsi
16 июл. 2017 г. 01:37:17

@MahmoudAl-Qudsi Потому что '__return_false' - это так запутанно? Это обсуждение на форуме WordPress о том, как отключить функцию WordPress. Не безумие просто использовать стандартные, очень простые и хорошо документированные встроенные функции WordPress для этого. То, что функция называется "return_false", уже является самодокументирующим. Попробуйте угадать, что она делает?

Jake Jake
17 июл. 2017 г. 00:11:37

Это вызывает предупреждения валидации "Атрибут sizes может быть указан только если присутствует атрибут srcset":

Michael Rogers Michael Rogers
1 нояб. 2017 г. 21:16:22
Показать остальные 1 комментариев
0

Скорее всего, причина того, что URL-адреса в ваших атрибутах srcset некорректно отображают HTTPS, заключается в том, что URL-адреса для всех изображений строятся на основе значения опции siteurl в таблице wp_options. Если ваш фронтенд работает через HTTPS, вам также следует изменить эти значения (через Настройки > Общие).

Вот связанный тикет в системе отслеживания проблем WordPress: https://core.trac.wordpress.org/ticket/34945

10 дек. 2015 г. 18:13:17
2

Это отключит код srcset, исключив любые изображения шире 1 пикселя.

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

В долгосрочной перспективе лучше попытаться исправить саму проблему. Однако этот способ работает, если вам нужно быстрое решение.

11 дек. 2015 г. 02:41:43
Комментарии

create_function()

Pieter Goosen Pieter Goosen
11 дек. 2015 г. 07:16:08

А что насчёт create_function()? Мне бы хотелось, чтобы мои ответы работали и в PHP 5.2.

Otto Otto
12 дек. 2015 г. 00:46:31
0

В разделе Настройки/Общие убедитесь, что Адрес WordPress (URL) и Адрес сайта (URL) установлены на https://yourdomain.com

Смотрите http://wptavern.com/how-to-fix-images-not-loading-in-wordpress-4-4-while-using-ssl

Джо МакГилл, который помогал внедрять адаптивные изображения в WordPress, также ответил в ветке форума и подтвердил, что предложение Кри верно: "Если вы используете HTTPS на фронтенде, вам следует изменить URL для домашнего и сайтового адресов в Настройки > Общие, чтобы они использовали схему HTTPS", - сказал он.

16 дек. 2015 г. 17:18:59