В WordPress с течением времени накапливается множество изображений, которые больше не используются в контенте сайта. Это не только занимает место на сервере, но и может замедлять работу сайта и усложнять управление медиафайлами. В этой статье мы рассмотрим, как эффективно находить и удалять старые изображения без использования плагинов, используя чистый PHP-код и стандартные функции WordPress.
Почему стоит удалять старые изображения в WordPress
Изображения могут занимать значительный объем дискового пространства, особенно если сайт активно развивается и публикуется много материалов. Старые, неиспользуемые файлы:
- Увеличивают размер резервных копий;
- Могут замедлять работу медиа-библиотеки;
- Создают беспорядок в структуре файлов;
- Могут усложнять SEO, если забыты удалить и не оптимизированы.
Удаление таких файлов поможет поддерживать сайт в порядке и сократить нагрузку на хостинг.
Как определить, какие изображения не используются
Основная задача — найти изображения, которые есть в папке wp-content/uploads, но не привязаны к записям, страницам или метаданным WordPress. Для этого можно использовать несколько подходов:
1. Сравнение файлов и записей в базе данных
WordPress хранит информацию о загруженных медиафайлах в таблице wp_posts с типом записи attachment. Если в папке uploads есть файлы, которых нет в этой таблице, значит, они не зарегистрированы и не используются.
2. Проверка использования файлов в контенте
Даже если файл есть в базе, он может не использоваться на сайте. Для полной проверки нужно искать ссылки на изображения в содержимом постов, страниц и мета-полях.
Практическое решение: скрипт для поиска неиспользуемых изображений
Ниже приведён пример PHP-скрипта, который можно запустить однократно через файл в корне сайта или через консоль WP-CLI. Он выводит список файлов из папки uploads, которые отсутствуют в базе данных WordPress или не используются в контенте.
<?php
// Подключаем WordPress для доступа к функциям и базе данных
require_once 'wp-load.php';
function wpdream_find_unused_images() {
global $wpdb;
$upload_dir = wp_upload_dir();
$base_dir = $upload_dir['basedir'];
// Получаем все файлы из uploads
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($base_dir));
$all_files = [];
foreach ($files as $file) {
if ($file->isFile()) {
$path = $file->getPathname();
// Относительный путь от uploads
$relative_path = str_replace($base_dir . '/', '', $path);
$all_files[] = $relative_path;
}
}
// Получаем все attachment guid из базы
$attachments = $wpdb->get_col("SELECT guid FROM {$wpdb->posts} WHERE post_type = 'attachment'");
$attachment_files = [];
foreach ($attachments as $guid) {
$url_path = parse_url($guid, PHP_URL_PATH);
$file_path = basename($url_path);
$attachment_files[] = $file_path;
}
// Получаем все содержимое постов для поиска ссылок на изображения
$posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_status = 'publish' AND (post_type = 'post' OR post_type = 'page')");
$used_files = [];
foreach ($posts as $post) {
// Ищем в содержимом все src изображений
if (preg_match_all('/<img\s+[^>]*src=["\']([^"\']+)["\']/i', $post->post_content, $matches)) {
foreach ($matches[1] as $img_url) {
$img_file = basename(parse_url($img_url, PHP_URL_PATH));
$used_files[] = $img_file;
}
}
}
$unused_files = [];
foreach ($all_files as $file) {
$file_name = basename($file);
// Если файл нет в базе или не используется в контенте
if (!in_array($file_name, $attachment_files) || !in_array($file_name, $used_files)) {
$unused_files[] = $file;
}
}
return $unused_files;
}
$unused_images = wpdream_find_unused_images();
echo "<h2>Список неиспользуемых изображений</h2>";
echo "<ul>";
foreach ($unused_images as $image) {
echo "<li>" . esc_html($image) . "</li>";
}
echo "</ul>";
?>Этот скрипт помогает выявить потенциально ненужные файлы. Однако перед удалением настоятельно рекомендуется создать резервную копию и убедиться, что файлы действительно не используются в других местах, например, в виджетах или кастомных полях.
Как безопасно удалить неиспользуемые изображения
После того как список получен, удалить файлы можно вручную через FTP или средствами хостинга. Если вы хотите автоматизировать процесс, можно добавить функцию удаления в тот же скрипт с подтверждением.
Пример функции удаления файла с проверкой:
function wpdream_delete_file_safe($file_path) {
$upload_dir = wp_upload_dir();
$full_path = $upload_dir['basedir'] . '/' . $file_path;
if (file_exists($full_path)) {
return unlink($full_path);
}
return false;
}Важно не удалять файлы, которые могут использоваться в других местах. Для этого можно дополнительно проверять привязку в мета-данных или кешах.
Рекомендации и альтернативы удаления изображений
Если вы не хотите писать свой код, можно использовать готовые плагины. Например, Clearfy Pro предлагает расширенные возможности оптимизации, включая очистку медиа-библиотеки от неиспользуемых файлов.
Также можно использовать WP-CLI команду wp media regenerate для пересоздания миниатюр и проверки целостности медиафайлов.
В целом, регулярный аудит медиафайлов и оптимизация — важный шаг для поддержания производительности и порядка на сайте.