Как быстро удалить «корзину» WordPress через MySQL

Проблема
После массового удаления старых записей через админку WordPress процесс «Очистить корзину» часто зависает и таймаутится. Это особенно заметно, когда удаляется сотни или тысячи записей — интерфейс не успевает обработать поток запросов, и операция прерывается.
Когда стоит использовать MySQL напрямую
- У вас тысячи удалённых записей, и админка не успевает их очистить.
- Вы администратор или разработчик с доступом к базе данных и умением выполнять SQL.
- Есть полный бэкап сайта и базы данных, проверенная тестовая среда.
Важно: любые прямые изменения в базе данных без бэкапа могут привести к необратимым потерям. Сделайте полный бэкап файлов и базы данных перед выполнением любых команд.
Быстрое решение: команда для подключения к MySQL
Откройте терминал и подключитесь к базе, используя значения из wp-config.php:
mysql -uUser -pPassword databaseЗамените User, Password и database на реальные значения из файла конфигурации. Если пароля нет, используйте только -uUser и затем введите пароль вручную.
Полный SQL-запрос для очистки корзины
Выполните следующий запрос в консоли MySQL. Он удалит не только записи в wp_posts со статусом trash, но и связанные метаданные и привязки к таксономиям:
DELETE wp_posts,wp_term_relationships,wp_postmeta,wp_term_taxonomy
FROM wp_posts
LEFT JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id )
LEFT JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
LEFT JOIN wp_term_taxonomy ON ( wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
WHERE wp_posts.post_status='trash';Что делает этот запрос
- Удаляет строки из wp_posts, у которых post_status = ‘trash’.
- Одновременно удаляет строки из wp_postmeta, wp_term_relationships и wp_term_taxonomy, связанные с этими постами, чтобы не оставлять «мусор» в базе.
Почему нельзя просто удалить из wp_posts
Можно выполнить простую команду:
DELETE FROM wp_posts WHERE post_status='trash';Однако это оставит привязанные метаданные и записи о таксономиях, что со временем займёт значительный объём и может исказить отчёты или ломать связи в базе.
Пошаговая инструкция для безопасного выполнения
- Сделайте полный бэкап файлов сайта (FTP/SSH) и дамп базы данных (mysqldump или средство хостинга).
- Восстановите бэкап на локальной или тестовой среде.
- Подключитесь к тестовой базе: mysql -uUser -pPassword database.
- Запустите SELECT-запрос для проверки количества постов «в корзине»:
SELECT COUNT(*) FROM wp_posts WHERE post_status='trash'; - На тесте выполните DELETE-запрос, приведённый выше.
- Проверьте логику сайта и индексы, убедитесь, что ничего критичного не пропало.
- Если всё в порядке, повторите операцию на продакшн-базе в окне с минимальной нагрузкой.
Альтернативные подходы
- Использовать WP-CLI: команда wp post delete $(wp post list –post_status=trash –format=ids) –force удалит записи из WP с учётом API платформы. Это безопаснее для структурных данных и триггеров WordPress.
- Плагин для массовой очистки: подходит, если вы доверяете плагину и он оптимизирован для больших объёмов данных.
- Пошаговое удаление через SQL с лимитами: DELETE … LIMIT 1000 и цикл для избежания долгих транзакций.
Когда этот метод не подойдёт
- Вы не уверены в корректности связей в базе (кастомные таблицы или плагины могут хранить зависимости в других таблицах).
- На сайте применены сложные кастомные связи, которые не покрываются перечисленными таблицами.
- Отсутствует бэкап или тестовая среда.
Меры предосторожности и откат
- Бэкап обязателен. Без дампа базы откат невозможен.
- Тестируйте на копии.
- После удаления проверьте: главную страницу, страницы постов, пагинацию, функциональность плагинов, карту сайта и бэкенд.
- Для отката восстановите дамп базы и файлы.
Роль-based чеклист перед выполнением
- Администратор: подтвердить наличие бэкапа и окна обслуживания.
- Разработчик: прогнать скрипт на тесте, подготовить скрипт восстановления.
- Оператор/DevOps: выполнить дамп базы и обеспечить доступ к консоли MySQL.
Критерии приёмки
- Количество записей со статусом ‘trash’ стало 0 или соответствует ожидаемому уменьшению.
- Нет ошибок в логах сайта после операции.
- Функционал сайта не нарушен (набор основных проверок пройден).
Контрольные тесты после удаления
- SELECT COUNT(*) FROM wp_posts WHERE post_status=’trash’; должен вернуть 0.
- Проверить наличие orphan-метаданных: SELECT COUNT(*) FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);
Короткое резюме
Удаление «корзины» через MySQL — быстрый и действенный способ для больших объёмов данных, но он требует строгого соблюдения мер предосторожности: бэкапа, тестирования на копии и проверки последствий на проде. Альтернатива — WP-CLI или пошаговые удаления с лимитом.
Итого: создайте бэкап, протестируйте, выполните запрос, проверьте сайт.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента