wp_get_attachment_image_src() регенерирует изображения настроенного размера каждый раз

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

Я пытаюсь создать простую галерею из изображений вложений поста с пользовательскими размерами.

Я написал простой цикл:

$original = array();
$gallery = array();
$gallery_min = array();

$imgs_args = array(
    'post_status'    => null,
    'post_type'      => 'attachment',
    'post_parent'    => get_the_ID(),
    'post_mime_type' => 'image',
    'order'          => 'ASC',
    'numberposts'  => 99999
);
$post_images = get_posts($imgs_args);
if ($post_images) :
    foreach ($post_images as $a) :
        $original[] = wp_get_attachment_image_src($a->ID, 'gallery_origin');
        $gallery[] = wp_get_attachment_image_src($a->ID, 'gallery');
        $gallery_min[] = wp_get_attachment_image_src($a->ID, 'gallery_min');
    endforeach;
endif;

Но производительность страницы становится очень низкой. Я проверил время создания изображений моего пользовательского размера и увидел, что оно равно времени загрузки страницы. Это значит, что wp_get_attachment_image_src() регенерирует мои изображения каждый раз, когда загружается страница.

Я попытался использовать функцию image_get_intermediate_size(), чтобы проверить, существует ли изображение пользовательского размера:

foreach ($post_images as $a) :
    $img = image_get_intermediate_size( $a->ID, 'gallery_origin' );
    if ($img) {
        $original[] = $img['url'];
    } else {
        $img = wp_get_attachment_image_src($a->ID, 'gallery_origin');
        $original[] = $img[0];
    }
    $img = image_get_intermediate_size( $a->ID, 'gallery2' );
    if ($img) {
        $gallery[] = $img['url'];
    } else {
        $img = wp_get_attachment_image_src($a->ID, 'gallery2');
        $gallery[] = $img[0];
    }
    $img = image_get_intermediate_size( $a->ID, 'gallery_min' );
        if ($img) {
            $gallery_min[] = $img['url'];
        } else {
            $img = wp_get_attachment_image_src($a->ID, 'gallery_min');
            $gallery_min[] = $img[0];
        }
endforeach;

И производительность становится отличной.

Не должна ли функция wp_get_attachment_image_src() проверять уже сгенерированное изображение перед тем, как вернуть массив?

Нет, функция wp_get_attachment_image_src вызывает image_downsize, которая, в свою очередь, вызывает саму image_get_intermediate_size. Это не вызывает генерацию изображений, это просто получение соответствующих изображений из метаданных и выбор правильного для использования.

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

Понимание функции wp_get_attachment_image_src() и ее влияние на производительность

Введение

Создание простых галерей на основе изображений в постах WordPress может привести к проблемам с производительностью, особенно если вы неэффективно используете функции для получения изображений. В данном обсуждении мы рассмотрим, почему функция wp_get_attachment_image_src() может вызывать замедление работы страницы, а также как можно оптимизировать ваш код для улучшения производительности.

Проблема с производительностью

Вы заметили, что использование функции wp_get_attachment_image_src() каждый раз приводит к длительному времени загрузки страниц. Это происходит потому, что данная функция вызывает image_downsize, которая затем обращается к image_get_intermediate_size. Как следствие, функция проверяет, существует ли уже нужный размер изображения, прежде чем обращаться к его метаданным. Если запрашиваемый размер еще не был создан, WordPress может попытаться регенерировать его.

Почему происходит повторная регенерация изображений

Хотя функция wp_get_attachment_image_src() на самом деле не создает изображения, но ее вызов может инициировать процессы, которые проверяют наличие сгенерированного изображения:

  1. Запрос изображения: Когда вы запрашиваете определенный размер изображения, WordPress обращается к базе данных, чтобы выяснить, есть ли сохраненный размер в метаданных.

  2. Генерация размера: Если размер не найден, запускается процесс регенерации, который может занять значительное время в зависимости от количества изображений и их размеров.

Оптимизация кода

Написанием кода с проверкой наличия промежуточного размера через image_get_intermediate_size() вы правильно оптимизировали процесс. Если размер уже существует, вы избегаете затрат времени на вызов wp_get_attachment_image_src(), который в свою очередь вызывает дополнительные проверки и возможную регенерацию.

Ваш обновленный код демонстрирует правильный подход:

foreach ($post_images as $a) :
    $img = image_get_intermediate_size($a->ID, 'gallery_origin');
    if ($img) {
        $original[] = $img['url'];
    } else {
        $img = wp_get_attachment_image_src($a->ID, 'gallery_origin');
        $original[] = $img[0];
    }
    // Повтор для других размеров...
endforeach;

Рекомендации для дальнейшей оптимизации

  1. Кэширование: Рассмотрите возможность использования плагинов кэширования для оптимизации работы сайта, чтобы сократить время загрузки страниц.

  2. Ленивая загрузка изображений: Внедрите ленивую загрузку для изображений, чтобы они загружались по мере необходимости, а не все одновременно при загрузке страницы.

  3. Обработка больших изображений: Убедитесь, что загружаемые изображения оптимизированы (например, с помощью сжатия) перед загрузкой в библиотеку медиа.

Заключение

Функция wp_get_attachment_image_src() предназначена для повышения удобства работы с изображениями, но стандартные алгоритмы работы с изображениями могут влиять на производительность, если их использовать бездумно. Правильная оптимизация вашего кода с использованием функций проверки существования изображений, таких как image_get_intermediate_size(), позволяет избежать ненужной регенерации и улучшить скорость работы страниц. Следуя предложенным рекомендациям, вы сможете значительно повысить производительность вашего сайта на WordPress, сохраняя при этом качество отображения контента.

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

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