Como lidar com o envio de formulários?

13

Eu sou novo no wordpress e, portanto, enfrento alguns problemas.

O cenário de caso de uso é o seguinte:

  1. Um usuário é exibido um formulário de inscrição para iniciar um clube em sua escola.
  2. O usuário preenche o formulário e pressiona o botão 'Enviar'.
  3. O formulário precisa ser validado.
  4. Se a validação for bem-sucedida, os dados serão armazenados na tabela personalizada club_detailsem db e o usuário receberá uma mensagem (por exemplo: Obrigado pela submissão. Seu aplicativo é enviado ao administrador para aprovação.) Caso contrário, as mensagens de erro apropriadas serão mostradas ao usuário.
  5. O administrador vai ao painel de administração do Wordpress para aprovar os pedidos pendentes do clube. (Os dados são buscados no banco de dados e mostrados ao administrador).

Eu fiz o seguinte:

  • 1) Criei um formulário / página de aplicação usando o editor HTML do Wordpress.
  • for 3) Eu tenho um arquivo javascript ( validation.js) que possui o código de validação.
  • para 4) Eu tenho um arquivo php ( club-functions.php) que tem uma função storeInDB()para armazenar os detalhes do aplicativo na tabela personalizada em db.
  • for 5) Criei minha própria pasta de plugins e adicionei um arquivo php ( club.php) que exibe os detalhes do aplicativo para o administrador no painel de administração do Wordpress.

Estou preso no seguinte local: Como lidar com o envio do formulário. Onde devo colocar o código que chama a função de validação do javascript e depois chama a storeInDB()função.

Por favor, me dê algumas sugestões sobre como conseguir isso e essa abordagem é boa? Muito obrigado antecipadamente.

Pooja
fonte

Respostas:

13

Você deve usar wp_ajaxa wp_ajax_noprivfunção ou .

Antes de tudo, você deve colocar o URL do administrador ajax como valor do atributo de ação no formulário de envio.

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

Dessa forma, o formulário será enviado ao admin-ajax.php por padrão (sem JavaScript). Você pode usar JavaScript para fazê-lo funcionar usando AJAX.

A seguir, é a função que usará os dados enviados. Dentro do formulário, coloque uma wp_nonce_fielde uma entrada oculta com a ação nome. Meu valor de ação é add_transfer.

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

Você pode colocar a função que manipulará este formulário no functions.php ou no seu arquivo de plug-in. Você pode usar wp_ajax_+ o nome da ação se este for um formulário apenas para usuários conectados. Para usuários não conectados, use wp_ajax_nopriv+ o nome da ação.

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
fonte
Obrigado ifdion pela resposta. Estou criando o formulário no 'Wordpress HTML editor'. Então, é bom incluir código php no formulário, pois terei que instalar o plug-in 'Exec-PHP', que acredito ser um exagero? Por favor, compartilhe seus pensamentos.
Pooja
Apenas substitua o valor da ação por your-site-url.com/wp-admin/admin-ajax.php .
ifdion
Isso funciona?
ifdion
1
existe uma boa maneira de conseguir o mesmo, mas sem admin-ajax.php?
Tahir Yasin
1
@TheWPNovice Acho que ainda está no /wp-admin/diretório. Observe que você não precisa alterar ou adicionar nada nesse arquivo.
ifdion 27/02/19
2

primeiro, deixe-me dizer que a validação de javascript funciona no lado do cliente. portanto, se o usuário desabilitar js, você terá problemas.

portanto, você também deve validar os valores de entrada, do lado do servidor.

com aquilo em mente:

O código js pode ser chamado diretamente da página onde está o formulário. O atributo onsubmit é a maneira usual de chamá-lo.

exemplo

<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

Essa também pode ser sua página de modelo personalizada ou single.php. nesse caso, 99 é o ID da página específica que você deseja indicar ao usuário se foi aprovada ou teve um erro.

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
fonte
Obrigado peteroak pela resposta. Onde posso chamar o código PHP para processar ainda mais os dados do formulário?
Pooja
o atributo action apontará para um arquivo. nesse arquivo, você pode filtrar e validar seu formulário. atualizarei minha resposta para incluir isso.
pcarvalho