Как обработать отправку формы?
Я новичок в WordPress и сталкиваюсь с некоторыми проблемами.
Сценарий использования следующий:
- Пользователю отображается форма заявки на создание клуба в его школе.
- Пользователь заполняет форму и нажимает кнопку 'Отправить'.
- Форма должна быть проверена.
- Если проверка успешна, данные сохраняются в пользовательской таблице
club_details
в базе данных, и пользователю показывается сообщение (например: Спасибо за отправку. Ваша заявка отправлена администратору на рассмотрение.), в противном случае пользователю показываются соответствующие сообщения об ошибках. - Администратор заходит в панель администратора WordPress для одобрения ожидающих запросов на создание клуба. (Данные извлекаются из базы данных и показываются администратору).
Я сделал следующее:
- для 1) Я создал форму заявки/страницу используя HTML редактор WordPress.
- для 3) У меня есть JavaScript файл (
validation.js
), который содержит код валидации. - для 4) У меня есть PHP файл (
club-functions.php
), который содержит функциюstoreInDB()
для сохранения деталей заявки в пользовательской таблице базы данных. - для 5) Я создал свою собственную папку плагина и добавил PHP файл (
club.php
), который отображает детали заявки администратору в панели администратора WordPress.
Я застрял на следующем месте: Как обработать отправку формы. Где я должен разместить код, который вызывает функцию валидации JavaScript и затем вызывает функцию storeInDB()
.
Пожалуйста, предоставьте мне некоторые предложения, как я могу это реализовать, и является ли этот подход правильным? Заранее большое спасибо.

Вам следует использовать функции 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);
}
}

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

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

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

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

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

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

Сначала позвольте мне сказать, что 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]
}
}
}
