Как создать плагин для автоматического удаления спам комментариев в WordPress

Спам-комментарии — одна из самых частых проблем, с которой сталкиваются владельцы сайтов на WordPress. Они не только загромождают базу данных, но и снижают качество сайта в глазах пользователей и поисковых систем. В этой статье мы подробно разберем, как создать собственный плагин, который будет автоматически удалять спам комментарии, используя встроенные возможности WordPress и дополнительные фильтры.

Почему стоит создавать собственный плагин для удаления спама

Существуют популярные плагины, такие как Akismet и Antispam Bee, которые эффективно борются со спамом. Однако иногда их функционала недостаточно, или хочется дополнительно автоматизировать процесс удаления старых спам-комментариев, чтобы не копить их в базе. Создание собственного плагина позволяет:

  • Автоматизировать удаление спама по расписанию;
  • Настроить фильтры под конкретные условия;
  • Избавиться от лишних плагинов и уменьшить нагрузку на сайт;
  • Получить контроль над процессом и логику удаления.

Далее мы создадим минимальный плагин, который будет удалять все спам комментарии старше 7 дней. Это простое, но эффективное решение для поддержания чистоты базы.

Создание плагина: структура и базовый код

Для начала создайте папку wp-market-spam-cleaner в директории wp-content/plugins/. Внутри создайте файл wp-market-spam-cleaner.php и добавьте в него следующий код:

<?php
/**
 * Plugin Name: WP Market Spam Cleaner
 * Description: Автоматическое удаление спам комментариев старше 7 дней.
 * Version: 1.0
 * Author: WP Market
 */

// Безопасность
if (!defined('ABSPATH')) {
    exit;
}

// Функция удаления спама
function wpmarket_delete_old_spam_comments() {
    global $wpdb;
    $days = 7; // удалять спам старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $query = $wpdb->prepare(
        "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_date < %s",
        $date
    );

    $deleted = $wpdb->query($query);

    if ($deleted !== false) {
        error_log("[WP Market Spam Cleaner] Удалено спам комментариев: " . $deleted);
    }
}

// Добавляем CRON задачу при активации плагина
function wpmarket_spam_cleaner_activate() {
    if (!wp_next_scheduled('wpmarket_spam_cleaner_cron')) {
        wp_schedule_event(time(), 'daily', 'wpmarket_spam_cleaner_cron');
    }
}
register_activation_hook(__FILE__, 'wpmarket_spam_cleaner_activate');

// Удаляем CRON задачу при деактивации
function wpmarket_spam_cleaner_deactivate() {
    wp_clear_scheduled_hook('wpmarket_spam_cleaner_cron');
}
register_deactivation_hook(__FILE__, 'wpmarket_spam_cleaner_deactivate');

// Обработчик CRON
add_action('wpmarket_spam_cleaner_cron', 'wpmarket_delete_old_spam_comments');

В этом коде:

  • Создается функция wpmarket_delete_old_spam_comments, которая удаляет из базы все комментарии со статусом spam, старше 7 дней.
  • При активации плагина регистрируется ежедневная CRON-задача, которая вызывает эту функцию.
  • При деактивации плагина задача отменяется.
  • Для безопасности проверяется константа ABSPATH.

Как расширить функциональность плагина: фильтрация и уведомления

Можно добавить дополнительные фильтры и настройки, чтобы плагин был более гибким и информативным.

Добавление фильтра по ключевым словам

Иногда хочется удалять не весь спам, а только комментарии, содержащие определенные слова. Для этого можно изменить SQL-запрос, добавив условие:

$keywords = ['viagra', 'casino', 'loan'];
$like_clauses = [];
foreach ($keywords as $word) {
    $like_clauses[] = $wpdb->prepare("comment_content LIKE %s", '%' . $wpdb->esc_like($word) . '%');
}
$like_sql = implode(' OR ', $like_clauses);

$query = $wpdb->prepare(
    "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_date < %s AND (" . $like_sql . ")",
    $date
);

Это позволит удалять только комментарии с перечисленными ключевыми словами.

Отправка уведомлений администратору

Для контроля можно отправлять письмо администратору после выполнения очистки:

if ($deleted !== false && $deleted > 0) {
    $admin_email = get_option('admin_email');
    wp_mail(
        $admin_email,
        'WP Market Spam Cleaner: удалено комментариев',
        "Удалено спам комментариев: " . $deleted
    );
}

Использование плагина с WPRemark для управления отзывами

Если на вашем сайте установлен плагин WPRemark, который управляет отзывами, можно интегрировать очистку спам-отзывов, расширив условие удаления и добавив дополнительные фильтры по мета-данным отзывов.

Для этого достаточно в функции удаления добавить проверку мета-данных и соответствующие условия.
Такой подход поможет поддерживать базу отзывов в чистоте, автоматически удаляя нежелательные записи.

Советы по тестированию и отладке

После активации плагина важно убедиться, что он работает корректно:

  • Проверьте наличие спам комментариев в админке;
  • Вручную запустите функцию очистки, вызвав wpmarket_delete_old_spam_comments() через WP-CLI или временно добавив вызов в шаблон;
  • Убедитесь, что CRON-задача срабатывает (можно посмотреть с помощью плагина WP Crontrol);
  • Проверьте логи и почту администратора на предмет уведомлений.

Если хотите более сложный интерфейс, можно добавить страницу настроек с выбором периода очистки, ключевых слов и опций уведомлений.

⭐⭐⭐⭐⭐