A
A
abl802021-08-02 08:35:00
WordPress
abl80, 2021-08-02 08:35:00

How to create multiple feedback forms on the site?

Our feedback form script for Wordpress. Everything works great. The question is how to make several forms of communication with different fields on the same site based on this script?

add_shortcode( 'art_feedback', 'art_feedback' );
/**
 * <b>Шорткод вывода формы</b>
 *
 * @return string
 * @see
 */
function art_feedback() {

  ob_start();
  ?>
  <form id="add_feedback">
    <input type="text" name="art_name" id="art_name" class="required art_name" placeholder="Ваше имя" value=""/>

    <input type="email" name="art_email" id="art_email" class="required art_email" placeholder="Ваш E-Mail" value=""/>

    <input type="text" name="art_subject" id="art_subject" class="art_subject" placeholder="Тема сообщения" value=""/>

    <textarea name="art_comments" id="art_comments" placeholder="Сообщение" rows="10" cols="30" class="required art_comments"></textarea>

    <input type="checkbox" name="art_anticheck" id="art_anticheck" class="art_anticheck" style="display: none !important;" value="true" checked="checked"/>

    <input type="text" name="art_submitted" id="art_submitted" value="" style="display: none !important;"/>

    <input type="submit" id="submit-feedback" class="button" value="Отправить сообщение"/>
  </form>
  <?php

  return ob_get_clean();
}

add_action( 'wp_enqueue_scripts', 'art_feedback_scripts' );
/**
 * <b>Подключение файлов скрипта формы обратной связи</b>
 *
 * @see 
 */
function art_feedback_scripts() {

<b>	// Обрабтка полей формы</b>
  wp_enqueue_script( 'jquery-form' );

  // Подключаем файл скрипта
  wp_enqueue_script(
    'feedback',
    get_stylesheet_directory_uri() . '/js/feedback.js',
    array( 'jquery' ),
    1.0,
    true
  );

  // Задаем данные обьекта ajax
  wp_localize_script(
    'feedback',
    'feedback_object',
    array(
      'url'   => admin_url( 'admin-ajax.php' ),
      'nonce' => wp_create_nonce( 'feedback-nonce' ),
    )
  );

}

<b>Отправка данных формы через ajax</b>
jQuery(document).ready(function ($) {
    var add_form = $('#add_feedback');

    // Сброс значений полей
    $('#add_feedback input, #add_feedback textarea').on('blur', function () {
        $('#add_feedback input, #add_feedback textarea').removeClass('error');
        $('.error-name,.error-email,.error-comments,.message-success').remove();
        $('#submit-feedback').val('Отправить сообщение');
    });

    // Отправка значений полей
    var options = {
        url: feedback_object.url,
        data: {
            action: 'feedback_action',
            nonce: feedback_object.nonce
        },
        type: 'POST',
        dataType: 'json',
        beforeSubmit: function (xhr) {
            // При отправке формы меняем надпись на кнопке
            $('#submit-feedback').val('Отправляем...');
        },
        success: function (request, xhr, status, error) {
            
            if (request.success === true) {
                // Если все поля заполнены, отправляем данные и меняем надпись на кнопке
                add_form.after('<div class="message-success">' + request.data + '</div>').slideDown();
                $('#submit-feedback').val('Отправить сообщение');
            } else {
                // Если поля не заполнены, выводим сообщения и меняем надпись на кнопке
                $.each(request.data, function (key, val) {
                    $('.art_' + key).addClass('error');
                    $('.art_' + key).before('<span class="error-' + key + '">' + val + '</span>');
                });
                $('#submit-feedback').val('Что-то пошло не так...');

            }
            // При успешной отправке сбрасываем значения полей
            $('#add_feedback')[0].reset();
        },
        error: function (request, status, error) {
            $('#submit-feedback').val('Что-то пошло не так...');
        }
    };
    // Отправка формы
    add_form.ajaxForm(options);
});

Ajax processing

add_action( 'wp_ajax_feedback_action', 'ajax_action_callback' );
add_action( 'wp_ajax_nopriv_feedback_action', 'ajax_action_callback' );
/**
 * Обработка скрипта
 *
 * @see
 */
function ajax_action_callback() {

  // Массив ошибок
  $err_message = array();

  // Проверяем nonce. Если проверкане прошла, то блокируем отправку
  if ( ! wp_verify_nonce( $_POST['nonce'], 'feedback-nonce' ) ) {
    wp_die( 'Данные отправлены с левого адреса' );
  }

  // Проверяем на спам. Если скрытое поле заполнено или снят чек, то блокируем отправку
  if ( false === $_POST['art_anticheck'] || ! empty( $_POST['art_submitted'] ) ) {
    wp_die( 'Пошел нахрен, мальчик!(c)' );
  }

  // Проверяем полей имени, если пустое, то пишем сообщение в массив ошибок
  if ( empty( $_POST['art_name'] ) || ! isset( $_POST['art_name'] ) ) {
    $err_message['name'] = 'Пожалуйста, введите ваше имя.';
  } else {
    $art_name = sanitize_text_field( $_POST['art_name'] );
  }

  // Проверяем полей емайла, если пустое, то пишем сообщение в массив ошибок
  if ( empty( $_POST['art_email'] ) || ! isset( $_POST['art_email'] ) ) {
    $err_message['email'] = 'Пожалуйста, введите адрес вашей электронной почты.';
  } elseif ( ! preg_match( '/^[a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i', $_POST['art_email'] ) ) {
    $err_message['email'] = 'Адрес электронной почты некорректный.';
  } else {
    $art_email = sanitize_email( $_POST['art_email'] );

  }
  // Проверяем полей темы письма, если пустое, то пишем сообщение по умолчанию
  if ( empty( $_POST['art_subject'] ) || ! isset( $_POST['art_subject'] ) ) {
    $art_subject = 'Сообщение с сайта';
  } else {
    $art_subject = sanitize_text_field( $_POST['art_subject'] );
  }

  // Проверяем полей сообщения, если пустое, то пишем сообщение в массив ошибок
  if ( empty( $_POST['art_comments'] ) || ! isset( $_POST['art_comments'] ) ) {
    $err_message['comments'] = 'Пожалуйста, введите ваше сообщение.';
  } else {
    $art_comments = sanitize_textarea_field( $_POST['art_comments'] );
  }

  // Проверяем массив ошибок, если не пустой, то передаем сообщение. Иначе отправляем письмо
  if ( $err_message ) {

    wp_send_json_error( $err_message );

  } else {

    // Указываем адресата
    $email_to = '';

    // Если адресат не указан, то берем данные из настроек сайта
    if ( ! $email_to ) {
      $email_to = get_option( 'admin_email' );
    }

    $body    = "Имя: $art_name \nEmail: $art_email \n\nСообщение: $art_comments";
    $headers = 'From: ' . $art_name . ' <' . $email_to . '>' . "\r\n" . 'Reply-To: ' . $email_to;

    // Отправляем письмо
    wp_mail( $email_to, $art_subject, $body, $headers );

    // Отправляем сообщение об успешной отправке
    $message_success = 'Собщение отправлено. В ближайшее время я свяжусь с вами.';
    wp_send_json_success( $message_success );
  }

  // На всякий случай убиваем еще раз процесс ajax
  wp_die();

}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alexander Sobolev, 2021-08-03
@san_jorich

Oyoyoyoyoy .. why is that?
1) +1 to Anton Litvinenko : use plugins. Why is CF7 not an option? A classic of the genre ;-)
2) +1 to Artem Zolin : after all, each form can have its own id, attribute, class .. sign of a trigger to the handler .. specify

// На всякий случай убиваем еще раз процесс ajax
  wp_die();

Fire! )

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question