В работе с WordPress часто возникает необходимость регенерировать миниатюры и другие размеры изображений после изменения настроек темы или плагинов, либо при добавлении новых размеров изображений. Ручное использование плагинов или командной строки не всегда удобно, особенно если вы хотите автоматизировать процесс и запускать регенерацию изображений программно в нужный момент.
Зачем нужен автоматический регенератор изображений в WordPress
Когда вы меняете размеры миниатюр или добавляете новые размеры изображений через функцию add_image_size(), WordPress не обновляет автоматически уже загруженные изображения. Их нужно регенерировать, чтобы новые размеры создавались и использовались в шаблонах и на страницах.
Существует много плагинов, например, Regenerate Thumbnails, но они требуют ручного запуска или запуска через WP-CLI. Автоматизация позволяет запускать регенерацию, например, при активации темы, при импорте новых изображений или по расписанию.
Кроме того, автоматический регенератор упрощает поддержку сайта и снижает вероятность ошибки из-за устаревших миниатюр.
Как работает регенерация изображений: основные принципы
Регенерация изображений — это процесс пересоздания всех размеров изображений, связанных с одним файлом. Для этого нужно получить ID вложения, удалить старые миниатюры и сгенерировать новые с помощью функции wp_generate_attachment_metadata().
Вручную можно использовать класс WP_Image_Editor и функции, которые вызываются при загрузке изображения, но для массовой обработки требуется перебор всех вложений и последовательный вызов регенерации.
Пример реализации автоматического регенератора изображений в коде WordPress
Рассмотрим пример функции, которая по хуку активации темы запустит регенерацию всех загруженных изображений:
function wpquery_regenerate_all_images() {
// Получаем все вложения изображений
$args = [
'post_type' => 'attachment',
'post_mime_type' => 'image',
'posts_per_page' => -1,
'post_status' => 'inherit',
'fields' => 'ids',
];
$images = get_posts($args);
foreach ($images as $image_id) {
// Получаем путь к файлу
$file = get_attached_file($image_id);
if (!$file || !file_exists($file)) {
continue;
}
// Генерируем новые миниатюры
$metadata = wp_generate_attachment_metadata($image_id, $file);
if (!is_wp_error($metadata) && $metadata) {
wp_update_attachment_metadata($image_id, $metadata);
}
}
}
add_action('after_switch_theme', 'wpquery_regenerate_all_images');
Этот код запускает регенерацию всех изображений после смены темы. Важно понимать, что если изображений много, процесс может занять время, поэтому для больших сайтов стоит реализовать пакетную обработку или запускать по крону.
Как улучшить регенератор: пакетная обработка и крон-задания
Для сайтов с тысячами медиафайлов лучше не запускать регенерацию одним большим циклом, а разбить процесс на части. Это можно сделать с помощью WP-Cron и сохранять прогресс в опциях или транзиентах.
Пример функции для пакетной обработки 20 изображений за один запуск:
function wpquery_batch_regenerate_images($batch_size = 20) {
$offset = (int) get_option('wpquery_regenerate_offset', 0);
$args = [
'post_type' => 'attachment',
'post_mime_type' => 'image',
'posts_per_page' => $batch_size,
'post_status' => 'inherit',
'fields' => 'ids',
'offset' => $offset,
];
$images = get_posts($args);
if (empty($images)) {
// Сброс прогресса
delete_option('wpquery_regenerate_offset');
return;
}
foreach ($images as $image_id) {
$file = get_attached_file($image_id);
if (!$file || !file_exists($file)) {
continue;
}
$metadata = wp_generate_attachment_metadata($image_id, $file);
if (!is_wp_error($metadata) && $metadata) {
wp_update_attachment_metadata($image_id, $metadata);
}
}
$offset += $batch_size;
update_option('wpquery_regenerate_offset', $offset);
}
// Пример запуска по крону
add_action('wpquery_cron_regenerate_images', 'wpquery_batch_regenerate_images');
После этого можно запланировать крон-задание в WordPress:
if (!wp_next_scheduled('wpquery_cron_regenerate_images')) {
wp_schedule_event(time(), 'hourly', 'wpquery_cron_regenerate_images');
}
Такой подход позволит постепенно обновлять миниатюры без нагрузки на сервер.
Какие плагины могут помочь с регенерацией изображений
Если вы не хотите писать код, можно использовать готовые плагины с расширенными возможностями:
- Regenerate Thumbnails — самый популярный плагин для регенерации миниатюр, поддерживает массовую обработку.
- Clearfy Pro — плагин для оптимизации WordPress, в том числе улучшает работу с медиа и может помочь в оптимизации изображений.
Для интеграции с WP_Query и другими компонентами WordPress, автоматическая регенерация позволяет всегда работать с актуальными размерами и не беспокоиться о некорректном отображении медиа.
Советы и рекомендации по работе с изображениями в WordPress
1. Планируйте размеры изображений заранее и добавляйте их через add_image_size() в functions.php темы.
2. При смене размеров обязательно запускайте регенерацию, чтобы не было битых ссылок или некорректного отображения.
3. Используйте пакетную обработку для больших сайтов, чтобы избежать таймаутов и высокой нагрузки.
4. Храните оригиналы изображений, чтобы всегда можно было пересоздать миниатюры после изменений.
5. Рассмотрите возможность использования CDN и оптимизирующих плагинов, например WPRemark, чтобы дополнительно ускорить загрузку и обработку медиа.