Как автоматизировать удаление старого медиафайла в WordPress с помощью кода

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

Почему важно удалять неиспользуемые медиафайлы

Накопление неактивных медиафайлов — типичная проблема, особенно для крупных проектов с частым обновлением контента. Основные причины, почему стоит удалять такие файлы:

  • Экономия дискового пространства и оптимизация хостинга.
  • Ускорение процессов резервного копирования и восстановления.
  • Улучшение производительности при загрузке страниц, если не используются плагины, работающие с медиа.
  • Упрощение администрирования и поддержания порядка в библиотеке.

Несмотря на то, что существуют плагины для этой задачи, например, Media Cleaner, автоматизация с помощью собственного кода даёт гибкость и возможность интеграции с другими процессами сайта.

Как определить, что медиафайл не используется

Ключевой момент — корректно выявить, какие файлы не используются на сайте. В WordPress медиафайлы хранятся в таблице wp_posts с типом attachment. Однако некоторые из них могут быть привязаны к записям, страницам, или вставлены в произвольный HTML-контент.

Основные подходы для определения «неиспользуемых» файлов:

  • Проверка, связана ли запись attachment с родительским постом (post_parent).
  • Поиск URL файла в содержимом записей, страниц, виджетов и метаданных.
  • Игнорирование недавно загруженных файлов и файлов, использованных в последних публикациях.

Для автоматизации можно реализовать скрипт, который по расписанию будет искать такие файлы и удалять их, либо помещать в корзину.

Пример кода для поиска и удаления неиспользуемых медиафайлов

Ниже представлен пример функции wpguest_check_and_delete_unused_attachments(), которая:

  1. Получает все медиафайлы с типом attachment.
  2. Проверяет наличие связи с родительским постом.
  3. Ищет в базе упоминание файла в контенте.
  4. Удаляет файл, если он не используется.
function wpguest_check_and_delete_unused_attachments() {
    global $wpdb;

    // Получаем все вложения
    $attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment'" );

    foreach ( $attachments as $attachment ) {
        // Проверяем наличие родителя
        $parent_id = get_post_field( 'post_parent', $attachment->ID );
        if ( $parent_id ) {
            continue; // Используется
        }

        // Ищем в контенте упоминание файла
        $file_url = esc_sql( $attachment->guid );
        $count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE '%" . $file_url . "%'" );

        if ( $count == 0 ) {
            // Удаляем вложение без корзины
            wp_delete_attachment( $attachment->ID, true );
        }
    }
}

// Добавим вызов функции через WP-Cron, например, раз в неделю
add_action( 'wpguest_weekly_cleanup', 'wpguest_check_and_delete_unused_attachments' );

if ( ! wp_next_scheduled( 'wpguest_weekly_cleanup' ) ) {
    wp_schedule_event( time(), 'weekly', 'wpguest_weekly_cleanup' );
}

Этот код можно добавить в файл functions.php вашей темы или создать отдельный плагин. Он будет каждую неделю автоматически удалять неиспользуемые вложения.

Важные замечания по безопасности

Перед автоматическим удалением рекомендуется:

  • Создать резервную копию сайта и базы данных.
  • Внедрить логи удаления для возможности анализа.
  • Добавить фильтр по дате — не удалять медиафайлы, загруженные недавно (например, за последние 30 дней), чтобы избежать случайного удаления.

Расширение функционала: интеграция с плагином WPRemark

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

Для этого в функцию удаления можно добавить проверку ссылок в метаполях, которые WPRemark может использовать для хранения вложенных файлов.

Практические советы для масштабирования и поддержки

Автоматическое удаление медиа — полезная практика, но требует контроля:

  • Регулярно проверяйте отчёты о удалённых файлах.
  • Тестируйте на тестовой среде перед запуском на бойовом сайте.
  • При больших объёмах данных разбивайте процесс удаления на части, чтобы не перегружать сервер.
  • Используйте WP-CLI для выполнения скрипта вручную при необходимости.

Например, для частичного удаления можно добавить ограничение выборки в SQL-запросе:

$attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment' LIMIT 100" );

Это позволит выполнять удаление по 100 файлов за раз.

Заключение

Автоматизация удаления старых медиафайлов в WordPress при помощи собственного кода позволяет держать сайт в чистоте и оптимизировать ресурсы. Важно тщательно реализовать проверку использования файлов и предусмотреть меры безопасности. В сочетании с плагинами, такими как WPRemark, этот подход становится ещё эффективнее для комплексного управления контентом.

Как использовать WPRemark для автоматического управления отзывами в WordPress
10.02.2026
Удаление неиспользуемых метаданных WordPress для оптимизации базы данных
11.12.2025
Как автоматизировать удаление неиспользуемых пользователей в WordPress
01.04.2026
Как избежать 404 ошибок при изменении URL в WordPress
27.06.2026
Как избежать ошибки 429 в WooCommerce при автообновлении корзины
19.04.2026