Как обработать отправку формы?

4 авг. 2012 г., 00:56:23
Просмотры: 54.5K
Голосов: 17

Я новичок в WordPress и сталкиваюсь с некоторыми проблемами.

Сценарий использования следующий:

  1. Пользователю отображается форма заявки на создание клуба в его школе.
  2. Пользователь заполняет форму и нажимает кнопку 'Отправить'.
  3. Форма должна быть проверена.
  4. Если проверка успешна, данные сохраняются в пользовательской таблице club_details в базе данных, и пользователю показывается сообщение (например: Спасибо за отправку. Ваша заявка отправлена администратору на рассмотрение.), в противном случае пользователю показываются соответствующие сообщения об ошибках.
  5. Администратор заходит в панель администратора WordPress для одобрения ожидающих запросов на создание клуба. (Данные извлекаются из базы данных и показываются администратору).

Я сделал следующее:

  • для 1) Я создал форму заявки/страницу используя HTML редактор WordPress.
  • для 3) У меня есть JavaScript файл (validation.js), который содержит код валидации.
  • для 4) У меня есть PHP файл (club-functions.php), который содержит функцию storeInDB() для сохранения деталей заявки в пользовательской таблице базы данных.
  • для 5) Я создал свою собственную папку плагина и добавил PHP файл (club.php), который отображает детали заявки администратору в панели администратора WordPress.

Я застрял на следующем месте: Как обработать отправку формы. Где я должен разместить код, который вызывает функцию валидации JavaScript и затем вызывает функцию storeInDB().

Пожалуйста, предоставьте мне некоторые предложения, как я могу это реализовать, и является ли этот подход правильным? Заранее большое спасибо.

0
Все ответы на вопрос 2
9
16

Вам следует использовать функции wp_ajax или wp_ajax_nopriv.

В первую очередь, необходимо указать URL админ-аджакса в качестве значения атрибута action в форме отправки.

<form id="" action="<?php echo admin_url('admin-ajax.php'); ?>" method="post" class="form" >

Таким образом, форма будет отправляться в admin-ajax.php по умолчанию (без JavaScript). Вы можете использовать JavaScript для реализации работы через AJAX.

Далее следует функция, которая будет обрабатывать отправленные данные. Внутри формы разместите wp_nonce_field и скрытое поле ввода с именем action. В моем примере значение action — add_transfer.

<?php wp_nonce_field('add_transfer','security-code-here'); ?>
<input name="action" value="add_transfer" type="hidden">

Функцию для обработки этой формы можно разместить в файле functions.php или в файле вашего плагина. Используйте wp_ajax_ + имя действия, если форма предназначена только для авторизованных пользователей. Для неавторизованных пользователей используйте wp_ajax_nopriv + имя действия.

add_action('wp_ajax_add_transfer', 'process_add_transfer');

function process_add_transfer() {
    if ( empty($_POST) || !wp_verify_nonce($_POST['security-code-here'],'add_transfer') ) {
        echo 'Вы обратились к правильной функции, но, к сожалению, ваш nonce не подтвердился.';
        die();
    } else {
        // выполняйте вашу функцию здесь
        wp_redirect($redirect_url_for_non_ajax_request);
    }
}
4 авг. 2012 г. 02:39:00
Комментарии

Спасибо, ifdion, за ответ. Я создаю форму в 'HTML-редакторе Wordpress'. Так стоит ли включать PHP-код в форму, учитывая, что мне придется устанавливать плагин 'Exec-PHP', который, как мне кажется, это излишне? Поделитесь своими мыслями.

Pooja Pooja
4 авг. 2012 г. 17:00:39

Просто замените значение action на http://your-site-url.com/wp-admin/admin-ajax.php.

ifdion ifdion
5 авг. 2012 г. 00:36:46

Это работает?

ifdion ifdion
9 авг. 2012 г. 00:55:33

есть ли хороший способ добиться того же, но без admin-ajax.php?

Tahir Yasin Tahir Yasin
19 февр. 2014 г. 12:17:40

Я понимаю, что это старый ответ, но это не сработает, так как wp_redirect здесь ничего не сделает; AJAX-запросы выполняются в фоновом режиме, а wp_redirect — это просто умная обёртка для вызова header('location:...'), который должен быть выполнен до вывода данных. Если вам нужно перенаправление после AJAX-запроса, вы должны вернуть URL и обработать перенаправление через JS. Для справки: http://wordpress.stackexchange.com/a/133939/17826

indextwo indextwo
9 сент. 2015 г. 15:27:45

@indextwo спасибо за комментарий. Вы правы, для AJAX-запроса действительно нужно передать корректный URL и затем перенаправить через JS. wp_redirect также бесполезен в AJAX-запросе. Но мой ответ не использует JS, поэтому это не AJAX-запрос, хотя он использует функции wp_ajax и wp_ajax_nopriv. wp_redirect используется, чтобы увести пользователя с пустой страницы wp-admin/admin-ajax.php. Надеюсь, это проясняет ситуацию.

ifdion ifdion
10 сент. 2015 г. 19:18:13

'admin-ajax.php' → где находится этот файл? В какой папке?

WordCent WordCent
26 февр. 2019 г. 12:06:27

@TheWPNovice Я предполагаю, что он все еще в директории /wp-admin/. Обратите внимание, что вам не нужно изменять или добавлять что-либо в этот файл.

ifdion ifdion
27 февр. 2019 г. 08:59:31

Может ли эта система также работать с формой, которая пытается отправить email?

WordCent WordCent
27 февр. 2019 г. 19:06:00
Показать остальные 4 комментариев
2

Сначала позвольте мне сказать, что JavaScript-валидация работает на стороне клиента. Так что если пользователь отключит JavaScript, у вас возникнут проблемы.

Поэтому вам также следует проверять вводимые значения на стороне сервера.

Имея это в виду:

JavaScript-код можно вызывать напрямую со страницы, где находится форма. Атрибут onsubmit — это обычный способ его вызова.

Пример

<form onSubmit="validateForms()" method="post" action="domain.com/club-contacts">
    <label for="app_email">Заявка</label>
    <input type="text" name="app_email" id="app_email" value="" />
    <input type="hidden" name="app_application" value="1" />
    <input type="submit" name="app_form_send" value="Отправить" />
</form>

page.php

Это также может быть ваша пользовательская страница-шаблон или single.php. В данном случае 99 — это ID конкретной страницы, на которую вы хотите перенаправить пользователя в случае успешной отправки или ошибки.

if ( get_the_ID() == '99' ) {
  // проверим введённые данные
  if( !empty($_POST['app_application']) && $_POST['app_application'] == "1"  ) {
   if(!empty($_POST['app_email'])) {
    // смотрите кодекс по [Data_Validation][1]
    }
  }
}
4 авг. 2012 г. 01:38:09
Комментарии

Спасибо, peteroak, за ответ. Где я могу вызвать PHP-код для дальнейшей обработки данных формы?

Pooja Pooja
4 авг. 2012 г. 17:02:00

Атрибут action указывает на файл. В этом файле вы можете фильтровать и проверять вашу форму. Я обновлю свой ответ, чтобы включить это.

pcarvalho pcarvalho
4 авг. 2012 г. 22:37:11