В процессе работы с WordPress иногда возникает необходимость массового удаления всех файлов из медиатеки. Например, это нужно при переносе сайта, очистке хранилища или тестировании. В этой статье я расскажу, как программно удалить все медиафайлы из медиатеки WordPress, используя PHP-код с примерами и разбором.
Почему стандартные методы удаления не всегда удобны
Удаление медиафайлов через админку WordPress при большом количестве файлов становится неудобным и затратным по времени. Плагинов для массового удаления много, но они могут работать медленно или не удалять файлы с диска полностью, оставляя мусор в каталоге uploads.
Программный способ позволяет контролировать процесс, можно встроить функционал в кастомный плагин или использовать в консоли WP-CLI.
Как устроены медиафайлы в WordPress. Ключевые моменты
В WordPress медиафайлы — это записи с типом attachment, которые связаны с реальными файлами в папке wp-content/uploads.
Удаление медиафайла — это удаление записи в базе и физического файла на сервере (как основного, так и всех миниатюр).
Важно использовать штатные функции WordPress, чтобы не повредить базу данных и не оставить мусор.
Пример кода для удаления всех медиафайлов из медиатеки
Ниже пример функции, которая получает все вложения и удаляет их с помощью wp_delete_attachment(). Этот метод удаляет и записи, и файлы.
function wpboot_delete_all_media_attachments() {
// Получаем все ID вложений
$args = [
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'any',
'fields' => 'ids',
];
$attachments = get_posts($args);
if (empty($attachments)) {
echo 'Медиафайлы не найдены.';
return;
}
foreach ($attachments as $attachment_id) {
// Удаляем вложение полностью
$deleted = wp_delete_attachment($attachment_id, true);
if ($deleted) {
echo "Удалён медиафайл ID: $attachment_id<br>";
} else {
echo "Ошибка при удалении ID: $attachment_id<br>";
}
}
}
// Вызов функции
wpboot_delete_all_media_attachments();
Обратите внимание, что второй параметр wp_delete_attachment — true — означает удаление физического файла и всех его миниатюр.
Оптимизация удаления при большом количестве медиа
Если медиафайлов много (сотни или тысячи), то лучше удалять пакетами, чтобы избежать лимитов памяти и таймаутов. Можно сделать функцию с пагинацией, например, по 50 записей за раз.
function wpboot_delete_media_batch($batch_size = 50, $offset = 0) {
$args = [
'post_type' => 'attachment',
'posts_per_page' => $batch_size,
'offset' => $offset,
'post_status' => 'any',
'fields' => 'ids',
];
$attachments = get_posts($args);
if (empty($attachments)) {
return false; // Нет больше файлов
}
foreach ($attachments as $attachment_id) {
wp_delete_attachment($attachment_id, true);
}
return true;
}
// Использование в цикле
$offset = 0;
$batch_size = 50;
while (wpboot_delete_media_batch($batch_size, $offset)) {
$offset += $batch_size;
// Здесь можно добавить паузу или логирование
}
Использование плагинов для массового удаления медиа
Если вам удобнее использовать готовые решения, рекомендую обратить внимание на плагин Media Cleaner. Он сканирует медиатеку и позволяет удалять неиспользуемые медиафайлы.
Однако в сложных случаях, например при большом количестве файлов или нестандартной структуре, программное удаление более надежно и гибко.
Резюме и рекомендации
- Для массового удаления медиафайлов используйте
wp_delete_attachment()с параметромtrueдля полного удаления. - Удаляйте пакетами, чтобы избежать проблем с производительностью.
- Перед удалением сделайте резервную копию сайта и базы данных.
- Можно интегрировать код в кастомный плагин или использовать в WP-CLI для автоматизации.
- Проверяйте, что медиафайлы не используются в контенте перед удалением, чтобы не сломать сайт.
Если хотите автоматизировать проверку и удаление неиспользуемых медиа, обратите внимание на плагины или собственные скрипты с анализом контента.
Для дополнительного удобства рекомендую использовать Clearfy Pro, который помогает оптимизировать и очищать WordPress, включая работу с медиатекой.