


Блог IT-шника
Блог IT-шника
Привіт:) У цій замітці покажу як програмно відправити форму Contact Form 7 із деякою затримкою.
Мені була поставлена задача позбутися СПАМу, який надходить через форму Contact Form 7 на WordPress-сайті. Рішень є багато. Наприклад, додати Google Captcha, підтримка якої вже вбудована в Contact Form 7. Але вирішив не встановлювати додаткових плагінів та не використовувати зовнішні сервіси, а спробувати інший спосіб — відкласти відправлення форми на деякий час програмно.
За замовчуванням форма відправляється миттєво після успішної валідації всіх її полів. Зазвичай СПАМ приходить від ботів, які автоматично заповнюють форму на сайті. Для цього їм потрібно 1-2 секунди. А тому прийняв рішення збільшити час, протягом якого форма не може бути відправлена. В результаті лише після деякого визначеного часу відвідувач зможе відправити форму. Якщо кнопка відправлення буде натиснута раніше, під формою з'явиться відповідне повідомлення.
Код нижче достатньо розмістити у файлі functions.php. Після оновлення будь-якої сторінки на сайті він автоматично почне працювати.
/**
* Add timeout CF7 all forms submitions (anti SPAM)
*/
// Add a hidden field over time to the form
add_filter( 'wpcf7_form_hidden_fields', 'mp_cf7_add_submission_time_field' );
function mp_cf7_add_submission_time_field( $hidden_fields ) {
// Save the filling time
$hidden_fields['submission-time'] = time();
return $hidden_fields;
}
add_filter( 'wpcf7_validate', 'mp_cf7_check_form_submission_time', 10, 2 );
// Checking the filling time of the form before sending
function mp_cf7_check_form_submission_time( $result, $tag ) {
if ( isset( $_POST['submission-time'] ) ) {
$submission_time = (int) $_POST['submission-time'];
$current_time = time();
// If the form is filled out in less than XXX seconds, we show an error message
if ( $current_time - $submission_time < 10 ) {
add_filter( 'wpcf7_spam', 'mp_cf7_antispam', 10, 1 );
} else {
}
}
return $result;
}
function mp_cf7_antispam( $spam ) {
$spam = true;
return $spam;
}
// Changing the standard spam message
add_filter( 'wpcf7_display_message', function( $message, $status ) {
if ( $status == 'spam' ) {
// Replace the standard message with your own
return __( 'The form was filled out too quickly. Please try again.' );
}
return $message;
}, 10, 2 );
Код автоматично додасть сховане поле форми, у якому міститиметься час затримки. Після початку заповнення форми відвідувачем на сайті відбуватиметься порівняння тривалості її заповнення з часом затримки. Поки час заповнення не стане більшим за визначений відвідувач не зможе відправити форму.
У приведеному коді час затримки складає 10 секунд. Якщо його потрібно змінити, підставте своє число у рядку if ( $current_time - $submission_time < 10 )
.