Come WordPress gestisce AJAX
WordPress dispone di un'API specifica per la gestione delle transazioni AJAX. Viene creata una action personalizzata gestita da una funzione (o da un metodo di una classe) che elaborerà i dati e fornirà un output al client JavaScript. Vediamo un esempio pratico.
L'action AJAX viene creata in questo modo:
add_action( 'wp_ajax_nomeazione', 'nomefunzione' );
nomeazione è il nome della nostra azione AJAX personalizzata, mentre nomefunzione è il nome della funzione che gestirà
la transazione AJAX.
Per esempio, qualora volessimo creare un form di registrazione in AJAX, il nostro codice potrebbe essere:
function my_custom_register() {
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$role = 'subscriber';
// Qui occorre validare i dati
$output = '';
$errors = array();
// Validazione
if(count($errors) > 0) {
$output = implode('', $errors);
} else {
wp_insert_user(
array(
'user_login' => $username,
'user_email' => $email,
'user_pass' => $password,
'role' => $role
)
);
$output = '<a href="' . wp_login_url() . '">Login</a>';
}
echo $output; // Restituisce l'output al client
exit(); // Fondamentale!
}
add_action( 'wp_ajax_my_custom_register', 'my_custom_register' );
La gestione è molto semplice: se non ci sono errori viene restituito un link per il login, altrimenti una stringa HTML contenente l'elenco di errori riscontrati durante la validazione.
A questo punto viene il codice lato client che dovrà sempre usare due parametri fissi:
- L'URL interno al gestore AJAX di WordPress
- Il parametro
actioncontenente il nome della nostra action (in questo casomy_custom_register).
Esempio:
$('#custom-register').submit(function(e) {
e.preventDefault(); // necessario
var $form = $(this);
var ajaxURL = 'http://' + location.host + '/wp-admin/admin-ajax.php'; // handler AJAX di WordPress
// parametri della richiesta
var parameters = {
action: 'my_custom_register',
username: $('#username', $form).val(),
email: $('#email', $form).val(),
password: $('#password', $form).val()
};
$.ajax({
url: ajaxURL,
type: 'POST',
dataType: 'text',
data: parameters,
success: function(response) {
$('#output', $form).empty();
$('#output', $form).html(response);
}
});
});
Come si può notare, una volta capito il meccanismo tutto risulta abbastanza intuitivo.