Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Как настроить ограничение отправки сообщений с Contact Form 7 для одного пользователя?

На сайте есть форма заказ звонка в первом экране и popap. Можно ли как-то настроить ограничение отправки с формы для одного пользовтеля не более 1 раза? А то иногда по 4-5 раз отправляют заявку, а деньги в Директ списываются как за новые конверсии.

Плагин WPAppsDev — CF7 Form Submission Limit не подходит, так как на сколько я понял при настройке нужно чтобы пользователь был авторизирован на сайте.

0
lawyer_ovr
11 месяцев назад 2
  • 0
    stepan 2283 weblancer.net/users/stepanko/?affiliate=...

    ответ от 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 );
    
    lawyer_ovr 11 месяцев назад

    Спасибо за помощь! На хабр еще такой вариант предложили

    // Хуки для 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;
    }
    stepan 11 месяцев назад

    Вариант - норм, но с одним нюансом

    update_option($option_key, $current_time, false);

    Есть сохранение, но нет удаления!
    Потом через 5 лет в БД будет 100 тыс опций smile
    Образно, но вы поняли.

    Читайте про set_transient - та же опция, но удал через указанное время.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация