Blog and Web

Sistema antispam de campo oculto en WordPress 2.7

Existen varios sistemas en WordPress que pretenden ayudar en la eterna lucha del blogger con el spam. Hasta ahora ninguno de ellos infalible, pero en combinación pueden dar buenos resultados. Uno de estos sistema y excelente complemento de akismet es el de un campo extra y oculto en el formulario de comentarios del que ya hace tiempo se habló en sigt, pero que vale la pena revivir y actualizar.

¿Cómo funciona?

Lo que hace este sistema es integrar un nuevo campo al formulario de comentarios que no será visible para el lector normal mediante CSS, pero difícilmente detectado por un spambot. Este campo oculto contiene un valor predeterminado que el spamblog modificará; al enviarlo, se comprueba el valor modificado, si es así, el comentario no será publicado y lanzará un mensaje de error.

Implementación

Antes de comenzar haz un backup de los archivos comments.php, style.css del theme en uso y de wp-comments-post.php, en la raíz de la instalación de WordPress.

Agregar el campo extra

El primero será agregar el campo extra al formulario de comentarios, este se encuentra en el archivo comments.php de tu theme. En este archivo se busca el campo para el nombre del autor, que puede ser muy similar al siguiente código:

<input type="text" tabindex="1" size="22" value="<?php echo $comment_author; ?>" id="author" name="author" />

En este código hay que cambiar los atributos id y name, por ejemplo, por la palabra “nombrereal“, haciendo la sustitución en el código anterior queda:

<input type="text" tabindex="1" size="22" value="<?php echo $comment_author; ?>" id="nombrereal" name="nombrereal" />

Ya modificado el campo que enviará el nombre real del usuario, agregamos el campo oculto. Arriba del código anterior, agrega:

<input type="text" tabindex="1" size="22" value="nomodificar" id="author" name="author" />

Nótese que en el atributo value contiene el texto “nomodificar” el cual precisamente modificarán los apambots.

Comprobar que el campo no se modifico

La comprobación del contenido de los campos de comentarios se hace en el archivo wp-comments-post.php, ubicado en la raíz de tu instalación de WordPress, así que es en él donde se agregará esta nueva comprobación. En este archivo busca:

$comment_author       = ( isset($_POST['author']) )  ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
$comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

Y sustitúyelo con:

$comment_author       = ( isset($_POST['nombrereal']) )  ? trim(strip_tags($_POST['nombrereal'])) : null;
$comment_author_fake  = ( isset($_POST['author']) )   ? trim($_POST['author']) : null;
$comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
$comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

Ahora hay que agregar la condición de que el campo no haya sido modificado. En este mismo archivo busca:

if ( '' == $comment_content )
	wp_die( __('Error: please type a comment.') );

Y justo abajo agrega:

if ( $comment_author_fake != 'nomodificar' )
    wp_die('Comentario calificado como spam. Si no eres un robot malvado, ve a la pagina de contacto y avísanos del problema');

En cual puedes personalizar el mensaje de error. Ahora falta adicionar el valor correcto del campo antispam para los usuarios registrados, de otro modo serían marcados siempre como spam. En el mismo archivo wp-comments-post.php, busca:

	$comment_author_url   = $wpdb->escape($user->user_url);

Y justo abajo agrega la siguiente linea:

	$comment_author_fake  = 'nomodificar';

Ocultar el campo con CSS

El último paso es ocultar el campo de la vista del lector, esto se hace con CSS en el archivo style.css de tu theme. La forma más sencilla sería agregar lo siguiente:

input#author { display:none; }

Sin embargo este podría ser detectado por algunos bots que ya “conocen” el truco, así que lo recomendable es usar otro método de acuerdo a tu theme, aplicando atributos al input o al contenedor. La siguiente forma puede ser útil en muchos casos:

input#author {
	overflow:hidden;
	height:1px !important;
	float:left !important;
	margin:0 !important;
	padding:0 !important;
}

Si la flotación causa problemas, puedes limpiarla, agregando el siguiente código justo abajo del campo oculto en el archivo comments.php:

<div style="clear:left;"></div>

Ahora solo elimina el cache de tu blog para que este sistema tenga efecto y disfruta de menos trabajo revisando el spam.

Ventajas

Desventajas

Conclusión

Este es un sistema, por ahora, eficaz y nada molesto para el usuario. Su implementación parece compleja, pero no toma más de 20 o 30 minutos en tenerlo funcionando. Es sensible a las actualizaciones del CMS, pero fácilmente adaptable si se tienen al menos nociones de php y css. En lo particular lo veo como un complemento ideal para akismet.