При работе с загрузкой файлов на сайт WordPress часто возникает проблема: пользователи или скрипты могут случайно загружать одни и те же файлы несколько раз. Это приводит к засорению медиа-библиотеки, увеличению размера резервных копий и лишнему расходу дискового пространства. В этой статье разберем, как эффективно избегать повторной загрузки файлов и оптимизировать работу с медиа.
Почему повторная загрузка файлов — это проблема
Когда на сайт загружается файл, WordPress создает его копию и помещает в папку uploads, добавляя запись в базу данных. Если файл повторно загружается с тем же именем или даже другим, но с идентичным содержимым, то место на сервере расходуется зря. Кроме того, при большом количестве таких файлов страдает производительность сайта, увеличивается время резервного копирования и восстановления.
Особенно это актуально для сайтов с большим числом пользователей, где файлы могут загружаться через фронтенд, формы, REST API и другие методы.
Способы проверки дубликатов при загрузке файлов
Для предотвращения повторной загрузки можно использовать несколько подходов:
- Проверка имени файла. Самый простой, но не всегда надежный способ — сверять имена загружаемых файлов и существующих.
- Проверка размера и даты. Можно сравнивать размер файла и дату последнего изменения, но это не гарантирует полное совпадение содержимого.
- Хеширование содержимого файла. Самый точный метод — вычислять хеш (например, MD5 или SHA1) содержимого файла и сверять с уже загруженными файлами. Если совпадает, файл не загружается повторно.
Практическая реализация проверки хеша файла в WordPress
Рассмотрим, как добавить проверку дубликатов по MD5 при загрузке через стандартный механизм WordPress.
add_filter('wp_handle_upload_prefilter', 'wpupload_check_duplicate_file');
function wpupload_check_duplicate_file($file) {
$upload_dir = wp_upload_dir();
$existing_files = glob($upload_dir['basedir'] . '/**/*');
// Получаем хеш загружаемого файла
$temp_file = $file['tmp_name'];
$file_hash = md5_file($temp_file);
foreach ($existing_files as $existing_file) {
if (is_file($existing_file)) {
if (md5_file($existing_file) === $file_hash) {
$file['error'] = 'Файл с таким содержимым уже загружен.';
break;
}
}
}
return $file;
}
Этот код преграждает загрузку, если файл с одинаковым содержимым уже существует. В реальном проекте стоит оптимизировать поиск, например, хранить хеши в метаданных вложений для быстрого сравнения.
Использование метаданных вложений для оптимизации поиска дубликатов
Хранение хеша файла в мета полях вложения позволяет быстро находить дубликаты без обхода всех файлов на диске. Рассмотрим, как добавить вычисление и сохранение MD5 в момент загрузки файла:
add_filter('add_attachment', 'wpupload_save_file_hash');
function wpupload_save_file_hash($post_ID) {
$file_path = get_attached_file($post_ID);
if (file_exists($file_path)) {
$file_hash = md5_file($file_path);
update_post_meta($post_ID, '_wpupload_file_hash', $file_hash);
}
}
add_filter('wp_handle_upload_prefilter', 'wpupload_check_duplicate_using_meta');
function wpupload_check_duplicate_using_meta($file) {
$temp_file = $file['tmp_name'];
$file_hash = md5_file($temp_file);
$args = [
'post_type' => 'attachment',
'meta_query' => [
[
'key' => '_wpupload_file_hash',
'value' => $file_hash,
'compare' => '='
]
],
'posts_per_page' => 1,
'fields' => 'ids'
];
$query = new WP_Query($args);
if ($query->have_posts()) {
$file['error'] = 'Файл с таким содержимым уже загружен.';
}
wp_reset_postdata();
return $file;
}
Такой подход значительно ускоряет проверку дубликатов, особенно на больших сайтах.
Плагины для предотвращения дубликатов файлов в WordPress
Если вы не хотите писать код, есть готовые решения:
- Prevent Duplicate Uploads — проверяет дубликаты по имени и размеру, предупреждая пользователя.
- Clearfy Pro — комплексный плагин для оптимизации WordPress, в том числе с инструментами управления медиа.
Интеграция таких плагинов с кастомными решениями может дать лучший результат.
Рекомендации по работе с загрузками и медиа
Для поддержания чистоты медиа-библиотеки и оптимизации загрузок советуем:
- Регулярно проводить аудит и удалять неиспользуемые файлы с помощью плагинов, например, Clearfy Pro.
- Использовать проверку хеша для загрузок через фронтенд и REST API.
- Обеспечить информирование пользователей о дубликатах, чтобы избежать путаницы.
- Оптимизировать хранение и резервное копирование, исключая одинаковые файлы.
Выводы и практические советы
Предотвращение повторной загрузки файлов — важный элемент эффективного управления медиа в WordPress. Использование проверки по хешу и хранение этих данных в метаданных позволяет быстро и надежно выявлять дубликаты. При необходимости можно использовать готовые плагины или писать собственные фильтры загрузки.
Если вы разрабатываете функционал загрузки на сайте с помощью Ajax или REST API, интегрируйте проверку дубликатов на уровне серверной логики, чтобы избежать лишних операций и сохранить ресурсы.
Такой подход позволит сохранить порядок в медиа-библиотеке и обеспечит стабильную работу сайта даже при большом количестве загружаемых файлов.