Campi e azioni nel pannello admin dei commenti di WordPress
da Massimo Della Rovere · pubblicato il 6 Febbraio, 2017 · modificato il 19 Febbraio, 2017

Questa settimana ho avuto la necessità di personalizzare la struttura dei commenti di WordPress per aggiungere dei campi come ad esempio il gruppo utente e un valore di votazione da 1 a 5 con le classiche stelline. Inoltre ho avuto la necessità di inserire una voce di menu personalizzata (per inviare una notifica tramite email) che si eseguisse dal menu a tendina standard presente nella schermata admin dei commenti.

Siccome sono sicuro che questa operazione potrebbe servire a molti di voi, ho deciso di riportare questa esperienza e la tecnica utilizzata in questo articolo. Dividerò il post in tre sezioni diverse, una per aggiungere dei campi personalizzati chiamati (comment meta data) e gestirli direttamente dal pannello di edit comment standard. Nella seconda parte vedremo come aggiungere un’azione al menu di tendina che è presente nella schermata di elenco commenti e per ultima parte vedremo come inserire una azione sulla riga selezionata del commento (che compare con il mouse in :hover).

Aggiungere nuovi campi ad un commento

Per definire dei campi aggiuntivi da collegare ad un commento bisogna avere la possibilità di visualizzarli nella schermata di (edit comment) e salvarli sul database dopo aver premuto il bottone di aggiornamento. Per eseguire questa operazione dobbiamo usare un metabox che ci permetterà di inserire un riquadro aggiuntivo nella schermata della modifica commento e definire un filtro per il salvataggio dei campi.

In questa schermata ho aggiunti tre campi, però voi potete inserire tutti quelli di cui avete necessità e volendo creare anche dei metabox diversi. Come detto in precedenza dobbiamo prima di tutto creare un metabox, vi allego qui di seguito il codice:

// Definizione azione add_meta_boxes per creare
// una chiamata alla funzione di aggiunta box personalizzati

add_action('add_meta_boxes','add_my_metabox_comment');

// Funzione richiamata dalla action per la
// definizione di un nuovo metabox commenti

function add_my_metabox_comment() 
{
    add_meta_box(
        'demo-metabox-comment',        // Metabox ID
        'Commento',                    // Titolo del metabox
        'add_my_metabox_comment_code', // Generazione HTML metabox
        'comment',                     // Screen name
        'normal'                       // Contesto
    );
}

// Funzione per la generazione del codice HTML da
// inserire nel metabox. Viene ricevuto un oggetto Commento.

function add_my_metabox_comment_code($comment) 
{
    $gruppo   = get_comment_meta($comment->comment_ID,'access',true);
    $identity = get_comment_meta($comment->comment_ID,'identity',true);

    // Creazione codice HTML per inserire i campi del FORM in cui
    // specificare il valore che dovrà essere memorizzato nel CPF

   echo sprintf('<input type="text" name="comment_rating" value="%s"/>',
            esc_attr($comment->comment_karma));

   echo sprintf('<input type="text" name="comment_gruppo" value="%s"/>',
            esc_attr($gruppo));

   echo sprintf('<input type="text" name="comment_identity" value="%s"/>',
            esc_attr($identity));
}

Per semplificare al massimo il codice non ho inserito nessun comando per la gestione dell’aspetto come ad esempio classi CSS etc e non ho implementato di proposito i campi di sicurezza come ad esempio il campo di input nonce. Se volete approfondire il discorso sui metabox leggete questo articolo scritto a suo tempo => metabox.

Se abbiamo eseguito correttamente i passi indicati dovremmo vedere il nostri campi nella schermata di modifica commento presente nel pannello admin. Però per finire il nostro programma ancora manca la parte che memorizza questi valori sul database una volta che premiamo il tasto di conferma presente sulla sidebar di destra.

// Definizione di un filtro per eseguire il salvataggio
// delle opzioni presenti nel metabox e passate come $_POST

add_filter('comment_edit_redirect','my_metabox_comment_save,10,3);

// Salvataggio delle opzioni aggiuntive che sono
// state indicate nei metabox supplementari dei commenti

function my_metabox_comment_save($location,$comment_id)
{
    if (!isset($_POST['comment_rating']))   return $location;
    if (!isset($_POST['comment_gruppo']))   return $location;
    if (!isset($_POST['comment_identity'])) return $location;

    // Modifico i valore dei meta commenti con le
    // opzioni passate alla funzione tramite POST

    $access   = sanitize_text_field($_POST['comment_gruppo']);
    $identity = sanitize_text_field($_POST['comment_identity']);
    $rating   = sanitize_text_field($_POST['comment_rating']);

    if (empty($access)) delete_comment_meta($comment_id,'access');
        else update_comment_meta($comment_id,'access',$access);

    if (empty($identity)) delete_comment_meta($comment_id,'identity');
        else update_comment_meta($comment_id,'identity',$identity);

    // Modifico il commento attuale per cambiare il valore
    // della votazione indicato nel campo comment_karma

    if (!ctype_digit($rating)) $rating=0;

    $update = array();
    $update['comment_ID'] = $comment_id;
    $update['comment_karma'] = $rating;

    wp_update_comment($update);

    // Ritorno al filtro eseguito il valore originale del
    // parametro passato durante la chiamata alla funzione

    return $location;
 }

Con questo codice dovremmo aver raggiunto il nostro obiettivo, qualsiasi problema o errore di battitura che possa aver commesso fatemelo presente nei commenti.

Aggiungere un’azione bulk-action

In questa sezione vedremo come aggiungere un’operazione personalizzata nel menu a tendina presente sulla schermata di elenco commenti che può essere eseguita anche su una seleziona multipla delle righe presenti nella schermata. Con le versioni vecchie di WordPress questa operazione era molto articolata, ma finalmente con la 4.7 le cose sono diventate molto più semplici e il codice è facilmente implementabile.

Per implementare il tutto basta definire un’azione e un filtro. L’azione servirà solo per aggiungere l’opzione al menu a tendina, mentre il filtro permetterà di eseguire una funzione su tutti i commenti che verranno selezionati dall’elenco.

// Definizione azione e filtro per agganciare le
// funzioni di inserimento azione ed esecuzione del codice

add_action('bulk_actions-edit-comments','my_comment_actions');
add_filter('handle_bulk_actions-edit-comments','my_comment_execute',10,3);

// Funzione per aggiungere un'azione al menu a tendina
// potete usare questa tecnica anche per rimuovere opzioni

function my_comment_actions($actions) 
{
    $actions['demo_notification'] = 'Envía una notificación';
    $actions['demo_altra_azione'] = 'Potete aggiungerne altre';

    return $actions;
}

// Funzione per elaborare un codice personalizzato
// sui commenti che sono stati selezionati in elenco

function my_comment_execute($redirect,$doaction,$postids)
{
    if ($doaction == 'demo_notification') {
        foreach ($postids as $postid) {
           // Eseguite il codice desiderato usando
           // il valore $postid come commento corrente
        }
    }
    return $redirect;
}

Vi consiglio di usare questa tecnica per eseguire delle operazioni molti veloci, tipo aggiornare un flag sul database, accodare una richiesta in batch, etc. In quanto se la richiesta necessita di molto tempo non è idonea ad essere eseguita su una selezione multipla, potreste anche avere dei problemi di timeout. Infatti in questo caso specifico sarebbe meglio utilizzare la prossima tecnica in cui è possibile eseguire un codice PHP solo su un commento alla volta e non su una seleziona multipla di record.

Aggiungere un’azione su riga commento

In questo caso andiamo ad aggiungere un’azione sulla riga del commento vicino alle altre opzioni standard di WordPress che vengono visualizzare quando passiamo con il puntatore del mouse sopra la riga del commento. Oltre ad un’azione possiamo anche definire un semplice link legato alle informazioni dell’utente, ad esempio in questo caso ho aggiunto il link diretto alla pagina facebook dell’utente che ha commentato.

Per raggiungere questo obiettivo è semplicissimo, basta definire un filtro e richiamare una funzione che aggiunga un elemento array con il testo dell’azione e il link. Per essere più chiaro vi lascio qui di seguito il codice PHP necessario.

// Definizione filtro per comment_row_actions
// per richiamare la funzione di creazione azione

add_filter('comment_row_actions','add_facebook_link',10,2);

// Funzione del filtro che riceve le azioni correnti a
// cui possiamo aggiungere una o più azioni personalizzate

function add_facebook_link($actions,$object) {
    $actions['facebook_link'] = '<a href="LINK">Facebook</a>';
    return $actions;
}

Conclusione

In questo tutorial non ho preso in considerazione il fatto che è possibile aggiungere una colonna personalizzata alla schermata elenco commenti. Ad esempio potremmo visualizzare il voto tramite le stelline direttamente sulla schermata di elenco senza dover entrare nella modifica del singolo commento. Per vedere questa tecnica vi rimando all’articolo “Contatore di Visite” dove trovate un’esempio nella parte finale.

3 Commenti

  1. Esiste una tecnica simile per fare la stessa cosa sulla pagina dei post, delle pagine e delle opzioni generali presenti nell'area admin?

  2. Ciao Vittorio, si possono inserire dei campi personalizzati in quasi tutte le aree di wordpress, ogni sezione ha i suoi hook per collegare il tuo codice a quello standard di wordpress. Devi solo cercare per ogni elemento il filtro e qualche esempio su google.

  3. Grazie Massimo, era diverso tempo che cercavo una soluzione a questo tipo di problema, devo implementare un sistema di votazione e aggiungere il numero dei (like) a livello di singolo commento. Una volta che ho preparato il backend seguendo questa guida come faccio a personalizzare anche la parte di frontend?

condividi