Диагностика проблемы с нерабочими изображениями в WordPress
Нерабочие (битые) изображения — это файлы, которые физически присутствуют в медиабиблиотеке, но не отображаются на сайте из-за удалённых или изменённых URL, либо из-за ошибок в базе данных. Они занимают место на сервере и могут замедлять резервное копирование и загрузку сайта.
Для проверки наличия таких изображений можно использовать SQL-запросы к базе данных или плагины, например, Media Cleaner, но они требуют ручного запуска и контроля. Автоматизация с помощью WP-Cron поможет регулярно очищать медиабиблиотеку.
Как настроить WP-Cron для автоматического удаления нерабочих изображений
1. Создание функции для поиска и удаления нерабочих изображений
Ниже пример функции, которая перебирает все вложения типа 'image', проверяет их использование в постах и удаляет те, которые не используются:
function wpskill_delete_unused_images() {
global $wpdb;
// Получаем все ID вложений изображений
$attachments = get_posts(array(
'post_type' => 'attachment',
'post_mime_type' => 'image%',
'post_status' => 'inherit',
'numberposts' => -1
));
foreach ( $attachments as $attachment ) {
$attachment_id = $attachment->ID;
$attachment_url = wp_get_attachment_url( $attachment_id );
// Проверяем наличие URL изображения в контенте постов
$query = $wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_content LIKE %s AND post_status = 'publish'",
'%' . $wpdb->esc_like( $attachment_url ) . '%'
);
$post_id = $wpdb->get_var( $query );
// Если изображение не используется, удаляем его
if ( !$post_id ) {
wp_delete_attachment( $attachment_id, true );
}
}
}2. Регистрация задачи WP-Cron
Добавим событие, которое будет запускать функцию ежедневно:
function wpskill_schedule_unused_images_cleanup() {
if ( ! wp_next_scheduled( 'wpskill_daily_unused_images_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpskill_daily_unused_images_cleanup' );
}
}
add_action( 'wp', 'wpskill_schedule_unused_images_cleanup' );
add_action( 'wpskill_daily_unused_images_cleanup', 'wpskill_delete_unused_images' );3. Очистка расписания при деактивации плагина или темы
Чтобы не создавать «мусор» в планировщике, удалим событие при деактивации:
function wpskill_clear_unused_images_cleanup_schedule() {
$timestamp = wp_next_scheduled( 'wpskill_daily_unused_images_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpskill_daily_unused_images_cleanup' );
}
}
register_deactivation_hook( __FILE__, 'wpskill_clear_unused_images_cleanup_schedule' );Проверка результата после внедрения
- Включите отладку WP-Cron с помощью плагина WP Crontrol или WP-CLI командой
wp cron event list— убедитесь, что событиеwpskill_daily_unused_images_cleanupприсутствует. - Для тестирования вызовите функцию вручную с помощью временного вызова
wpskill_delete_unused_images();в functions.php и проверьте, что неиспользуемые изображения удалились. - Проверьте медиатеку и сайт на предмет отсутствия ошибок и пропавших изображений, чтобы убедиться, что удалены только неиспользуемые файлы.
Частые ошибки и их исправление
- Удаление нужных изображений: если изображения используются в нестандартных местах (например, в мета-полях или виджетах), простой поиск по
post_contentне найдёт их. Решение — расширить проверку, включая мета-поля или сторонние таблицы. - WP-Cron не запускается: на некоторых хостингах WP-Cron срабатывает только при посещении сайта. Для надёжности настройте системный cron на вызов
wp-cron.phpили используйте плагин WP Crontrol для ручного запуска. - Большая нагрузка: удаление большого количества вложений за один запуск может вызвать таймаут. Разбейте задачу на части с помощью транзиентов или делайте по 10-20 записей за запуск.
Практические советы по безопасности и производительности
- Используйте
wp_delete_attachment( $id, true )с параметромtrueдля полного удаления файлов с диска. - Добавьте логирование удалений в отдельный файл или в системный журнал для аудита.
- Ограничьте права пользователя, под которым работает WP-Cron, чтобы исключить случайное удаление важных данных.
- Регулярно создавайте резервные копии перед автоматическим удалением файлов.
Сравнение подходов к удалению нерабочих изображений
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин Media Cleaner | Графический интерфейс, проверка разных мест использования | Требует ручного запуска, нагрузка на сайт |
| WP-Cron скрипт (примеры выше) | Автоматизация, минимальное вмешательство | Требует настройки, ограниченная проверка использования изображений |
| Ручной SQL + PHP скрипт | Полный контроль, можно расширить под свои нужды | Сложно настроить, риск ошибок |