Как использовать WP-Cron для автоматического удаления нерабочих изображений в WordPress

Диагностика проблемы с нерабочими изображениями в 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 скриптПолный контроль, можно расширить под свои нуждыСложно настроить, риск ошибок
Как использовать WP-Cron для автоматического удаления заброшенных корзин в WooCommerce
26.06.2026
Как создать свой шорткод в WordPress с примером кода
06.11.2025
Как сделать отложенный запуск WP-Cron без зависаний и проблем
28.05.2026
Проверка и устранение проблем с постоянными ссылками (Permalinks) в WordPress
15.01.2026
Как избежать ошибок при миграции WooCommerce на новый домен
04.05.2026