Как справиться с отправкой формы?

13

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

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

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

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

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

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

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

Пуджа
источник

Ответы:

13

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

Прежде всего, вы должны указать URL администратора в качестве значения атрибута действия в форме отправки.

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

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

Далее идет функция, которая будет использовать представленные данные. Внутри формы поместите wp_nonce_fieldи скрытый ввод с именем действия. Мое значение действия 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 'You targeted the right function, but sorry, your nonce did not verify.';
    die();
} else {
    // do your function here 
    wp_redirect($redirect_url_for_non_ajax_request);
}
ifdion
источник
Спасибо ifdion за ответ. Я создаю форму в «Wordpress HTML Editor». Итак, хорошо ли включать php-код в форму, так как мне нужно будет установить плагин 'Exec-PHP', который я считаю излишним? Пожалуйста, поделитесь своими мыслями.
Пуджа
Просто замените значение действия на your-site-url.com/wp-admin/admin-ajax.php .
ifdion
Это работает?
ifdion
1
Есть ли хороший способ добиться того же, но без admin-ajax.php?
Тахир Ясин
1
@TheWPNovice Я думаю, это все еще в /wp-admin/каталоге. Обратите внимание, что вам не нужно ничего менять или добавлять в этот файл.
ifdion
2

Во-первых, позвольте мне сказать вам, что проверка JavaScript работает на стороне клиента. так что если пользователь отключит js, у вас будут проблемы.

Таким образом, вы также должны проверить входные значения на стороне сервера.

с этим в мыслях:

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

пример

<form onSubmit="validateForms()" method="post" action="domain.com/club-contacts">
    <label for="app_email">Application</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="Send" />
</form>

page.php

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

if ( get_the_ID() == '99' ) {
  // lets validate the input
  if( !empty($_POST['app_application']) && $_POST['app_application'] == "1"  ) {
   if(!empty($_POST['app_email'])) {
    // check the codex for [Data_Validation][1]
    }
  }
}
pcarvalho
источник
Спасибо peteroak за ответ. Где я могу вызвать код PHP для дальнейшей обработки данных формы?
Пуджа
атрибут действия будет указывать на файл. в этом файле вы можете отфильтровать и проверить свою форму. я обновлю свой ответ, чтобы включить это.
pcarvalho