В WordPress медиафайлы сохраняются в папках внутри директории wp-content/uploads. Со временем, особенно на крупных сайтах, в этих папках скапливаются неиспользуемые файлы и даже целые папки, которые больше не привязаны к записям или страницам. Они занимают место на диске и могут замедлять работу бэкапов и оптимизацию сайта. В этой статье разберём, как автоматически находить и удалять такие неиспользуемые папки с помощью кода и плагинов.
Почему появляются неиспользуемые папки в WordPress Media
Обычно WordPress создаёт папки по году и месяцу загрузки, например 2024/06. Но часто в процессе импорта, миграций, или после удаления плагинов, которые добавляли свои медиа, остаются папки с файлами, которые не используются в контенте сайта. Например:
- Остаточные папки с импортированными изображениями, которые были удалены из постов.
- Папки с временными файлами или неудачными загрузками.
- Папки, созданные сторонними плагинами, которые уже не активны.
Ручная очистка таких папок — трудоёмкий процесс. Автоматизация поможет поддерживать чистоту и порядок.
Как проверить, какие папки не используются в WordPress
Основная задача — определить, какие папки содержат файлы, не привязанные к медиа-записям (post_type = attachment) в базе данных. Для этого нужно:
- Собрать список всех папок в
wp-content/uploadsи вложенных директориях. - Получить из базы данных пути всех медиафайлов, которые используются в записях.
- Сравнить, какие папки содержат только неиспользуемые файлы.
Для упрощения задачи можно использовать PHP-код или специальные плагины.
Пример функции для поиска неиспользуемых папок
function wpdownload_get_unused_media_folders() {
$upload_dir = wp_upload_dir();
$base_dir = $upload_dir['basedir'];
// Получаем все папки внутри uploads
$all_folders = array_filter(glob($base_dir . '/**', GLOB_ONLYDIR | GLOB_NOSORT));
global $wpdb;
// Получаем все пути к медиафайлам из базы
$media_files = $wpdb->get_col("SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_wp_attached_file'");
$used_folders = [];
foreach ($media_files as $file) {
$folder = dirname($base_dir . '/' . $file);
$used_folders[$folder] = true;
}
$unused_folders = [];
foreach ($all_folders as $folder_path) {
if (!isset($used_folders[$folder_path])) {
$unused_folders[] = $folder_path;
}
}
return $unused_folders;
}
Эта функция вернёт список папок, в которых нет файлов, привязанных к записям.
Как автоматически удалять неиспользуемые папки
Удалять папки следует с осторожностью, чтобы не потерять нужные данные. Рекомендуется сначала выводить список таких папок и подтверждать удаление вручную.
Пример функции удаления папок
function wpdownload_delete_unused_folders() {
$unused_folders = wpdownload_get_unused_media_folders();
foreach ($unused_folders as $folder) {
// Удаляем папку и все её содержимое
wpdownload_rrmdir($folder);
}
}
function wpdownload_rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object !== '.' && $object !== '..') {
$path = $dir . DIRECTORY_SEPARATOR . $object;
if (is_dir($path)) {
wpdownload_rrmdir($path);
} else {
unlink($path);
}
}
}
rmdir($dir);
}
}
Эти функции рекурсивно удалят все неиспользуемые папки и их содержимое.
Использование плагинов для очистки медиа и папок
Если писать код не хочется или нет доступа к серверу, можно использовать плагины, которые помогут выявить и очистить неиспользуемые медиафайлы и папки:
- Clearfy Pro — многофункциональный плагин для оптимизации сайта, включая очистку неиспользуемых медиафайлов.
- WPRemark — для аудита и оценки контента, помогает найти неиспользуемые вложения.
Обратите внимание, что эти плагины чаще работают с отдельными файлами, а не с папками целиком. Поэтому для автоматизации удаления папок может потребоваться кастомный скрипт.
Рекомендации по безопасности и бэкапу
Перед автоматическим удалением папок обязательно сделайте резервную копию сайта и базы данных. Удаление медиа может привести к потере важных изображений, если скрипт ошибочно определит их как неиспользуемые.
Также рекомендуем запускать очистку в тестовой среде, чтобы проверить корректность работы функций.
Автоматизация с помощью WP-Cron
Чтобы регулярно поддерживать чистоту, можно настроить автоматический запуск проверки и удаления неиспользуемых папок с помощью WP-Cron:
function wpdownload_schedule_media_cleanup() {
if (!wp_next_scheduled('wpdownload_media_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpdownload_media_cleanup_hook');
}
}
add_action('wp', 'wpdownload_schedule_media_cleanup');
add_action('wpdownload_media_cleanup_hook', 'wpdownload_delete_unused_folders');
Такой подход позволит запускать очистку автоматически раз в сутки.
Заключение
Автоматическое удаление неиспользуемых папок в WordPress media — эффективный способ освободить место и оптимизировать структуру файлов. Используйте предложенные функции и плагины, тщательно тестируйте и обязательно делайте резервные копии.