Come gestire l'invio di un modulo?
Sono nuovo su WordPress e quindi sto riscontrando alcuni problemi.
Lo scenario d'uso è il seguente:
- All'utente viene mostrato un modulo di domanda per avviare un club nella sua scuola.
- L'utente compila il modulo e preme il pulsante 'Invia'.
- Il modulo deve essere validato.
- 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. - 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 funzionestoreInDB()
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.

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);
}
}

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.

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

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

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 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.

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

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

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]
}
}
}

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