Cuando migré este blog desde Movable Type a WordPress no tuve en cuenta ciertos detalles en lo concerniente al spam en los comentarios. Movable Type tenía un plugin buenísimo llamado blacklist, que hacía que todo comentario pasase un filtro definido por el usuario, y si coincidía con alguna expresión regular prohibida, no se procesaba. WordPress tiene algo parecido, pero con ciertas carencias.
Hay una lista de palabras prohibidas (o IPs, o direcciones de correo) a configurar en el panel de administración, pero son particulares de cada usuario. Hay un estupendo plugin que solventa ese detalle, pero aún hay problemas. Para instalar ese plugin hay que modificar el archivo wp-comments-posts.php de forma que casi al final haya:
$blacklists = $wpdb->get_results("SELECT domain FROM blacklist");
foreach ($blacklists as $blacklist) {
$regex = "/".$blacklist->domain."/i";
if (@preg_match($regex, $url))
$approved = 0;
if (@preg_match($regex, $email))
$approved = 0;
if (@preg_match($regex, $comment))
$approved = 0;
}
Problema de esto: no comprueba la IP. Pero algo mucho peor: si el comentario es spam, lo añade a la base de datos (los INSERTS son costosos, tanto en bases de datos como en la vida real) y avisa por e-mail al administrador del blog de que hay un comentario pendiente de moderar. Esto es porque utiliza la misma variable ($approved) que la lista de palabras prohibidas interna. La solución a la que he llegado para apañar todo esto es:
$blacklists = $wpdb->get_results("SELECT domain FROM blacklist");
$blacklisted = 0;
foreach ($blacklists as $blacklist) {
$regex = '/'.$blacklist->domain.'/i';
if (@preg_match($regex, $url))
$blacklisted = 1;
if (@preg_match($regex, $email))
$blacklisted = 1;
if (@preg_match($regex, $comment))
$blacklisted = 1;
if (@preg_match($regex, $user_ip))
$blacklisted = 1;
}
if ($blacklisted == 1)
exit('Stop spamming, you sub-human piece of shit');
Con esto nos ahorramos las enormes cargas que se producen en la máquina que alberga el Apache (he llegado a ver a la máquina que alberga este blog con carga de 70 hace un rato) y no tenemos que ir luego eliminando a mano mensajes que ya sabemos que no queremos.








