Si vuole che l’utente possa definire una signature di 512 caratteri nella pagina del profilo personale e che questa signature compaia in calce ad ogni suo commento. L’utente è anche libero di formattare il testo con un ristretto insieme di tag HTML.
Sono stati pubblicati articoli di programmazione che descrivono procedure per l’inserimento di informazioni e campi extra nella pagina del profilo dell’utente, per esempio Adding and using custom user profle fields (Justin Adlock, 2009), Adding extra fields to the WordPress user profile (C. Bavota, 2009), mentre il Codex di WordPress espone le informazioni disorganicamente.
Diversamente dalle pagine delle impostazioni, la Settings API è inutilizzabile nel profilo utente; inoltre, dato che la signature richiede una textarea è anche sconveniente usare il filtro user_contactmethods
che aggiungerebbe campi input alla sezione Contact Info. Invece la soluzione studiata prevede l’aggiunta di una nuova sezione e un nuovo campo sfruttando i due agganci show_user_profile e edit_user_profile che sono sparati nella pagina dopo la sezione Gestione dell’Account (o Account Management). Ogni volta l’utente aggiorna il proprio profilo, i dati vengono salvati nel database attraverso i ganci personal_options_update
e edit_user_profile_update
. Per quanto riguarda la visualizzazione della signature in calce al commento dell’utente si utilizza il filtro comment_text
.
Innanzitutto occorre copiare la porzione di codice sorgente HTML preesistente che stampa a video una sezione del profilo affinché quella nuova non stravolga lo stile della pagina. Una sezione prevede una intestazione e una tabella contenente i campi, come nel codice seguente:
1 2 3 4 5 6 7 8 9 10 | <h2>Extra profile information</h2> <table class="form-table"> <tbody> <tr class="user-description-wrap"> <th><label for="signature">Signature</label></th> <td><textarea id="signature" name="signature" rows="5" cols="30"></textarea> <p class="description">Share a little text information here. This may be shown publicly on your comments.</p></td> </tr> </tbody> </table> |
Dopodiché è sufficiente preparare una funzione che stampi questo codice e agganciarla ai ganci previsti nel profilo utente. La differenza fra show_user_profile
e edit_user_profile
riguarda l’utenza della pagina: il primo gancio è attivo quando l’utente visita la propria pagina profilo, mentre il secondo quando l’utente ha i privilegi per visitare e modificare la pagina di un altro utente. Il codice PHP:
1 2 3 4 5 6 7 8 9 10 | <?php add_action( 'show_user_profile', 'add_custom_signature' ); add_action( 'edit_user_profile', 'add_custom_signature' ); function add_custom_signature( $user ) { // Create the setting section & field ?> <!-- HTML code -> <?php } |
E questo è il risultato visibile nella pagina del profilo dell’utente:
L’operazione di salvataggio dei dati della signature nel database usa i due ganci personal_options_update e edit_user_profile_update: è necessario collegargli una funzione che raccolga e convalidi i dati inseriti. Entrambi i ganci passano l’ID dell’utente alla funzione collegata. Bisogna prendere tutte le precauzioni affinché l’utente non introduca codice malevolo nel database. Per prima cosa la funzione che “sanifica” i dati inseriti, controlla che l’utente abbia i permessi per modificare il profilo, dopodiché trasforma l’input in formato stringa. La funzione wp_kses verifica che il testo contenga solo elementi HTML specificati in un array, mentre substr
elimina i caratteri in eccesso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php add_action( 'personal_options_update', 'sanitize_custom_signature' ); add_action( 'edit_user_profile_update', 'sanitize_custom_signature' ); function sanitize_custom_signature( $user_id ) { if ( !current_user_can( 'edit_user', $user_id ) ) { return; } if ( ! filter_has_var( INPUT_POST, 'signature' ) ) { return; } $allow_html = array ( 'a' => array ( 'href' => true, ), 'center' => array(), 'img' => array ( 'src' => true, 'alt' => true, 'style' => true, ), ); // Sanitize the input $input = (string) filter_input( INPUT_POST, 'signature' ); // Max 512 chars $sane = substr( wp_kses( $input, $allow_html ), 0, 511 ); // Save the signature field to database. update_user_meta( $user_id, 'signature', $sane ); } |
I ganci show_user_profile
e edit_user_profile
passano alla funzione agganciata add_custom_signature
l’oggetto WP_User che contiene la proprietà pubblica ID dell’utente utilizzata dalla funzione get_the_author_meta
per ricevere dal database il contenuto del campo signature. Il codice che visualizza la textarea nel profilo dell’utente è dunque il seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | add_action( 'show_user_profile', 'add_custom_signature' ); add_action( 'edit_user_profile', 'add_custom_signature' ); function add_custom_signature( $user ) { // Create the setting field ?> <h2>Extra profile information</h2> <table class="form-table"> <tbody> <tr class="user-description-wrap"> <th><label for="signature">Signature</label></th> <td><textarea id="signature" name="signature" rows="5" cols="30"><?php echo get_the_author_meta( 'signature', $user->ID ); ?></textarea> <p class="description">Share a little text information here. This may be shown publicly on your comments.</p></td> </tr> </tbody> </table> <?php } |
Il filtro comment_text manipola il testo del commento; esso passa tre parametri alla funzione agganciata, ma per lo scopo di questo esercizio vengono utilizzati solo i primi due: il testo del commento $text
e il suo oggetto $comment_obj
associato. In particolare, la proprietà pubblica $user_id
dell’oggetto è utilizzata dalla funzione get_the_author_meta
per accedere al contenuto della signature presente nel database. La più semplice funzione di visualizzazione appende la signature al testo del commento e restituisce tutto al processo di esecuzione di WordPress.
1 2 3 4 | function display_custom_signature( $text, $comment_obj ) { return $text . get_the_author_meta( 'signature', $comment_obj->user_id ); } |
Una signature dà un tocco di originalità alla sezione dei commenti del sito e consente all’autore del messaggio di promuovere attività e interessi. Inoltre, stimola l’utente abituale a iscriversi per partecipare alla discussione.
Nel caso si volesse assegnarle uno stile per metterla maggiormente in risalto rispetto al resto del commento, occorrerà formattare con i tag HTML il testo restituito dalla funzione agganciata al filtro comment_text
. Il foglio di stile potrà essere in seguito allacciato alla pagina per mezzo del gancio wp_enqueue_scripts
.
Nel realizzare questo plugin, il lavoro più impegnativo ha riguardato la ricerca dei ganci adatti e la programmazione delle funzioni: la Settings API non è disponibile nel profilo dell’utente, né la Options API. Come se non bastasse, è possibile inserire nuove sezioni e campi solo a fondo pagina, mentre l’inserimento di elementi fra quelli preesistenti è un problema per ora senza soluzione. In futuro, questo gap potrà essere colmato con la Fields API, una nuova interfaccia di programmazione che velocizzerà la creazione di pagine di amministrazione, conferendo a tutte una struttura uniforme.