Вопрос или проблема
Я пытаюсь создать простую галерею из изображений вложений поста с пользовательскими размерами.
Я написал простой цикл:
$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()
на самом деле не создает изображения, но ее вызов может инициировать процессы, которые проверяют наличие сгенерированного изображения:
-
Запрос изображения: Когда вы запрашиваете определенный размер изображения, WordPress обращается к базе данных, чтобы выяснить, есть ли сохраненный размер в метаданных.
-
Генерация размера: Если размер не найден, запускается процесс регенерации, который может занять значительное время в зависимости от количества изображений и их размеров.
Оптимизация кода
Написанием кода с проверкой наличия промежуточного размера через 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;
Рекомендации для дальнейшей оптимизации
-
Кэширование: Рассмотрите возможность использования плагинов кэширования для оптимизации работы сайта, чтобы сократить время загрузки страниц.
-
Ленивая загрузка изображений: Внедрите ленивую загрузку для изображений, чтобы они загружались по мере необходимости, а не все одновременно при загрузке страницы.
-
Обработка больших изображений: Убедитесь, что загружаемые изображения оптимизированы (например, с помощью сжатия) перед загрузкой в библиотеку медиа.
Заключение
Функция wp_get_attachment_image_src()
предназначена для повышения удобства работы с изображениями, но стандартные алгоритмы работы с изображениями могут влиять на производительность, если их использовать бездумно. Правильная оптимизация вашего кода с использованием функций проверки существования изображений, таких как image_get_intermediate_size()
, позволяет избежать ненужной регенерации и улучшить скорость работы страниц. Следуя предложенным рекомендациям, вы сможете значительно повысить производительность вашего сайта на WordPress, сохраняя при этом качество отображения контента.