Проблема накопления неиспользуемых и устаревших медиафайлов в WordPress знакома многим разработчикам и владельцам сайтов. Со временем сотни и даже тысячи изображений, аудио и видеофайлов могут занимать значительный объем дискового пространства, замедляя сайт и усложняя резервное копирование.
Почему важно удалять старые медиафайлы в WordPress
Медиафайлы, которые больше не используются на сайте, не только занимают место, но и могут привести к путанице при управлении контентом. Это особенно актуально для сайтов с большой базой данных и многолетней историей публикаций. Автоматизация процесса удаления старых медиафайлов помогает поддерживать порядок, сокращать нагрузку на сервер и улучшать производительность.
К тому же, регулярное удаление неиспользуемых файлов снижает риск проблем с бэкапами и обновлениями сайта.
Обзор популярных плагинов для управления медиа
Для решения этой задачи существуют готовые плагины, например:
- Media Cleaner — анализирует базу данных и выявляет неиспользуемые файлы.
- WP-Optimize — включает в себя функции очистки базы данных и удаления мусорных медиафайлов.
- Clearfy Pro (https://wpshop.ru/plugins/clearfy-pro/?utm_source=wpkey.ru&utm_medium=article&utm_campaign=kak-sozdat-nastrojku-dlya-avtomaticheskogo-udaleniya-staryh-medias-fajlov-v-wordpress) — комплексный оптимизатор, позволяющий настраивать автоматическую очистку сайта.
Однако у плагинов есть ограничения: они могут требовать ручного запуска очистки или не учитывать индивидуальные критерии удаления.
Как реализовать автоматическое удаление старых медиафайлов через кастомную настройку
Для большей гибкости можно создать собственный функционал, который будет удалять медиафайлы, не привязанные к записям и старше определенного времени. Рассмотрим пример реализации на PHP.
Шаг 1. Добавление страницы настроек в админке WordPress
Создадим страницу настроек с возможностью задать период хранения файлов (в днях) и запускать очистку вручную.
add_action('admin_menu', 'wpkey_add_media_cleaner_settings_page');
function wpkey_add_media_cleaner_settings_page() {
add_submenu_page(
'tools.php',
'Очистка старых медиафайлов',
'Очистка медиа',
'manage_options',
'wpkey-media-cleaner',
'wpkey_render_media_cleaner_settings'
);
}
function wpkey_render_media_cleaner_settings() {
if (!current_user_can('manage_options')) {
wp_die('Доступ запрещен');
}
if (isset($_POST['wpkey_media_days'])) {
$days = intval($_POST['wpkey_media_days']);
update_option('wpkey_media_days', $days);
echo '<div class="updated"><p>Настройки сохранены.</p></div>';
}
$days = get_option('wpkey_media_days', 30);
?>
<div class="wrap">
<h1>Очистка старых медиафайлов</h1>
<form method="post">
<label for="wpkey_media_days">Удалять файлы старше (в днях):</label>
<input type="number" id="wpkey_media_days" name="wpkey_media_days" value="<?php echo esc_attr($days); ?>" min="1" />
<p><input type="submit" class="button button-primary" value="Сохранить"></p>
</form>
<form method="post" action="">
<input type="hidden" name="wpkey_run_cleanup" value="1" />
<p><input type="submit" class="button button-secondary" value="Запустить очистку сейчас"></p>
</form>
</div>
<?php
}Шаг 2. Реализация функции удаления старых неиспользуемых медиафайлов
Функция будет искать вложения, которые не связаны с активными постами и старше заданного количества дней. Затем удалять их из медиатеки и файловой системы.
add_action('admin_init', 'wpkey_handle_media_cleanup');
function wpkey_handle_media_cleanup() {
if (!current_user_can('manage_options')) {
return;
}
if (!empty($_POST['wpkey_run_cleanup'])) {
$days = get_option('wpkey_media_days', 30);
$cutoff = strtotime('-' . $days . ' days');
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', $cutoff),
),
),
'meta_query' => array(
array(
'key' => '_wp_attachment_metadata',
'compare' => 'EXISTS',
),
),
);
$attachments = get_posts($args);
$deleted_count = 0;
foreach ($attachments as $attachment) {
// Проверка, используется ли файл в других местах
$is_used = wpkey_check_attachment_usage($attachment->ID);
if (!$is_used) {
wp_delete_attachment($attachment->ID, true);
$deleted_count++;
}
}
add_action('admin_notices', function() use ($deleted_count) {
echo '<div class="updated"><p>Удалено медиафайлов: ' . intval($deleted_count) . '</p></div>';
});
}
}
function wpkey_check_attachment_usage($attachment_id) {
global $wpdb;
// Проверяем, есть ли ссылки на вложение в содержимом постов
$like = '%"' . $attachment_id . '"%';
$sql = $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s", $like);
$count = $wpdb->get_var($sql);
if ($count > 0) {
return true; // Вложение используется в содержимом
}
// Проверяем, связано ли вложение с родительским постом
$parent_id = wp_get_post_parent_id($attachment_id);
if ($parent_id > 0) {
return true;
}
return false;
}Настройка автоматического запуска очистки по расписанию
Чтобы не запускать очистку вручную, можно добавить WP-Cron задачу, которая будет запускать удаление например раз в неделю.
add_action('wpkey_weekly_media_cleanup_event', 'wpkey_run_scheduled_media_cleanup');
function wpkey_run_scheduled_media_cleanup() {
$days = get_option('wpkey_media_days', 30);
$cutoff = strtotime('-' . $days . ' days');
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', $cutoff),
),
),
);
$attachments = get_posts($args);
foreach ($attachments as $attachment) {
if (!wpkey_check_attachment_usage($attachment->ID)) {
wp_delete_attachment($attachment->ID, true);
}
}
}
// Планируем событие при активации плагина или темы
register_activation_hook(__FILE__, 'wpkey_schedule_weekly_cleanup');
function wpkey_schedule_weekly_cleanup() {
if (!wp_next_scheduled('wpkey_weekly_media_cleanup_event')) {
wp_schedule_event(time(), 'weekly', 'wpkey_weekly_media_cleanup_event');
}
}
// Удаляем событие при деактивации
register_deactivation_hook(__FILE__, 'wpkey_unschedule_weekly_cleanup');
function wpkey_unschedule_weekly_cleanup() {
wp_clear_scheduled_hook('wpkey_weekly_media_cleanup_event');
}Как дополнительно обезопасить процесс удаления медиафайлов
Удаление файлов — опасная операция, поэтому рекомендуем:
- Всегда делать резервную копию сайта перед запуском очистки.
- Тестировать функцию на тестовом сайте, чтобы избежать случайного удаления нужных файлов.
- Добавить логи удаления, чтобы отслеживать, какие файлы были удалены.
Для ведения логов можно расширить функцию wpkey_run_scheduled_media_cleanup, добавив запись в файл или базу данных.
Заключение
Автоматическое удаление старых и неиспользуемых медиафайлов — важный шаг к поддержанию чистоты и оптимизации WordPress сайта. Используя предложенный код, вы сможете гибко настроить период хранения медиа и запускать очистку в удобное время.
Если хотите более расширенный функционал с удобным интерфейсом и дополнительными настройками, обратите внимание на плагин Clearfy Pro, который позволит автоматизировать множество задач по оптимизации вашего сайта.