Как настроить ограничение отправки сообщений с Contact Form 7 для одного пользователя?
На сайте есть форма заказ звонка в первом экране и popap. Можно ли как-то настроить ограничение отправки с формы для одного пользовтеля не более 1 раза? А то иногда по 4-5 раз отправляют заявку, а деньги в Директ списываются как за новые конверсии.
Плагин WPAppsDev — CF7 Form Submission Limit не подходит, так как на сколько я понял при настройке нужно чтобы пользователь был авторизирован на сайте.
ответ от ChatGPT
add_action( 'wpcf7_before_send_mail', function( $contact_form ) { $limit_minutes = 10; // интервал в минутах между отправками $cookie_name = 'cf7_submit_block'; if ( isset( $_COOKIE[ $cookie_name ] ) ) { $last_time = intval( $_COOKIE[ $cookie_name ] ); $now = time(); if ( $now - $last_time < $limit_minutes * 60 ) { // Отменяем отправку $contact_form->skip_mail = true; // Сообщение об ошибке $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $submission->set_status( 'validation_failed' ); $submission->add_validation_error( '', 'Вы уже отправили сообщение недавно. Пожалуйста, подождите.' ); } return; } } // Обновляем cookie setcookie( $cookie_name, time(), time() + 3600, COOKIEPATH, COOKIE_DOMAIN ); }, 10, 1 );Спасибо за помощь! На хабр еще такой вариант предложили
// Хуки для Contact Form 7 add_action('wpcf7_before_send_mail', 'wpp_limit_cf7_submissions'); add_filter('wpcf7_display_message', 'wpp_block_cf7_form_display', 10, 2); function wpp_limit_cf7_submissions($contact_form) { $form_id = $contact_form->id(); $user_ip = $_SERVER['REMOTE_ADDR']; $user_agent = $_SERVER['HTTP_USER_AGENT']; // Создаем уникальный ключ для пользователя $user_key = md5($user_ip . $user_agent); $option_key = 'cf7_submission_' . $form_id . '_' . $user_key; // Проверяем, отправлял ли пользователь форму за последние 24 часа $last_submission = get_option($option_key); $current_time = time(); if ($last_submission && ($current_time - $last_submission) add_status('aborted', 'Вы уже отправляли заявку. Пожалуйста, подождите 24 часа.'); } return false; } // Записываем время отправки update_option($option_key, $current_time, false); return $contact_form; } function wpp_block_cf7_form_display($message, $status) { if ($status === 'aborted') { return 'Вы уже отправляли заявку. Пожалуйста, подождите 24 часа перед повторной отправкой.'; } return $message; }Вариант - норм, но с одним нюансом
update_option($option_key, $current_time, false);
Есть сохранение, но нет удаления!
Потом через 5 лет в БД будет 100 тыс опций
Образно, но вы поняли.
Читайте про set_transient - та же опция, но удал через указанное время.