При работе с WordPress часто возникает проблема, когда в медиатеке остаются файлы, которые уже не используются на сайте, или которые были удалены из записей, но физически остались на сервере. Такие файлы занимают место и могут замедлять работу сайта, а также затруднять управление медиатекой. В этой статье рассмотрим, как найти и удалить такие «заброшенные» медиафайлы, используя как готовые плагины, так и собственные скрипты.
Почему в медиатеке появляются удалённые медиафайлы?
Медиафайлы могут оставаться в библиотеке, когда вы удаляете их из постов или страниц, но не удаляете из самой медиатеки. Также некоторые плагины создают временные или резервные копии изображений, которые потом не удаляются. Кроме того, при массовом импорте или обновлении контента иногда остаются неиспользуемые файлы.
Это особенно актуально для сайтов с большим объёмом контента и медиа. Поддержание медиатеки в чистоте помогает оптимизировать использование дискового пространства и ускорить резервное копирование сайта.
Проверка и удаление неиспользуемых медиафайлов с помощью плагинов
Самый простой способ — использовать специализированные плагины, которые анализируют медиатеку и находят файлы, не привязанные к записям.
Плагин Media Cleaner
Один из самых популярных инструментов — Media Cleaner. Он сканирует сайт и выявляет медиафайлы, которые не используются в записях, страницах, пользовательских типах записей и даже в кастомных полях.
- Преимущества: поддержка многих типов контента, возможность очистки базы данных.
- Недостатки: в бесплатной версии не удаляет файлы автоматически, нужна осторожность — плагин предлагает предварительный просмотр.
Для установки достаточно перейти в админку WordPress, выбрать «Плагины» → «Добавить новый» и ввести «Media Cleaner».
WPSHOP плагин Clearfy Pro для оптимизации медиа
Если вы используете Clearfy Pro, в нем есть функции оптимизации и очистки, включая удаление неиспользуемых медиафайлов. Плагин также позволяет отключить ненужные скрипты и улучшить производительность сайта.
Удаление удалённых медиафайлов через код: примеры и рекомендации
Если вы предпочитаете не использовать плагины или хотите автоматизировать процесс, можно написать собственный скрипт, который будет искать и удалять такие файлы. Вот пример функции wp1_remove_orphaned_media, которая ищет вложения, не связанные с постами, и удаляет их.
function wp1_remove_orphaned_media() {
// Получаем все вложения
$args = array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'inherit',
);
$attachments = get_posts($args);
$deleted = 0;
foreach ($attachments as $attachment) {
// Проверяем, есть ли родительский пост
if (!$attachment->post_parent || get_post_status($attachment->post_parent) === false) {
// Удаляем вложение физически
wp_delete_attachment($attachment->ID, true);
$deleted++;
}
}
return $deleted;
}
Эта функция перебирает все вложения и удаляет те, у которых нет действительного родителя. Вызовите её, например, в админке с помощью AJAX или через wp-cli для безопасной автоматизации.
Улучшение скрипта: фильтрация по типу файлов и дата создания
Чтобы не удалить важные файлы, можно добавить дополнительные проверки. Например, удалять только изображения старше 30 дней:
function wp1_remove_old_orphaned_images() {
$args = array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'inherit',
'post_mime_type' => 'image',
'date_query' => array(
'before' => date('Y-m-d', strtotime('-30 days')),
),
);
$attachments = get_posts($args);
$deleted = 0;
foreach ($attachments as $attachment) {
if (!$attachment->post_parent || get_post_status($attachment->post_parent) === false) {
wp_delete_attachment($attachment->ID, true);
$deleted++;
}
}
return $deleted;
}
Это помогает избежать удаления недавно загруженных временных файлов.
Как интегрировать очистку медиатеки в админ-панель WordPress
Для удобства можно добавить кнопку в админку, которая будет запускать очистку без необходимости заходить в код.
add_action('admin_menu', 'wp1_add_media_cleanup_page');
function wp1_add_media_cleanup_page() {
add_media_page('Очистка медиатеки', 'Очистка медиатеки', 'manage_options', 'wp1-media-cleanup', 'wp1_media_cleanup_page_callback');
}
function wp1_media_cleanup_page_callback() {
if (isset($_POST['wp1_cleanup'])) {
$deleted = wp1_remove_old_orphaned_images();
echo '<div class="updated notice">Удалено файлов: ' . esc_html($deleted) . '</div>';
}
echo '<h2>Очистка удалённых медиафайлов</h2>';
echo '<form method="post">';
echo '<p><input type="submit" name="wp1_cleanup" class="button button-primary" value="Удалить неиспользуемые медиафайлы" /></p>';
echo '</form>';
}
После добавления этого кода в файл темы functions.php или в отдельный плагин, в разделе Медиа → Очистка медиатеки появится страница с кнопкой. Нажатие на неё запустит удаление неиспользуемых изображений.
Резюме и советы по безопасности
Удаление неиспользуемых медиафайлов — полезная практика для поддержания сайта в порядке. Однако всегда делайте резервные копии перед массовым удалением, чтобы избежать потери важных данных.
Используйте проверенные плагины, такие как Media Cleaner или Clearfy Pro, если не хотите писать код своими руками.
Если же вы разрабатываете собственные решения, тщательно тестируйте их на тестовом сайте, чтобы не удалить нужные файлы.