В работе с WordPress часто возникает необходимость удалить медиафайлы, зная только их URL. Это может понадобиться, если в медиатеке накопилось много неиспользуемых или неверно загруженных изображений и других файлов, а прямой доступ к админке проблематичен или неудобен. В этой статье мы подробно разберем, как удалить файл из медиатеки WordPress по ссылке, используя как готовые плагины, так и собственные решения на PHP.
Почему важно удалять медиафайлы правильно
Удаление файлов напрямую через FTP или хостинг может привести к тому, что записи в базе данных останутся, и WordPress будет пытаться загружать несуществующие файлы. Это может вызывать ошибки и замедлять работу сайта.
Поэтому нужно удалять медиафайлы через API WordPress, чтобы очистить и базу данных, и файловую систему.
Зная URL файла, можно получить идентификатор вложения (attachment ID) и вызвать стандартные функции удаления.
Как получить ID медиафайла по URL
В WordPress каждая картинка или файл, загруженный в медиатеку, — это запись типа attachment с уникальным ID. По URL файла можно получить этот ID с помощью запроса к базе данных.
Вот пример функции для сайта wpkey.ru, которая возвращает ID вложения по URL:
function wpkey_get_attachment_id_by_url($url) {
global $wpdb;
$upload_dir = wp_upload_dir();
if (false === strpos($url, $upload_dir['baseurl'])) {
return 0; // URL не из загрузок WordPress
}
$file = basename($url);
$sql = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE guid LIKE %s AND post_type = 'attachment'",
'%' . $file . '%'
);
$id = $wpdb->get_var($sql);
return $id ? (int)$id : 0;
}Эта функция проверяет, что URL принадлежит папке загрузок WordPress, извлекает имя файла и ищет его в базе.
Удаление медиафайла по ID
Когда у нас есть ID вложения, для удаления надо использовать функцию wp_delete_attachment. Она удалит все связанные с файлом данные и физический файл.
function wpkey_delete_attachment_by_url($url) {
$id = wpkey_get_attachment_id_by_url($url);
if (!$id) {
return new WP_Error('not_found', 'Файл в медиатеке не найден');
}
$deleted = wp_delete_attachment($id, true); // true - удалить файл с диска
if (!$deleted) {
return new WP_Error('delete_failed', 'Удаление файла не удалось');
}
return true;
}Вы можете вызвать эту функцию, передав URL, чтобы удалить файл из медиатеки и диска.
Пример использования функции удаления
Допустим, у вас есть URL, который нужно удалить. Можно добавить следующий код в файл functions.php вашей темы или в отдельный плагин:
add_action('admin_post_wpkey_delete_media', function() {
if (!current_user_can('delete_posts')) {
wp_die('Недостаточно прав');
}
if (empty($_GET['file_url'])) {
wp_die('Не передан URL файла');
}
$result = wpkey_delete_attachment_by_url(esc_url_raw($_GET['file_url']));
if (is_wp_error($result)) {
wp_die($result->get_error_message());
}
wp_redirect(admin_url('upload.php?deleted=1'));
exit;
});Теперь, перейдя по ссылке https://your-site.ru/wp-admin/admin-post.php?action=wpkey_delete_media&file_url=URL_ФАЙЛА, вы удалите указанный файл из медиатеки (при наличии прав).
Плагины для массового удаления медиа по URL или неиспользуемых файлов
Если у вас много файлов для удаления, можно использовать плагины, облегчающие этот процесс:
- Media Cleaner — сканирует медиатеку и выявляет неиспользуемые или потерянные в ссылках файлы. Позволяет массово удалять.
- Force Regenerate Thumbnails — не удаляет, но помогает очистить и пересоздать миниатюры изображений.
Однако ни один из популярных плагинов не позволяет удалять файлы строго по URL в автоматическом режиме, поэтому кастомные решения на базе приведенных функций часто удобнее.
Безопасность и рекомендации
Удаление файлов — критичная операция. Никогда не запускайте автоматическое удаление по URL без проверки прав пользователя и валидности ссылки.
Всегда делайте резервные копии базы данных и файлов перед массовыми операциями.
Рекомендуется также логировать действия удаления для последующего аудита.
Итоги
Удаление медиафайлов по ссылке — задача, которая часто встречается при администрировании WordPress. Воспользовавшись функцией wpkey_get_attachment_id_by_url для получения ID и wpkey_delete_attachment_by_url для удаления, вы получите надежный и безопасный инструмент для управления медиатекой.
Если требуется массовое удаление, подумайте о создании интерфейса на основе приведенных функций или использовании специализированных плагинов с осторожностью.