Автоматическое преобразование изображений в HEIF вызывает сбой галереи на Safari.

Вопрос или проблема

WordPress 6.7 теперь поддерживает форматы изображений HEIC. Начиная с версии 17, Safari (по крайней мере на Mac) автоматически конвертирует любое загружаемое изображение в формат HEIF, если входной тип файла это позволяет.

Загрузка изображений в разделе «Медиа» из админки WP работает нормально (вы можете увидеть загруженные JPG в медиатеке), но при загрузке напрямую в блок Галерея в редакторе изображения конвертируются в HEIC и оказываются такими в медиатеке. Большинство мобильных устройств умеют декодировать их, и просмотр страницы в Safari работает нормально, но они неправильно отображаются в Chrome на десктопах.

Еще одна проблема заключается в том, что они переименовываются во что-то, что выглядит как поврежденный файл (пример изображения ниже):

переименованные файлы

Единственный «горячий» фикс, который я нашел для этой проблемы, заключается в том, чтобы подключиться к библиотеке блоков WP и добавить встроенный JavaScript, который удаляет HEIC/HEIF из поддерживаемых файлов – accept="image/heic", таким образом заставляя Safari отправлять JPG на сервер. Код, который я добавил, приведен ниже:

    wp_add_inline_script(
        'wp-block-library',
        "
        wp.hooks.addFilter(
            'blocks.registerBlockType',
            'custom/gallery-accept-filter',
            function(settings, name) {
                if (name === 'core/gallery') {
                    // Изменить атрибут accept для входных файлов
                    const originalEdit = settings.edit;
                    settings.edit = (props) => {
                        // Убедиться, что любой входной файл в интерфейсе блока не принимает HEIC/HEIF
                        const modifiedProps = wp.element.createElement('div', { ...props },
                            wp.element.createElement(originalEdit, { ...props })
                        );
                        setTimeout(() => {
                            document.querySelectorAll('input[type=\"file\"]').forEach(input => {
                                const accept = input.getAttribute('accept');
                                if (accept && (accept.includes('image/heic') || accept.includes('image/heif'))) {
                                    const newAccept = accept.replace(/image\/heic,?/g, '').replace(/image\/heif,?/g, '');
                                    input.setAttribute('accept', newAccept.trim());
                                }
                            });
                        }, 50);
                        return modifiedProps;
                    };
                }
                return settings;
            }
        );
        ",
        'after'
    );
}
add_action('enqueue_block_editor_assets', 'modify_gallery_block_accept');

Кто-нибудь нашел лучший способ решить эту проблему?

Это известная проблема. Исправление должно быть включено в выпуск 6.7.1:

Целевые исправления

[…]

Следующие ошибки должны быть включены, если они готовы, но как сейчас понимается, они не затрагивают так много людей или менее проблематичны:

  • […]
  • Использование кнопки Загрузить в блоках на основе изображений в Safari неожиданно конвертирует изображения в HEIC с временным именем файла (#62447)

Ответ или решение

Проблема автоматического преобразования изображений в формат HEIF в Safari: описание и решение

В последнем обновлении WordPress 6.7 была добавлена поддержка форматов изображений HEIC. Однако после обновления Safari на компьютерах Mac автоматически преобразует загружаемые изображения в формат HEIF, если это возможно. Это, в свою очередь, вызывает проблемы при использовании галерей изображений в редакторе WordPress, что может негативно сказаться на удобстве пользователей и работе сайта.

Характеристика проблемы

При загрузке изображений в разделе «Медиа» админ-панели WordPress все работает корректно: JPEG-изображения отображаются в медиа библиотеке и доступны для использования. Однако при загрузке изображений напрямую в блок галереи в редакторе они автоматически преобразуются в формат HEIC и отображаются в медиа библиотеке с некорректными именами файлов.

Также, несмотря на то что мобильные устройства обычно могут декодировать формат HEIC, в браузере Chrome на настольных ПК эти изображения не отображаются должным образом. В результате, проблема затрагивает значительное количество пользователей, использующих популярный браузер.

Решение проблемы

Одним из решений, найденных пользователями, является использование JavaScript для изменения атрибута accept в блоке галереи, чтобы исключить поддержку HEIC/HEIF. Это позволяет принудительно загружать изображения в формате JPEG вместо HEIC. Пример кода представлен ниже:

wp_add_inline_script(
    'wp-block-library',
    "
    wp.hooks.addFilter(
        'blocks.registerBlockType',
        'custom/gallery-accept-filter',
        function(settings, name) {
            if (name === 'core/gallery') {
                // Изменение атрибута accept для полей загрузки изображений
                const originalEdit = settings.edit;
                settings.edit = (props) => {
                    const modifiedProps = wp.element.createElement('div', { ...props },
                        wp.element.createElement(originalEdit, { ...props })
                    );
                    setTimeout(() => {
                        document.querySelectorAll('input[type=\"file\"]').forEach(input => {
                            const accept = input.getAttribute('accept');
                            if (accept && (accept.includes('image/heic') || accept.includes('image/heif'))) {
                                const newAccept = accept.replace(/image\/heic,?/g, '').replace(/image\/heif,?/g, '');
                                input.setAttribute('accept', newAccept.trim());
                            }
                        });
                    }, 50);
                    return modifiedProps;
                };
            }
            return settings;
        }
    );
    ",
    'after'
);
add_action('enqueue_block_editor_assets', 'modify_gallery_block_accept');

Этот код добавляет функтор к блокам в WordPress, который изменяет принимаемые форматы файлов, исключая HEIC/HEIF.

Ожидаемое решение

Проблема с преобразованием изображений в формат HEIC при использовании кнопки загрузки в изображениях блоках была зафиксирована как известная проблема в трекере ошибок WordPress (#62447). Это означает, что ожидается более стабильное и универсальное решение в обновлении WordPress 6.7.1.

Заключение

Хотя временное решение с использованием JavaScript может помочь избежать проблем с загрузкой изображений, важным шагом будет ожидание официального исправления в будущих обновлениях WordPress. Это позволит не только улучшить совместимость с браузерами, но и повысить общий пользовательский опыт. Тем временем предлагается следить за обновлениями и использовать временные меры для обеспечения стабильной работы вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...