Диагностика проблемы: зачем удалять неиспользуемые видео?
С течением времени медиабиблиотека WordPress может разрастаться, включая множество видеофайлов, которые больше не используются в контенте сайта. Это приводит к:
- Перегрузке хранилища на сервере;
- Ухудшению производительности бэкапа и восстановления;
- Повышенным затратам на хостинг и бэкап;
- Потере контроля над актуальностью контента.
Поэтому важно иметь метод для автоматического выявления и удаления неиспользуемых видеофайлов.
Как определить, какие видео не используются?
Видео считается неиспользуемым, если оно загружено в медиабиблиотеку, но не вставлено ни в один пост, страницу, виджет или WooCommerce-товар.
Для диагностики можно использовать SQL-запрос, который проверит связи вложений с контентом:
SELECT ID, post_title FROM wp_posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'video/%' AND ID NOT IN (SELECT meta_value FROM wp_postmeta WHERE meta_key = '_thumbnail_id') AND ID NOT IN (SELECT ID FROM wp_posts WHERE post_content LIKE CONCAT('%', guid, '%'));Однако такой запрос не всегда точен из-за динамического добавления видео через сторонние плагины и шорткоды.
Пошаговое решение: автоматическое удаление неиспользуемых видео через WP-CLI
1. Установка WP-CLI
Если WP-CLI не установлен на вашем сервере, установите его согласно официальной инструкции https://wp-cli.org/.
2. Поиск медиафайлов-видео без использования
Создайте пользовательский PHP-скрипт для поиска неиспользуемых видео:
<?php
function get_unused_videos() {
global $wpdb;
$query = "SELECT p.ID, p.guid FROM {$wpdb->posts} p
WHERE p.post_type = 'attachment'
AND p.post_mime_type LIKE 'video/%'
AND p.ID NOT IN (
SELECT DISTINCT pm.post_id FROM {$wpdb->postmeta} pm
WHERE pm.meta_value LIKE CONCAT('%', p.guid, '%')
)
AND p.ID NOT IN (
SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE CONCAT('%', p.guid, '%')
)";
return $wpdb->get_results( $query );
}Заметьте, что поиск основан на совпадении URL видео в контенте и метаданных. Для более точного результата потребуется адаптация под конкретные плагины и кастомные поля.
3. Удаление неиспользуемых видео
Используйте WP-CLI для удаления найденных вложений, например:
wp media delete ID_вложения --yesГде ID_вложения — идентификатор видеофайла из результата функции.
4. Автоматизация процесса (опционально)
Для регулярного удаления можно создать WP-Cron задачу:
add_action('wp_scheduled_delete_unused_videos', 'delete_unused_videos_function');
function delete_unused_videos_function() {
$videos = get_unused_videos();
foreach($videos as $video) {
wp_delete_attachment($video->ID, true);
}
}
if (!wp_next_scheduled('wp_scheduled_delete_unused_videos')) {
wp_schedule_event(time(), 'daily', 'wp_scheduled_delete_unused_videos');
}Проверка результата после внедрения
- Перед и после запуска скрипта сравните количество видео в медиабиблиотеке через консоль WP-CLI командой
wp media list --mime_type=video/*. - Проверьте, что видео действительно отсутствуют в контенте: пройдитесь по случайным постам и товарам.
- Убедитесь, что сайт корректно отображает оставшиеся видео, без битых ссылок.
Частые ошибки и как их исправить
- Ошибка: Удаляются нужные видео, используемые через кастомные шорткоды или плагины.
Решение: Расширьте функцию поиска, чтобы учитывать кастомные мета-поля и проверять содержимое шорткодов. - Ошибка: WP-Cron не срабатывает автоматически.
Решение: Проверьте, что WP-Cron активен или настройте системный cron на вызовwp-cron.php. - Ошибка: Скрипт слишком долго выполняется при большом объеме медиа.
Решение: Делите удаление на партии, используйте транзакции и обрабатывайте по частям.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных и файлов перед массовым удалением.
- Тестируйте скрипты на копии сайта, чтобы избежать потери важных данных.
- Ограничьте права пользователя, запускающего WP-CLI, чтобы предотвратить случайные удаления.
- Для ускорения поиска используйте индексы по полям
post_mime_typeиpost_content. - Можно интегрировать Clearfy Pro от WPShop для дополнительной очистки и оптимизации сайта: https://wpshop.ru/plugins/clearfy
Сравнение подходов: плагин vs код vs WP-CLI
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагины (например Media Cleaner) | Простота использования, визуальный интерфейс | Нагрузка на сайт, не всегда точные результаты, могут конфликтовать |
| Код в functions.php или отдельном плагине | Гибкость, можно адаптировать под сайт | Требует разработки и тестирования, риск ошибок |
| WP-CLI | Быстрота, подходит для больших сайтов, автоматизация | Требует доступа к серверу и навыков командной строки |