Зачем удалять спам-комментарии вручную и через код
Спам-комментарии — одна из распространённых проблем для владельцев сайтов на WordPress. При большом количестве спама нагрузка на базу данных возрастает, что замедляет работу сайта и негативно влияет на SEO. Автоматические плагины помогают бороться со спамом, но иногда необходимо быстро и эффективно очистить базу от накопившихся спам-комментариев.
Самый простой способ — использовать админ-панель WordPress, перейдя в раздел «Комментарии» и выбрав все спам-комментарии для удаления. Однако при тысячах записей это неудобно и долго. В таких случаях на помощь приходит программный метод — написание собственного кода, который удалит все спам-комментарии за один запрос.
В этой статье мы рассмотрим, как с помощью PHP-функций и SQL-запросов удалить спам-комментарии, а также покажем пример функции, которую можно добавить в файл functions.php вашей темы или в отдельный плагин.
Как определить спам-комментарии в базе данных WordPress
Все комментарии в WordPress хранятся в таблице wp_comments. Статус комментария задаётся полем comment_approved. Для спама это значение — 'spam'. Таким образом, удалить спам-комментарии можно, выбрав записи с comment_approved = 'spam'.
Пример SQL-запроса, который удалит все спам-комментарии:
DELETE FROM wp_comments WHERE comment_approved = 'spam';Однако простой запрос к базе данных не всегда безопасен. Лучше использовать функции WordPress, чтобы обработать удаление и связанные с комментариями данные (например, мета-комментарии и кэш).
Функция для удаления всех спам-комментариев через WordPress API
Ниже пример функции wpmail_delete_all_spam_comments(), которая удалит все спам-комментарии, используя встроенные функции WordPress. Это безопасный и рекомендуемый способ:
function wpmail_delete_all_spam_comments() {
// Получаем все ID спам-комментариев
$spam_comments = get_comments([
'status' => 'spam',
'fields' => 'ids',
'number' => 0 // без лимитов
]);
if (empty($spam_comments)) {
return 'Спам-комментариев для удаления не найдено.';
}
foreach ($spam_comments as $comment_id) {
wp_delete_comment($comment_id, true); // true — удаление без возможности восстановления
}
return count($spam_comments) . ' спам-комментариев успешно удалены.';
}Эту функцию можно вызвать, например, через AJAX, WP-CLI или временно добавить в functions.php и вызвать по URL. Главное — удалить её после использования, чтобы не допустить случайных вызовов.
Пример вызова через WP-CLI
Если на сервере установлен WP-CLI, можно создать кастомную команду для удаления спам-комментариев:
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wpmail-delete-spam', function() {
$message = wpmail_delete_all_spam_comments();
WP_CLI::success($message);
});
}После этого в терминале достаточно в корне сайта выполнить:
wp wpmail-delete-spamИспользование плагинов для массового удаления спама
Если вы предпочитаете не использовать код, можно обратиться к плагинам. Некоторые из них поддерживают массовое удаление спама:
- WP Bulk Delete — позволяет массово удалять комментарии по статусу, включая спам.
- Advanced Database Cleaner — оптимизирует базу, удаляя спам и мусорные данные.
- Delete All Comments of Spam — специализированный плагин для удаления всех спам-комментариев одним кликом.
Однако у таких плагинов есть ограничения при очень большом объёме спама, они могут зависнуть или вызвать таймауты. В таких случаях предпочтительнее использовать код.
Советы по оптимизации и безопасности при работе с удалением спама
При работе с удалением спам-комментариев важно учитывать несколько моментов:
- Перед удалением сделайте резервную копию базы данных.
- Используйте функции WordPress для безопасного удаления, чтобы не повредить данные.
- Удаляйте спам регулярно, чтобы база не разрасталась.
- При больших объёмах данных делайте удаление партиями по 500–1000 комментариев, чтобы избежать превышения времени выполнения скрипта.
Пример удаления спама партиями:
function wpmail_delete_spam_comments_batch($batch_size = 500) {
$spam_comments = get_comments([
'status' => 'spam',
'fields' => 'ids',
'number' => $batch_size
]);
if (empty($spam_comments)) {
return 'Спам-комментариев для удаления не найдено.';
}
foreach ($spam_comments as $comment_id) {
wp_delete_comment($comment_id, true);
}
return count($spam_comments) . ' спам-комментариев удалены в этой партии.';
}Вызывайте эту функцию циклично, пока не удалите весь спам.