In internet ci sono molti plugin per WordPress che permettono di estenderne le funzionalità. Ma a volte non soddisfano in pieno le nostre esigenze o sono costosi. Aggiungere proprie funzioni e agganciarle può essere di aiuto.

Compatibili con WordPress ormai ci sono tanti plugin per aggiungere tantissime funzionalità al proprio sito, molti gratis e molti premium. Trovare e installare un plugin adatto alle nostre esigenze è una buona pratica: chi lo sviluppa, specie se ne ha prodotte molte versioni aggiornate, al passo con quelle di WordPress, avrà testato bene il funzionamento ed è in grado di garantire un buon livello di sicurezza e di compatibilità con la propria versione di WordPress.

Tuttavia, capita che dobbiamo fare una personalizzazione per cui, così come l’abbiamo prevista, non esiste nessun plugin. In altri casi il plugin è disponibile ma a pagamento e con costi eccessivi, rispetto ai nostri scopi, sempre che non si debbano pagare anche gli aggiornamenti.

In questo articolo voglio spiegare come si possano aggiungere funzionalità, sfruttando le action-hook e le funzioni predefinite del WordPress codex.

Ci baseremo su un caso tipo. Una palestra prevede lezioni a cui gli iscritti possono partecipare solo su prenotazione. Questa può avvenire anche online, purché l’utente sia iscritto e il suo account sia abilitato, dalla direzione, alle prenotazioni.

Per la gestione degli utenti ci serviremo dell’area di amministrazione di WordPress e del meccanismo già previsto a tale scopo, in questo modo:

  • l’utente che si iscrive, tramite un’interfaccia apposita, viene registrato da WordPress come sottoscrittore e la sua abilitazione avviene tramite la promozione a collaboratore, da parte del gestore;
  • l’utente, sia quando viene registrato che quando viene promosso, riceve le relative mail di conferma, i cui contenuti e headers sono personalizzati.

Vediamo ora i passaggi.

Il form di registrazione su una pagina del sito

Per prima cosa abbiamo bisogno del form in cui l’utente deve lasciare i suoi dati. Avremmo potuto usare anche quello di WordPress e customizzare la pagina di login, grazie a un plugin, ma invece preferiamo averlo su una normale pagina del sito.

Questo è il codice html e Javascript, con i quali costruiamo il form e impostiamo la funzione di invio dati

<form id="form-newuser" action="http://mieiesercizi.altervista.org/wordpress/registrazione-utente/" method="post">
    Nome e Cognome<input id="nome" type="text" />
    Nickname<input id="nickname" type="text" />
    Indirizzo mail<input id="mail" type="mail" />
    <input id="input-submit" type="submit" value="invia" />
</form>

<scripttype="text/javascript">
    document.getElementById('form-newuser').onsubmit=function(){
        jQuery.ajax({ 
        method:"POST",
        url:"http://mieiesercizi.altervista.org/wordpress/registrazione-utente/",
        data:{
            action:"reg-user",
            nome:document.getElementById("nome").value,
            nickname:document.getElementById("nickname").value,
            mail:document.getElementById("mail").value,
            password:document.getElementById("password").value
        }
        success:{function(msg){
            alert(msg);
        }
    }
    return false;
}

Si tratta di un comunissimo form di invio dati con quattro campi da compilare: nome e cognome, nickname, indirizzo mail e password. Naturalmente c’è anche il tasto di invio.

Subito sotto troviamo il codice Javascript che assegna una funzione all’evento submit del form.

L’ultima istruzione di questa funzione è “return false;”, pensata per evitare il ricaricamento della pagina.

La funzione, sfruttando jQuery, dice al browser di passare i dati col metodo “POST” e di fare una chiamata Ajax alla stessa pagina: sarà il core di WordPress a processare i dati, quindi qualsiasi sia la url non cambia nulla.

Vengono poi mandati i dati con un oggetto che valorizzerà l’array $_POST nel backend. Oltre ai dati del form c’è la proprietà “action”, la cui utilità sarà meglio comprensibile più tardi.

In caso di risposta affermativa il browser produrrà la classica finestra di messaggio con l’output del server.

Agganciare delle funzioni a WordPress

La processazione dei dati e tutto ciò che deve essere fatto con questi si aggancia al normale funzionamento di WordPress. Abbiamo più di un modo per farlo:

  • Modificare il tema
  • Creare un tema child o figlio
  • Creare un plugin

La migliore delle tre è l’ultima; modificare un tema (più precisamente, in questo caso, il file ‛functions.php’) non è consigliato in quanto le modifiche verrebbero cancellate dagli aggiornamenti successivi, che vanno fatti per ridurre la bucabilità del sito. Il tema figlio è un ottimo modo per evitare sovrascritture, ma per aggiungere una semplice funzione questo metodo è troppo impegnativo.
Creare il plugin è la soluzione più giusta: ci mette al riparo da pericoli di sovrascrittura ed è semplice da installare e da attivare.

Creiamo un file .php e lo chiamiamo ‛gestione-utente.php’, lo stesso nome prenderà la cartella che lo conterrà.

/*
 * Plugin Name: Gestione utente
 * Plugin URI: https://www.andrearonchetti.it
 * Description: Plugin per wordpress per gestire la registrazione di utenti
 * Text Domain: gestione-utente
 * Domain Path: /languages
 * Version: 1.0
 * Author: Andrea Ronchetti
 * Author URI: https://www.andrearonchetti.it
*/
// Exit if accessed directly.

if( !defined('ABSPATH')) exit();

Il file .php inizia con le righe di descrizione di un classico plugin. Particolarmente importanti sono Plugin Name, il cui valore verrà stampato a video nella schermata dei plugin e Description, consistente nella descrizione mostrata. Subito dopo c’è l’istruzione “if ( ! defined( ‘ABSPATH’ ) ) exit();”: ABSPATH è una costante definita in WordPress. Se non è settata significa che allo script si è arrivati senza passare da WordPress, pertanto il funzionamento del plugin finisce li.

Comprimiamo tutto e carichiamo il file .zip come un classico plugin, dopodiché attiviamolo, affinché il nostro script venga eseguito.

Agganciamo le nostre funzioni

Ora che il plugin è attivo possiamo scrivere tutte le funzioni relative alla gestione degli utenti.

Abbiamo due funzioni: una per registrare l’utente e inviare le mail, ad esso e al gestore del sito, e l’altra per inviare la mail all’utente per comunicargli l’avvenuta attivazione dell’account.

Devono essere eseguite in due momenti differenti:

  • sendDataUser() quando WordPress viene caricato (ma non la pagina);
  • mailToContributor() quando un utente cambia di ruolo, passando da sottoscrittore a collaboratore.

Per agganciare una funzione a un’azione di WordPress si usano le action-hook, letteralmente azione-gancio: sono funzioni che permettono di eseguire azioni durante un’elaborazione di WordPress. In genere per impostarne uno si usa la funzione add_action() che accetta obbligatoriamente due parametri: il nome dell’action-hook, tra quelle previste da WordPress, e il nome, sotto forma di stringa, della nostra funzione da agganciare. Altri due parametri opzionali sono la priorità con cui deve essere eseguita e il numero di argomenti da considerare della funzione che associamo.

Alcune action-hook prevedono che la funzione agganciata abbia degli argomenti. Nel caso in cui tra questi alcuni siano opzionali ma essenziali per il nostro algoritmo, dovremo, tramite un valore intero, dirgli quanti argomenti vanno considerati.

La funzione di registrazione

Cominciamo ad agganciare sendDataUser() al caricamento della classe WP, col gancio wp, in questo modo

add_action('wp','sendDataUser');

Analizziamo la funzione setDataUser(), dichiarata prima dell’aggancio.

function sendDataUser(){
    if($_POST['action']!==null){
        $dati=array();
        $dati['display_name']=$_POST['nome'];
        $dati['first_name']=$_POST['nome'];
        $dati['user_nicename']=$_POST['nome'];
        $dati['user_login']=$_POST['nickname'];
        $dati['user_email']=$_POST['mail'];
        $dati['user_pass']=$_POST['password'];
        if(!username_exists($dati['user_login']) && !email_exists($dati['user_email']))
            wp_insert_user($dati);
            $mail=get_post(100);
            $to=$dati['user_email'];
	    $subject=$mail->post_title;
	    $message=$mail->post_content;
            $message=str_replace('%%NAME%%',$dati['display_name'],$message);
	    $headers=array();
	    $headers[]='From: Palestra <palestra@palestra.it>';
	    
            wp_mail($to,$subject,$message,$headers);
            $to=get_user_by('id',1)->user_email;
	    $subject='Nuovo utente registrato';
            $message="L'utente ".$dati['display_name'].", indirizzo mail ".$dati['user_email'].", si è registrato e chiede l'attivazione.";
            wp_mail($to,$subject,$message);
            echo 'Registrazione effettuata con successo';
        }
        else{
             echo 'Utente già registrato!';
        }
        exit();
}

Anzitutto controlliamo se è arrivata una action (ecco perché tra i dati inviati è presente anche ‛action’).

In caso affermativo cominciamo a preparare un array di dati che servirà per la registrazione dell’utente.

Una volta presi tutti i dati controlliamo che l’utente non sia già presente. Soltanto in quel caso procediamo con la registrazione. A tale scopo utilizziamo le funzioni di WordPress username_exists() e email_exists() che, rispettivamente, controllano l’esistenza dello username e la presenza dell’indirizzo mail nella tabella degli utenti. Ciascuna funzione restituirà false se non viene trovato niente, l’id dell’utente in caso contrario.

La registrazione avviene con la funzione wp_insert_user() che accetta come argomento un array con varie info: $dati è già ottimale, infatti le sue chiavi sono quelle previste dalla funzione.

Subito dopo inviamo all’utente interessato la mail di avvenuta registrazione. Dato che il testo di questa è deciso dal gestore, il quale, molto probabilmente, non sa nulla di codice php, facciamo che questo venga scritto in un post o in una pagina da lasciare in bozza, editabile dall’area di amministrazione di WordPress come un normale post, come da figura.

Immagine con post per mail di conferma registrazione avvenuta

Il titolo definirà l’oggetto della mail e il content il contenuto.

Il contenuto riporterà un dato variabile, ossia il nome e cognome dell’interessato. Per metterlo nel testo della mail basterà scrivere %%NAME%% laddove si vuole che venga inserito.

Tornando al codice, estrapoliamo i dati della mail dal post.

In $mail memorizziamo l’oggetto WP_Post, contenente una serie di dati sul post con l’id passato alla funzione get_post(), che lo restituisce. Quindi i contenuti della mail andranno scritti in quel post specifico.

Preparo i valori da passare alla funzione wp_mail, responsabile dell’invio della mail.

$to conterrà il destinatario (valore di $dati[‛user_email’]), $subject sarà l’oggetto che valorizziamo col titolo del post, $message il corpo del messaggio che verrà estrapolato dal contenuto del post. Dobbiamo modificare il valore di $message sostituendo la stringa ‛%%NAME%%’ col nome e cognome dell’utente e per farlo useremo la classica funzione php str_replace().

Prepariamo poi gli headers con l’array $headers.

Una volta pronto tutto quello che serve procediamo con l’invio della mail con la wp_mail(), passando gli argomenti ($headers è facoltativo).

Dobbiamo però avvisare anche il gestore della palestra e quindi impostiamo un’altra mail.

Questa volta $to è l’indirizzo email dell’utente WordPress che ha funzioni di amministratore. Utilizziamo get_user_by(), una funzione di WordPress che prende un utente partendo da un dato, in questo caso l’id. Di solito il superamministratore ha id=1.

Per ricavare questo dato basta andare sulla schermata utenti e prendere la url del link “Modifica”, posto sotto il nome dell’utente interessato. Nella url dovremmo leggere user_id=[numero]’ dove [numero] è il valore dell’id. Se non dovesse esserci tale stringa significa che l’utente è superamministratore e, in tal caso, l’id equivale a 1.

Gli altri valori, in questo caso, li impostiamo direttamente dallo script ma avremmo potuto usare un procedimento analogo a prima.

Inviamo quindi la mail e facciamo fare al server l’output da mandare al browser.

Dopo l’”esle”, da eseguire se un utente è già presente, faccio terminare lo script con exit() per evitare che parta il caricamento della pagina.

La comunicazione dell’abilitazione all’utente interessato

Ora vediamo come impostare una funzione di invio mail a un utente che viene abilitato, ossia che passa da sottoscrittore a collaboratore.

La funzione sarà agganciata al gancio set_user_role che imposta una funzione da eseguire quando un utente cambia di ruolo. Quindi scriviamo add_action(‘set_user_role’,’mailToContributor’,10, 3);

Come già accennato alcune funzioni prevedono argomenti opzionali, e quella da agganciare a set_user_role è una di quelle. Per noi questa funzione è mailToContributor().

function mailToContibutor($user_id, $role, $old_roles){
    $lastRole=$old_roles[count($old_roles)-1];
    if($lastRole=="subscriber" && $role=="contributor"){
        $user=get_user_by("id", $user_id);
        $to=$user->user_email;
        $mail=get_post(105);
        $subject=$mail->post_title;
        $message=$mail->post_content;
        $message=str_replace("%%NAME%%", $user->first_name, $message);
        $headers=array();
        $headers[]='From: Palestra <palestra@palestra.it>';
        wp_mail($to, $subject, $message, $headers);
    }
}

Ci sono due parametri obbligatori, $user_id e $role che, rispettivamente, sono l’id dell’utente e il nuovo ruolo assunto. $old_roles è opzionale ed è un array con tutti i ruoli avuti in precedenza. Nel nostro caso è importante perché la mail va spedita solo se l’ultimo ruolo ricoperto è sottoscrittore e quello nuovo è collaboratore: l’array pertanto ci consente di avere l’ultimo ruolo ricoperto.

Quindi, quando agganciamo la funzione, gli diciamo di prendere tutti e tre gli argomenti con l’ultimo parametro, 3.

$lastRole prende proprio quel valore da $old_roles, esattamente dall’ultimo indice, che ricaviamo al momento con il valore restituito da count($old_roles) dimunuito di 1, poiché l’array è indicizzato.

I ruoli vengono definiti con degli slug; a noi interessa solo sottoscrittore e collaboratore, subscriber e contributor.

Controlliamo se l’ultimo ruolo è sottoscrittore e il nuovo ruolo è collaboratore, in caso affermativo ci prendiamo l’utente interessato con la funzione, già incontrata prima, get_user_by(‛id’,$user_id); in $to prendiamo l’indirizzo mail, in $mail il post con il testo della mail (anche in questo caso abbiamo scelto di scrivere la mail tramite un post). Come prima l’oggetto è il titolo del post e il messaggio è il contenuto, al quale sostituiamo ancora %%NAME%% con nome e cognome. Impostiamo gli headers e procediamo all’invio.

Scegliere se aggiungere proprio codice o installare un plugin

Questo è solo un esempio molto semplice di come si possano sfruttare tutte le possibilità offerte da WordPress per aggiungere delle nostre funzionalità. Naturalmente quella di cercare un plugin già pronto e configurarlo rimane la scelta più semplice, a patto che risponda in pieno alle nostre esigenze e che non abbia dei costi insostenibili per il progetto che stiamo realizzando.

Tuttavia provare a scrivere del proprio codice per avere un funzionamento personalizzato di alcune parti del sito può essere una via utile, interessante e, sopratutto, economica.

Per conoscere tutte le funzioni, le action-hook, gli oggetti di WordPress e molto altro andare sul WordPress codex e consultare la documentazione ufficiale di WordPress.