Jak obsługiwać przesyłanie formularzy?

13

Jestem nowy w wordpress i dlatego mam problemy.

Scenariusz przypadku użycia wygląda następująco:

  1. Użytkownik wyświetla formularz wniosku o założenie klubu w swojej szkole.
  2. Użytkownik wypełnia formularz i naciska przycisk „Prześlij”.
  3. Formularz należy zweryfikować.
  4. Jeśli sprawdzanie poprawności zakończy się powodzeniem, dane są zapisywane w niestandardowej tabeli club_detailsw db, a użytkownikowi wyświetlany jest komunikat (np .: Dziękujemy za przesłanie. Twoja aplikacja jest wysyłana do administratora w celu zatwierdzenia.) W przeciwnym razie użytkownikowi zostaną wyświetlone odpowiednie komunikaty o błędach.
  5. Administrator przechodzi do panelu administracyjnego Wordpress, aby zatwierdzić oczekujące prośby o klub. (Dane są pobierane z bazy danych i pokazywane administratorowi).

Zrobiłem następujące:

  • dla 1) Utworzyłem formularz aplikacji / stronę przy użyciu edytora HTML Wordpress.
  • dla 3) Mam plik javascript ( validation.js), który ma kod weryfikacyjny.
  • dla 4) Mam plik php ( club-functions.php), który ma funkcję storeInDB()do przechowywania szczegółów aplikacji w niestandardowej tabeli w db.
  • dla 5) Utworzyłem własny folder wtyczek i dodałem plik php ( club.php), który wyświetla szczegóły aplikacji do administratora w panelu administracyjnym Wordpress.

Utknąłem w następującym miejscu: Jak obsługiwać przesyłanie formularza. Gdzie powinienem umieścić kod, który wywołuje funkcję sprawdzania poprawności javascript, a następnie wywołuje tę storeInDB()funkcję.

Proszę podać mi sugestie, jak to osiągnąć i czy takie podejście jest dobre? Z góry dziękuję.

Pooja
źródło

Odpowiedzi:

13

Powinieneś użyć funkcji wp_ajaxlub wp_ajax_nopriv.

Przede wszystkim należy podać adres URL administratora aukcji jako wartość atrybutu akcji w formularzu zgłoszeniowym.

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

W ten sposób formularz zostanie domyślnie przesłany do admin-ajax.php (bez JavaScript). Możesz użyć JavaScript, aby działał za pomocą AJAX.

Dalej jest funkcja, która wykorzysta przesłane dane. W formularzu wstaw wp_nonce_fieldukryte dane wejściowe i akcję z nazwą. Moja wartość akcji to add_transfer.

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

Możesz umieścić funkcję, która będzie obsługiwać ten formularz, w pliku functions.php lub w pliku wtyczki. Możesz użyć wp_ajax_+ nazwy akcji, jeśli jest to formularz tylko dla zalogowanych użytkowników. W przypadku niezalogowanych użytkowników użyj wp_ajax_nopriv+ nazwy akcji.

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
źródło
Dziękuję ifdion za odpowiedź. Tworzę formularz w „edytorze HTML Wordpress”. Czy warto dołączyć kod php do formularza, ponieważ będę musiał zainstalować wtyczkę „Exec-PHP”, która moim zdaniem jest przesadą? Podziel się swoimi przemyśleniami.
Pooja
Po prostu zamień wartość akcji na your-site-url.com/wp-admin/admin-ajax.php .
ifdion
Czy to działa?
ifdion
1
czy istnieje dobry sposób na osiągnięcie tego samego, ale bez admin-ajax.php?
Tahir Yasin
1
@TheWPNovice Chyba nadal jest w /wp-admin/katalogu. Pamiętaj, że nie musisz nic zmieniać ani dodawać w tym pliku.
ifdion
2

Po pierwsze, powiem ci, że sprawdzanie poprawności javascript działa po stronie klienta. więc jeśli użytkownik wyłączy js, będziesz mieć problemy.

dlatego należy również sprawdzić poprawność wartości wejściowych po stronie serwera.

pamiętając o tym:

Kod js można wywołać bezpośrednio ze strony, na której znajduje się formularz. Atrybut onsubmit to zwykły sposób nazywania go.

przykład

<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

Może to być również Twoja niestandardowa strona szablonu lub single.php. w tym przypadku 99 jest identyfikatorem konkretnej strony, którą chcesz wskazać użytkownikowi, jeśli została zatwierdzona lub wystąpił błąd.

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
źródło
Dzięki peteroak za odpowiedź. Gdzie mogę wywołać kod PHP w celu dalszego przetwarzania danych formularza?
Pooja,
atrybut akcji będzie wskazywał na plik. w tym pliku możesz filtrować i sprawdzać poprawność formularza. zaktualizuję moją odpowiedź, aby to uwzględnić.
pcarvalho