Come gestire l'invio di un modulo?

4 ago 2012, 00:56:23
Visualizzazioni: 54.5K
Voti: 17

Sono nuovo su WordPress e quindi sto riscontrando alcuni problemi.

Lo scenario d'uso è il seguente:

  1. All'utente viene mostrato un modulo di domanda per avviare un club nella sua scuola.
  2. L'utente compila il modulo e preme il pulsante 'Invia'.
  3. Il modulo deve essere validato.
  4. Se la validazione ha successo, i dati vengono memorizzati nella tabella personalizzata club_details nel database e all'utente viene mostrato un messaggio (es: Grazie per l'invio. La tua domanda è stata inviata all'amministratore per l'approvazione.) altrimenti vengono mostrati all'utente messaggi di errore appropriati.
  5. L'amministratore accede al pannello di amministrazione di WordPress per approvare le richieste in sospeso per il club. (I dati vengono recuperati dal database e mostrati all'amministratore).

Ho fatto quanto segue:

  • per 1) Ho creato un modulo/pagina di domanda utilizzando l'editor HTML di WordPress.
  • per 3) Ho un file JavaScript (validation.js) che contiene il codice di validazione.
  • per 4) Ho un file PHP (club-functions.php) che ha una funzione storeInDB() per memorizzare i dettagli della domanda nella tabella personalizzata nel database.
  • per 5) Ho creato la mia cartella dei plugin e aggiunto un file PHP (club.php) che mostra i dettagli della domanda all'amministratore nel pannello di amministrazione di WordPress.

Mi sono bloccato nel seguente punto: Come gestire l'invio del modulo. Dove dovrei posizionare il codice che chiama la funzione di validazione JavaScript e successivamente chiama la funzione storeInDB().

Per favore, forniscimi alcuni suggerimenti su come posso realizzare questo e se questo approccio è valido. Grazie mille in anticipo.

0
Tutte le risposte alla domanda 2
9
16

Dovresti utilizzare la funzione wp_ajax o wp_ajax_nopriv.

Innanzitutto, devi inserire l'URL admin ajax come valore dell'attributo action nel form di invio.

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

In questo modo il form verrà inviato a admin-ajax.php per impostazione predefinita (senza JavaScript). Puoi utilizzare JavaScript per farlo funzionare via AJAX.

Il passo successivo è la funzione che utilizzerà i dati inviati. All'interno del form, inserisci un wp_nonce_field e un input nascosto con il nome action. Il mio valore action è add_transfer.

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

Puoi inserire la funzione che gestirà questo form nel file functions.php o nel tuo file plugin. Puoi usare wp_ajax_ + il nome dell'action se questo è un form riservato agli utenti loggati. Per gli utenti non loggati, usa invece wp_ajax_nopriv + il nome dell'action.

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 'Hai puntato alla funzione corretta, ma spiacente, il tuo nonce non è stato verificato.';
        die();
    } else {
        // inserisci qui la tua funzione
        wp_redirect($redirect_url_for_non_ajax_request);
    }
}
4 ago 2012 02:39:00
Commenti

Grazie ifdion per la risposta. Sto creando il modulo nell'editor HTML di WordPress. Quindi, è corretto includere codice php nel modulo dato che dovrei installare il plugin 'Exec-PHP' che credo sia eccessivo? Condividi le tue opinioni.

Pooja Pooja
4 ago 2012 17:00:39

Sostituisci semplicemente il valore action con http://your-site-url.com/wp-admin/admin-ajax.php.

ifdion ifdion
5 ago 2012 00:36:46

Funziona?

ifdion ifdion
9 ago 2012 00:55:33

esiste un buon modo per ottenere lo stesso risultato senza usare admin-ajax.php?

Tahir Yasin Tahir Yasin
19 feb 2014 12:17:40

Mi rendo conto che questa è una risposta vecchia, ma questo non funzionerà perché wp_redirect non farà nulla qui; le richieste AJAX vengono eseguite in background e wp_redirect è semplicemente un wrapper intelligente per una chiamata header('location:...') che deve essere eseguita prima dell'output. Se vuoi un reindirizzamento dopo una chiamata AJAX, devi restituire un URL e gestire il reindirizzamento via JS. Per riferimento: http://wordpress.stackexchange.com/a/133939/17826

indextwo indextwo
9 set 2015 15:27:45

@indextwo grazie per il commento. Hai ragione, è necessario che un URL appropriato venga restituito e poi reindirizzato via JS, per una richiesta AJAX. Il wp_redirect inoltre non sarà di alcuna utilità in una richiesta AJAX. Ma la mia risposta non utilizza alcun JS quindi non è una richiesta AJAX, sebbene utilizzi le funzioni wp_ajax e wp_ajax_nopriv. Il wp_redirect viene usato per allontanare l'utente dalla pagina bianca di wp-admin/admin-ajax.php. Spero che questo chiarisca le cose.

ifdion ifdion
10 set 2015 19:18:13

'admin-ajax.php' → dove si trova questo file? Voglio dire, in quale cartella?

WordCent WordCent
26 feb 2019 12:06:27

@TheWPNovice credo sia ancora nella directory /wp-admin/. Nota che non è necessario modificare o aggiungere nulla in quel file.

ifdion ifdion
27 feb 2019 08:59:31

Questo sistema può funzionare anche su un modulo che cerca di inviare email?

WordCent WordCent
27 feb 2019 19:06:00
Mostra i restanti 4 commenti
2

prima di tutto, lascia che ti dica che la validazione JavaScript funziona lato client. quindi se l'utente disabilita JavaScript, potresti avere problemi.

perciò, dovresti anche validare i valori di input lato server.

detto questo:

il codice js può essere chiamato direttamente dalla pagina dove si trova il form. l'attributo onsubmit è il modo solito per chiamarlo.

esempio

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

page.php

Questo può essere anche la tua pagina template personalizzata o single.php. in questo caso, 99 è l'ID della pagina specifica che vuoi indicare all'utente se è stata approvata o ha avuto un errore.

if ( get_the_ID() == '99' ) {
  // validiamo l'input
  if( !empty($_POST['app_application']) && $_POST['app_application'] == "1"  ) {
   if(!empty($_POST['app_email'])) {
    // controlla il codex per [Data_Validation][1]
    }
  }
}
4 ago 2012 01:38:09
Commenti

Grazie peteroak per la risposta. Dove posso chiamare il codice PHP per elaborare ulteriormente i dati del modulo?

Pooja Pooja
4 ago 2012 17:02:00

L'attributo action punterà a un file. In quel file puoi filtrare e validare il tuo modulo. Aggiornerò la mia risposta per includere questa informazione.

pcarvalho pcarvalho
4 ago 2012 22:37:11