Как автоматически отклонять спам в комментариях, используя стоп-слова

👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

Многие пользуются для защиты от спама в комментариях навороченными плагинами, например, Akismet. Я же предпочитаю решать эту проблему либо с помощью невидимой каптчи, либо вообще без плагинов. Вот один способ, как без плагинов защитить комментарии от спама, используя стоп-слова.

Откройте файл functions.php, и вставьте в него такой код:

function in_comment_post_like($string, $array) {
    foreach($array as $ref) { if(strstr($string, $ref)) { return true; } }
    return false;
}
function drop_bad_comments() {
    if (!empty($_POST['comment'])) {
        $post_comment_content = $_POST['comment'];
        $lower_case_comment = strtolower($_POST['comment']);
        $bad_comment_content = array(
            'viagra',
            'hydrocodone',
            'hair loss',
            '[url=http',
            '[link=http',
            'xanax',
            'tramadol',
            'russian girls',
            'russian brides',
            'lorazepam',
            'adderall',
            'dexadrine',
            'no prescription',
            'oxycontin',
            'without a prescription',
            'sex pics',
            'family incest',
            'online casinos',
            'online dating',
            'cialis',
            'best forex',
            'amoxicillin'
        );
        if (in_comment_post_like($lower_case_comment, $bad_comment_content)) {
            $comment_box_text = wordwrap(trim($post_comment_content), 80, "n  ", true);
            $txtdrop = fopen('/var/log/httpd/wp_post-logger/nullamatix.com-text-area_dropped.txt', 'a');
            fwrite($txtdrop, "  --------------n  [COMMENT] = " . $post_comment_content . "n  --------------n");
            fwrite($txtdrop, "  [SOURCE_IP] = " . $_SERVER['REMOTE_ADDR'] . " @ " . date("F j, Y, g:i a") . "n");
            fwrite($txtdrop, "  [USERAGENT] = " . $_SERVER['HTTP_USER_AGENT'] . "n");
            fwrite($txtdrop, "  [REFERER  ] = " . $_SERVER['HTTP_REFERER'] . "n");
            fwrite($txtdrop, "  [FILE_NAME] = " . $_SERVER['SCRIPT_NAME'] . " - [REQ_URI] = " . $_SERVER['REQUEST_URI'] . "n");
            fwrite($txtdrop, '--------------**********------------------'."n");
            header("HTTP/1.1 406 Not Acodeeptable");
            header("Status: 406 Not Acodeeptable");
            header("Connection: Close");
            wp_die( __('bang bang.') );
        }
    }
}
add_action('init', 'drop_bad_comments');

Этот код создает функцию, которая проверяет вводимый в качестве комментария текст. Если текст содержит запрещенные слова (они перечислены в коде, по одному слову на каждую строчку), то комментарий считается спамом.
Что же тут такого, ведь в WordPress уже есть встроенный список, который справляется с этой задачей? Дело все в том, что эта функция не просто препятствует спаму — она не дает ему даже опубликоваться, закрывая соединение, в отличие от встроенного списка в WordPress, который все же пропускает текст в базу данных, просто помечая его как спам. Такой подход я считаю более действенным — не нужно периодически чистить комментарии, так как будут опубликованы только настоящие, а спамеры не получат даже шанса проникнуть в блог.

Создай свой первый сайт на WordPress

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. max77

    Добрый день! Подскажите, этот код вставлять в functions.php, который в /wp-includes лежит? Вставил код полностью, получил:
    Fatal error: Call to undefined function add_action() in …/wp-includes/functions.php on line 4603, страница не открывается
    без вот этой строчки add_action(‘init’, ‘drop_bad_comments’); работает, но не режет спам
    что нужно делать? стоит WP 3.2. Заранее спасибо!

    Ответить