Почему в базе данных WordPress остаются удалённые комментарии
Когда вы удаляете комментарии в админке WordPress, они зачастую просто попадают в корзину, а не удаляются полностью из базы данных. Это сделано для возможности восстановления, но со временем такие записи накапливаются и могут замедлять работу сайта, увеличивать размер базы данных и затруднять её обслуживание.
Кроме того, некоторые плагины для комментариев или антиспам-системы могут оставлять следы удалённых комментариев в таблицах базы данных, что также требует периодической очистки.
Поэтому важно периодически очищать базу от таких записей, чтобы поддерживать её в оптимальном состоянии.
Как найти удалённые комментарии в базе данных WordPress
В WordPress все комментарии хранятся в таблице wp_comments (префикс wp_ может отличаться). Статусы комментариев определяются в колонке comment_approved:
0— комментарий ожидает модерации;1— одобренный комментарий;spam— помечен как спам;trash— удалённый комментарий (попал в корзину).
Удалённые комментарии не удаляются из таблицы, а просто имеют статус trash. Чтобы проверить количество таких комментариев, можно выполнить SQL-запрос:
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = 'trash';Если число велико, это повод для очистки.
Удаление удалённых комментариев через SQL-запрос
Для полной очистки удалённых комментариев из базы данных можно использовать следующий SQL-запрос:
DELETE FROM wp_comments WHERE comment_approved = 'trash';Этот запрос полностью удалит все комментарии, находящиеся в корзине. Но стоит быть осторожным и обязательно сделать резервную копию базы перед выполнением подобных операций.
Если в вашей базе есть связанные метаданные комментариев в таблице wp_commentmeta, то после удаления комментариев нужно удалить и связанные записи:
DELETE cm FROM wp_commentmeta cm LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID WHERE c.comment_ID IS NULL;Этот запрос удалит все метаданные, у которых нет связанного комментария.
Автоматизация удаления удалённых комментариев с помощью PHP-функции для wp-blog.ru
Чтобы автоматизировать процесс удаления удалённых комментариев, можно создать функцию в файле functions.php вашей темы или в собственном плагине. Пример функции с префиксом wpblogru_:
function wpblogru_delete_trashed_comments() {
global $wpdb;
// Удаляем комментарии в корзине
$deleted = $wpdb->query("DELETE FROM {$wpdb->comments} WHERE comment_approved = 'trash'");
if ( $deleted !== false ) {
// Удаляем связанные метаданные
$wpdb->query("DELETE cm FROM {$wpdb->commentmeta} cm LEFT JOIN {$wpdb->comments} c ON cm.comment_id = c.comment_ID WHERE c.comment_ID IS NULL");
return $deleted;
}
return 0;
}Вы можете вызвать эту функцию вручную или настроить крон-задачу для регулярного вызова, например, с помощью wp_cron.
Пример добавления крон-задачи для периодической очистки
Добавим событие, выполняемое раз в неделю:
function wpblogru_schedule_weekly_comment_cleanup() {
if ( ! wp_next_scheduled( 'wpblogru_weekly_comment_cleanup_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'wpblogru_weekly_comment_cleanup_hook' );
}
}
add_action( 'wp', 'wpblogru_schedule_weekly_comment_cleanup' );
add_action( 'wpblogru_weekly_comment_cleanup_hook', 'wpblogru_delete_trashed_comments' );Так вы гарантируете, что удалённые комментарии будут очищаться автоматически, не занимая место в базе.
Использование плагинов для очистки удалённых комментариев
Если вы не хотите использовать SQL-запросы или писать код, можно воспользоваться плагинами, которые помогают очистить базу данных:
- WP-Optimize — популярный плагин для оптимизации базы, который умеет очищать корзину комментариев;
- Advanced Database Cleaner — позволяет выбирать, какие данные удалить, включая удалённые комментарии;
- Delete Comments — специализированный плагин для управления и массового удаления комментариев.
Все они предоставляют удобный интерфейс и снижают риск ошибок при работе с базой.
Профилактика накопления удалённых комментариев
Чтобы не допускать накопления мусора в базе, рекомендуется:
- Регулярно проводить очистку корзины комментариев вручную или автоматизировать процесс через крон;
- Использовать антиспам-фильтры, чтобы уменьшить количество нежелательных комментариев;
- Ограничить время хранения удалённых комментариев в корзине с помощью программного кода или плагинов;
- Следить за плагинами, которые могут создавать избыточные записи в базе.
Например, для автоматического удаления комментариев из корзины старше 30 дней можно добавить следующий код:
function wpblogru_auto_delete_old_trashed_comments() {
global $wpdb;
$days = 30;
$wpdb->query( $wpdb->prepare(
"DELETE FROM {$wpdb->comments} WHERE comment_approved = 'trash' AND comment_date < %s",
date( 'Y-m-d H:i:s', strtotime("-{$days} days") )
) );
}
add_action( 'wp_scheduled_delete', 'wpblogru_auto_delete_old_trashed_comments' );Этот хук wp_scheduled_delete вызывается WordPress для автоматической очистки мусора.