sjaserds
@sjaserds
Студент

Как используя контактную форму на странице добавить запись в пост wordpress?

Всем добрый вечер, изучаю wordpress и взял код из проекта для обучения. Есть страница add_applicant.php, на этой странице расположена форма:
<form id="add_applicant">
      <?php wp_nonce_field( 'add_applicant', 'add_applicant_nonce'); ?>
      <input type="hidden" name="action" value="add_applicant"/>

      <label class="form__label mb-3">
        <span><?php _e('ФИО*:', 'dobro'); ?></span>
        <input type="text" name="title" class="form__field" require/>
      </label>
      <label class="form__label mb-3">
        <span><?php _e('E-mail:', 'dobro'); ?></span>
        <input type="text" name="mail" class="form__field"/>
      </label>
      <label class="form__label mb-3">
        <span><?php _e('телефон:', 'dobro'); ?></span>
        <input type="text" name="phone" class="form__field"/>
      </label>

      <label>
        <input type="checkbox" name="acceptance_privacy"/>
        <?php
        _e(
          'Даю согласие РГООИ "Надежда"на обработку персональных данных, указанных в анкете. С политикой обработки персональных данных можно ознакомиться на сайте <a href="https://rgooi-nadezhda.ru/politika-obrabotki-personalnyh-dannyh/" target="_blank">rgooi-nadezhda.ru</a>.',
          'dobro'
        );
        ?>
      </label>

      <label>
        <input type="checkbox" name="acceptance_public"/>
        <?php
        _e(
          'Заполняя анкету регистрации, даю согласие РГООИ "Надежда" на фото- и -видеофиксацию мероприятий с моим участием и публикацию материалов в открытых Интернет-источниках организаторов и их партнёров.',
          'dobro'
        );
        ?>
      </label>

      <button type="submit" class="button button--loadable mt-4 mx-auto" disabled>
        <span class="spinner-border spinner-border-sm mr-2" role="status">
          <span class="sr-only"><?php _e('Загрузка...', 'dobro'); ?></span>
        </span>
        <?php _e('Создать Заявителя', 'dobro'); ?>
      </button>

      <div id="error" class="form__result form__result--error mt-3"></div>
      <div id="success" class="form__result form__result--success mt-3">
        <?php
        _e(
          'Вы создали Заявителя.',
          'dobro'
        );
        ?>
      </div>
    </form>
....конец файла
<?php
wp_enqueue_script('add_applicant');
get_footer();


И js скрипт add_applicant.js

$(document).ready(function () {
  const $form = $('#add_applicant');
  const $submit = $('#add_applicant [type="submit"]');
  const $acceptancePrivacy = $('input[name="acceptance_privacy"]');
  const $acceptancePublic = $('input[name="acceptance_public"]');
  const $error = $('#error');
  const $success = $('#success');

  /**
   * Disabled submit button handler
   */
  function disabledSubmitHandler() {
    if ($acceptancePrivacy.prop('checked') && $acceptancePublic.prop('checked')) {
      $submit.prop('disabled', false);
    } else {
      $submit.prop('disabled', true);
    }
  }

  /**
   * Clear form
   */
  function clearForm() {
    $success.removeClass('d-block');
    $error.removeClass('d-block');
    $submit.prop('disabled', true);
  }

  /**
   * Send form to add applicant
   * 
   * @param {string} recaptchaToken current recaptcha token
   * @returns void
   */
  function sendForm(recaptchaToken) {
    const formData = new FormData($('#add_applicant')[0]);
    formData.append('recaptcha_token', recaptchaToken);
    $submit.addClass('button--loading');
    console.log(formData)

    // check require fields
    if ($form.find('[require]').filter(function () { return this.value === '' }).length > 0) {
      $error.html('Каккое-то поле не заполнено');
      $error.addClass('d-block');
      $submit.prop('disabled', false);
      $submit.removeClass('button--loading');
      return;
    }

    $.ajax({
      url: globalVariables.ajaxUrl,
      type: 'POST',
      data: formData,
      processData: false,
      contentType: false,
      success: function () {
        console.log(data)
        $success.addClass('d-block');
        $submit.prop('disabled', false);
        $submit.removeClass('button--loading');
      },
      error: function (data) {
        const response = JSON.parse(data);
        $error.html(response.data);
        $error.addClass('d-block');
        $submit.prop('disabled', false);
        $submit.removeClass('button--loading');
      },
    });
  }

  // add acceptance handlers
  $acceptancePrivacy.on('change', disabledSubmitHandler);
  $acceptancePublic.on('change', disabledSubmitHandler);

  // add google recaptch handler befor send form
  $form.on('submit', function (e) {
    e.preventDefault();
    clearForm();

    grecaptcha.ready(function () {
      grecaptcha.execute(
        globalVariables.recaptchaSiteKey,
        { action: 'submit' },
      ).then(sendForm);
    });
  });
});


Я зарегистрировал пост:

register_post_type('applicant', array(
        'labels'      => array(
            'name'          => 'Заявители',
            'singular_name' => 'Заявитель',
            'menu_name'     => 'Заявители',
            'all_items'     => 'Все заявители',
            'add_new'       => 'Добавить заявителя',
            'add_new_item'  => 'Добавить нового заявителя',
            'edit'          => 'Редактировать',
            'edit_item'     => 'Редактировать заявителя',
            'new_item'      => 'Новый заявитель',
        ),
        'label'       => 'Заявитель',
        'menu_icon'   => 'dashicons-groups',
        'public'      => true,
        'supports'    => array('title'),
    ));


Далее у меня вопрос что мне необходимо сделать что бы при нажатии на кнопку Создать заявителя у меня появлялся новый заявитель в базе. Этот код выдает ошибку ajax не могу понять в чем дело. Как эти данные передать в php скрипт для дальнейшей обработки?
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
sjaserds
@sjaserds Автор вопроса
Студент
Разобрался, необходимо в файл function.php, в моем случае это temlate-fucntion.php, добавить функцию, в которой я обрабатываю запросы $_POST и добавляю поля в мною зарегистрированный пост.
Пример:

function add_applicant_post_callback() {
	$title = sanitize_text_field(stripslashes($_POST['title'])) ?? '';
	$email = sanitize_text_field($_POST['email']) ?? null;
	$phone = sanitize_text_field($_POST['phone']) ?? null;

	// create data for new post
	$post_data = array(
		'post_title'    => sanitize_text_field( $title ),
		'post_status'   => 'publish',
		'post_author'   => 1,
		'post_type'     => 'applicant',
	);

	// create post
	$post_id = wp_insert_post( wp_slash($post_data), true );

	// checking a post for creation
	if( is_wp_error($post_id) ){
		wp_send_json_error($post_id->get_error_message());
	} else {
		require_once(ABSPATH . 'wp-admin/includes/image.php');
		require_once(ABSPATH . 'wp-admin/includes/file.php');
		require_once(ABSPATH . 'wp-admin/includes/media.php');
		
		update_field( 'email', $email, $post_id );
		update_field( 'phone', $phone, $post_id );
	}
	wp_send_json_success();
}
add_action( 'wp_ajax_nopriv_add_applicant', 'add_applicant_post_callback' );
add_action( 'wp_ajax_add_applicant', 'add_applicant_post_callback' );


И чтобы добавить в произвольное текстовое поле данные используем update_field().
wp_ajax_nopriv_add_applicant - необходим для отправки данных для не зарегистрированных пользователей.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы