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