Lo scenario descritto in questo articolo è quello di un sito WordPress che utilizza Moodle per gestire corsi e lezioni. Vedremo come creare un utente in Moodle usando le sue API grazie alle funzionalità HTTP di WordPress.
In Moodle occorre abilitare i web services con protocollo REST creando un External service che includa la funzione core_user_create_users
, e generando un token per un utente con permessi adeguati. Le chiamate saranno indirizzate su /webservice/rest/server.php
. In fase di testing, occorre inoltre abilitare la modalità di debug nei log di Moodle.
Nel file functions.php
del nostro tema, definiamo l'URL di base e il token di Moodle:
const HTTP_TIMEOUT = 15;
const MOODLE_BASE_URL = 'https://learn.example.com';
const MOODLE_TOKEN = 'token';
Ora creiamo una funzione per gestire il logging durante le chiamate alle API:
function my_api_log( $message, $level = 'INFO' ) {
$log_file = get_template_directory() . '/logs/api.log';
$date = date('Y-m-d H:i:s');
$entry = "[{$date}] [{$level}] {$message}\n";
file_put_contents($log_file, $entry, FILE_APPEND | LOCK_EX);
}
A questo punto possiamo definire la nostra funzione principale:
function my_moodle_create_user( $user_data ) {
$endpoint = rtrim( MOODLE_BASE_URL, '/' ) . '/webservice/rest/server.php';
$body = [
'wstoken' => MOODLE_TOKEN,
'wsfunction' => 'core_user_create_users',
'moodlewsrestformat' => 'json',
'users[0][username]' => $user_data['username'],
'users[0][firstname]' => $user_data['firstname'],
'users[0][lastname]' => $user_data['lastname'],
'users[0][email]' => $user_data['email'],
'users[0][password]' => $user_data['password'],
];
$resp = wp_remote_post( $endpoint, [
'timeout' => HTTP_TIMEOUT,
'headers' => ['Content-Type' => 'application/x-www-form-urlencoded'],
'body' => $body,
]);
if ( is_wp_error( $resp ) ) {
my_api_log( $resp->get_error_message(), 'ERROR' );
return null;
}
$code = wp_remote_retrieve_response_code( $resp );
$json = json_decode( wp_remote_retrieve_body( $resp ), true );
if ( $code >= 400 ) {
my_api_log( 'Moodle HTTP ' . $code . ': ' . wp_remote_retrieve_body( $resp ), 'ERROR' );
return null;
}
if ( isset( $json['exception'] ) ) {
my_api_log( 'Moodle error: '.$json['errorcode'].' - '.$json['message'].' | '.( $json['debuginfo'] ?? '' ), 'ERROR' );
return null;
}
return $json;
}
La nostra richiesta HTTP in POST ha un timeout di 15 secondi e simula di fatto l'invio di un form. Nel corpo della richiesta andiamo ad inserire il token e il tipo di funzione da eseguire nelle API di Moodle. Quindi inseriamo i dati del nuovo utente che andremo a creare.
In tal senso occorre prestare attenzione al formato della password che, nelle impostazioni predefinite di Moodle, deve avere:
- Minimo 8 caratteri.
- Almeno 1 lettera maiuscola.
- Almeno 1 lettera minuscola.
- Almeno 1 numero.
- Almeno 1 carattere speciale (come !,?,#,* eccetera)
Poichè la fase di testing potrebbe generare degli errori dovuti ad un formato non valido, la nostra funzione scrive nel file di log anche la proprietà debuginfo
restituita da Moodle quando si attiva la modalità di debug negli strumenti di sviluppo.
Conclusione
Grazie alle funzionalità HTTP di WordPress è possibile creare utenti in Moodle usando le sue API. Si tratta di una soluzione che permette ai due CMS di comunicare tra loro.