Plugin

Plugin per Eliminare i Commenti: Costruiamolo Insieme

Introduzione

Capita molto spesso che ci ritroviamo siti web con molti commenti di Spam da dover eliminare. L’eliminazione dei commenti è un’operazione semplice ma, con grandi quantità di commenti, richiede molto tempo. In questo articolo vediamo come creare un plugin che, automaticamente elimina i commenti in Bulk.

Costruiamo il Plugin

Il primo passo da fare è quello di creare un nuovo file PHP plugin-delete-comments.php per il nostro nuovo plugin. Dal momento che questo plugin ha delle opzioni personalizzate del database è bene riflettere da subito su cosa queste opzioni dovranno fare. Ad esempio possiamo voler eliminare i commenti di spam oppure eliminare i commenti da moderare più vecchi di alcuni giorni.

Il plugin ha bisogno di accedere a queste opzioni più volte quindi è una buona pratica se creiamo una funzione che ci restituisce un’Array con le opzioni:

function developress_delete_comments_options() {

	return get_option( 'developress_delete_comments', [
		'status' => 'spam',
		'days'   => 10
	] );
}

Il codice sopra, cerca un’opzione nel database chiamata developress_delete_comments che archivia tutte le opzioni del plugin in un’Array singolo e, inoltre, passa i valori di default, nel caso in cui non siano ancora stati aggiunti nel database. Le opzioni di default sono: “Spam” e “10 giorni”.

Ora registriamo le impostazioni in WordPress aggiungendo un action hook: admin_init 

add_action( 'admin_init', 'developress_delete_comments_init' );

function developress_delete_comments_init() {

	// Registra le impostazioni nella schermata in "Impostazioni -> discussione".
	register_setting(
		'discussion',
		'developress_delete_comments'
	);

	// Registra il campo dello stato del commento.
	add_settings_field(
		'developress_comment_status',
		'Eliminare i commenti con quale Status?',
		'developress_comment_status_field',
		'discussion',
		'default'
	);

	// Registra il campo dei giorni.
	add_settings_field(
		'developress_comment_days',
		'Eliminare i commenti più vecchi quanti giorni?)',
		'developress_comment_days_field',
		'discussion',
		'default'
	);

	// Pianifica l'evento cron se non pianificato.
	if ( ! wp_next_scheduled( 'developress_delete_comments_event' ) ) {
		wp_schedule_event( time(), 'daily', 'developress_delete_comments_event' );
	}
}

La prima azione che il codice fa è di registrare un’impostazione personalizzata developress_delete_comments all’interno della pagina “Discussione” in Impostazioni -> Discussione. La stringa “discussions” è un valore univoco che permette di comunicare al CMS che vogliamo aggiungere un’impostazione personalizzata nella pagina “Discussione”.

Successivamente andiamo a registrare una funzione per i 2 campi personalizzati, comunicando a WordPress che il nostro plugin avrà due funzioni di callback:

developress_comment_status_field()

e

developress_comment_days_field()

Queste due funzioni mostrano i campi HTML nella schermata “Discussione”. Il blocco di codice finale si occupa dei cron job, registrando un nuovo evento programmato. Quindi aggiungiamo un hook chiamato

developress_delete_comments_event

che si attiverà ogni giorno. Nei codici successivi andiamo a creare le funzioni di callback per le impostazioni di campi:

function developress_comment_status_field() {

	$options = developress_delete_comments_options();
	$status  = $options['status']; ?>

	<select name="developress_delete_comments[status]">
		<option value="spam" <?php selected( $status, 'spam' ); ?>>
			Spam
		</option>
		<option value="moderated" <?php selected( $status, 'moderated' ); ?>>
			Moderato
		</option>
	</select>

<?php }

function developress_comment_days_field() {

	$options = developress_delete_comments_options();
	$days    = absint( $options['days'] );

	printf(
		'<input type="number" name="developress_delete_comments[days]" value="%s">',
		esc_attr( $days )
	);
}

Vediamo il codice step by step. Questa funzione

developress_comment_status_field()

restituisce come output HTMl un <select> dal quale è possibile scegliere lo status dei commenti “spam” o “moderato”. Mentre la seguente funzione

developress_comment_days_field()

restituisce un campo numerico, da notare che abbiamo aggiunto la funzione

absint()

in relazione alla variabile $days per essere certi che il valore inserito sia un intero positivo. Vediamo l’output di tutti i codici scritti fin qui:

 

 

Ora abbiamo bisogno di aggiungere una action all’hook del cron job (creato prima) che si occuperà di gestire l’eliminazione dei commenti.

add_action( 'developress_delete_comments_event', 'developress_delete_comments_task' );

function developress_delete_comments_task() {
	global $wpdb;

	$options = developress_delete_comments_options();
	$status  = $options['status'];
	$days    = absint( $options['days'] );

	// Imposta il valore predefinito comment_approved su spam.
	$comment_approved = 'spam';

	// Se lo stato è moderato, WordPress lo memorizza come "0".
	if ( 'moderated' !== $status ) {
		$comment_approved = '0';
	}

	// Crea ed esegui la query per eliminare i commenti.
	$sql = "DELETE FROM $wpdb->comments
	        WHERE ( comment_approved = '$comment_approved' )
		AND DATEDIFF( now(), comment_date ) > %d";

	$wpdb->query( $wpdb->prepare( $sql, $days ) );
}

L’azione principale che compie il codice sopra è di effettuare una query al database per eliminare i commenti seguendo le impostazioni selezionate dall’utente. La query eliminerà i commenti basandosi sul campo comment_approved che è il campo nella tabella $wpdb->comments che archivia lo status dei commenti.

Conclusioni e Download

L’obiettivo di questo articolo è quello di fornire una panoramica delle impostazioni e best practices di base che un plugin deve avere. È molto interessante la funzionalità dei cron job di WordPress in quanto ha un’infinità di ambiti di applicazione e può essere utile per molti interventi anche a livelli avanzati.

Ti invito a scaricarti il codice completo (crea un file .zip del file plugin-delete-comments.php) e a provarlo sul tuo sito web in un ambiente di prova (caricandolo come un comune plugin), così da poter “toccare con mano” ciò che hai imparato in questo articolo. Grazie per la lettura!

<?php
/**
 * Plugin Name: Bulk Delete Comments Developress
 * Plugin URI:  https://www.developress.it
 * Description: Questo plugin ti consente di eliminare in massa i commenti
 * Author:      DEVELOPRESS
 * Author URI:  https://www.developress.it
 */

function developress_delete_comments_options() {

	return get_option( 'developress_delete_comments', [
		'status' => 'spam',
		'days'   => 10
	] );
}

add_action( 'admin_init', 'developress_delete_comments_init' );

function developress_delete_comments_init() {

	// Registra le impostazioni nella schermata della discussione.
	register_setting(
		'discussion',
		'developress_delete_comments'
	);

	// Registra il campo dello stato del commento.
	add_settings_field(
		'developress_comment_status',
		'Eliminare i commenti con quale Status?',
		'developress_comment_status_field',
		'discussion',
		'default'
	);

	// Registra il campo dei giorni.
	add_settings_field(
		'developress_comment_days',
		'Eliminare i commenti più vecchi quanti giorni?)',
		'developress_comment_days_field',
		'discussion',
		'default'
	);

	// Pianifica l'evento cron se non pianificato.
	if ( ! wp_next_scheduled( 'developress_delete_comments_event' ) ) {
		wp_schedule_event( time(), 'daily', 'developress_delete_comments_event' );
	}
}

function developress_comment_status_field() {

	$options = developress_delete_comments_options();
	$status  = $options['status']; ?>

	<select name="developress_delete_comments[status]">
		<option value="spam" <?php selected( $status, 'spam' ); ?>>
			Spam
		</option>
		<option value="moderated" <?php selected( $status, 'moderated' ); ?>>
			Moderato
		</option>
	</select>

<?php }

function developress_comment_days_field() {

	$options = developress_delete_comments_options();
	$days    = absint( $options['days'] );

	printf(
		'<input type="number" name="developress_delete_comments[days]" value="%s">',
		esc_attr( $days )
	);
}

add_action( 'developress_delete_comments_event', 'developress_delete_comments_task' );

function developress_delete_comments_task() {
	global $wpdb;

	$options = developress_delete_comments_options();
	$status  = $options['status'];
	$days    = absint( $options['days'] );

	// Imposta il valore predefinito comment_approved su spam.
	$comment_approved = 'spam';

	// Se lo stato è moderato, WordPress lo memorizza come "0".
	if ( 'moderated' !== $status ) {
		$comment_approved = '0';
	}

	// Crea ed esegui la query per eliminare i commenti.
	$sql = "DELETE FROM $wpdb->comments
	        WHERE ( comment_approved = '$comment_approved' )
		AND DATEDIFF( now(), comment_date ) > %d";

	$wpdb->query( $wpdb->prepare( $sql, $days ) );
}

register_deactivation_hook( __FILE__, 'developress_delete_comments_deactivate' );

function developress_delete_comments_deactivate() {

	$timestamp = wp_next_scheduled( 'developress_delete_comments_event' );

	if ( false !== $timestamp ) {
		wp_unschedule_event( $timestamp, 'developress_delete_comments_event' );
	}
}