В процессе работы с WordPress многие пользователи сталкиваются с проблемой накопления большого количества медиа файлов, которые уже не используются на сайте. Часто удаление постов или страниц не приводит к автоматическому удалению связанных изображений и других медиа, что со временем приводит к засорению хранилища и замедлению работы сайта.
Почему важно удалять связанные медиа файлы
В стандартном поведении WordPress при удалении записи медиа файлы, вставленные в неё, остаются в библиотеке. Это приводит к нескольким негативным последствиям:
- Занятие лишнего дискового пространства на сервере.
- Проблемы с бэкапами – они становятся больше и дольше создаются.
- Риск появления устаревших и неиспользуемых файлов, что усложняет управление сайтом.
Поэтому задача автоматического удаления медиа, связанных с удаляемыми постами, становится актуальной и полезной.
Как WordPress работает с медиа файлами и связями
Медиа файлы в WordPress хранятся как отдельный тип записи attachment. Каждое вложение указывает на родительский пост через поле post_parent. Именно эта связь позволяет определить, какие медиа файлы относятся к конкретной записи.
Однако при удалении поста WordPress не удаляет вложения автоматически, чтобы избежать потери файлов, которые могут использоваться в других местах.
Удаление связанных медиа файлов программно: пример функции для wpfind.ru
Рассмотрим, как написать функцию, которая будет удалять все вложения (медиа файлы), связанные с конкретным постом при его удалении. Мы добавим хук на удаление записи и реализуем функцию удаления вложений по post_parent.
function wpfind_delete_post_attachments($post_id) {
// Получаем все вложения с post_parent = $post_id
$args = array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_parent' => $post_id,
'fields' => 'ids',
'post_status' => 'any',
);
$attachments = get_posts($args);
if (!empty($attachments)) {
foreach ($attachments as $attachment_id) {
// Удаляем медиа файл вместе с физическим файлом
wp_delete_attachment($attachment_id, true);
}
}
}
// Добавляем хук на удаление поста
add_action('before_delete_post', 'wpfind_delete_post_attachments');Эта функция получает все вложения с родителем, равным удаляемому посту, и удаляет их физически вместе с записью в базе. Хук before_delete_post срабатывает перед удалением записи, что позволяет успеть удалить вложения.
Пояснения к коду
Использование wp_delete_attachment с параметром true гарантирует, что будет удалён не только пост-вложение, но и все файлы с диска (различные размеры изображений и оригинал).
Обратите внимание, что если медиа используется в других местах, оно тоже будет удалено, поэтому внимательно тестируйте такую автоматизацию.
Как удалить неиспользуемые медиа файлы
Иногда необходимо очистить библиотеку от файлов, которые не привязаны ни к одной записи и не используются на сайте. Для этого можно использовать плагины или писать собственные скрипты.
Плагин Media Cleaner (https://wpshop.ru/media-cleaner/?utm_source=wpfind.ru&utm_medium=article&utm_campaign=kak-udalit-svyazannye-media-fajly-v-wordpress-prakticheskoe-rukovodstvo) отлично справляется с задачей поиска и удаления неиспользуемых медиа. Он анализирует базу и файлы в папках, помогая безопасно очистить библиотеку.
Если хочется сделать это программно, то можно использовать следующий подход:
- Получить список всех вложений через
get_posts. - Проверить для каждого файла, используется ли он в мета данных, контенте записей, виджетах и настройках.
- Удалить те, которые нигде не используются.
Это достаточно сложная задача, поскольку медиа может использоваться динамически, в пользовательских полях или плагинах.
Пример расширенного кода для поиска и удаления неиспользуемых медиа
Ниже пример функции, которая проверяет наличие вложения в содержимом всех постов и удаляет, если не найдено:
function wpfind_delete_unused_attachments() {
$attachments = get_posts(array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'inherit',
'fields' => 'ids',
));
foreach ($attachments as $attachment_id) {
$url = wp_get_attachment_url($attachment_id);
$used = false;
// Получаем все посты с контентом
$posts = get_posts(array(
'posts_per_page' => -1,
'post_type' => 'any',
'post_status' => 'publish',
's' => basename($url), // ищем по имени файла
'fields' => 'ids',
));
if (!empty($posts)) {
$used = true;
}
if (!$used) {
wp_delete_attachment($attachment_id, true);
}
}
}
// Запускать вручную, например через wp-cli или отдельный обработчик
// wpfind_delete_unused_attachments();Важно: этот код не учитывает использование в мета полях, виджетах, настройках, поэтому для полного анализа лучше использовать специализированные плагины.
Плагины для управления медиа файлами на wpfind.ru
Если хочется расширить возможности работы с медиа, обратите внимание на следующие плагины из каталога WPSHOP.ru:
- Clearfy Pro – оптимизация и очистка сайта, в том числе управление медиа.
- WPRemark – улучшение работы с комментариями и вложениями.
- OmniVideo – для работы с медиа видео, если нужно удалять связанные видеофайлы.
Эти инструменты помогут автоматизировать процесс очистки и поддерживать порядок в библиотеке медиа.
Выводы и рекомендации
Удаление связанных медиа файлов — важный аспект оптимизации сайта на WordPress. Автоматизация процесса помогает сэкономить место на сервере и избежать захламления базы данных.
Перед внедрением автоматического удаления настоятельно рекомендуется создать резервную копию сайта. Также тестируйте скрипты в безопасной среде, чтобы не удалить нужные файлы.
Используйте готовые решения и плагины из проверенных источников, например WPSHOP.ru, чтобы повысить безопасность и удобство управления медиа.