Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Frenar el spam de comentarios con reglas simples: URLs largas, demasiados enlaces y el campo web

Si tienes los comentarios abiertos, conoces el spam: mensajes genéricos («¡Gran artículo, muy útil!») firmados por «mejores casinos online» con un enlace a un sitio dudoso. El objetivo es casi siempre el mismo: conseguir un enlace desde tu sitio.

Los filtros como Akismet o Cloudflare Turnstile detienen la mayoría. Pero unas pocas reglas propias cubren lo que se les escapa, sin servicios externos.

Los patrones del spam

  • URL muy larga en el campo «Web», con parámetros o rutas raras.
  • Varios enlaces en el texto del comentario.
  • Nombre que no es un nombre: palabras clave comerciales («préstamos rápidos», «seo barato»).
  • Texto genérico que serviría para cualquier artículo.
  • Comentarios en entradas muy antiguas, donde casi nadie comenta de verdad.

El mu-plugin

Envía a spam los comentarios que cumplen alguna de estas reglas. Las personas registradas y con sesión iniciada no se revisan. Guárdalo como wp-content/mu-plugins/cwp-antispam.php:

<?php
/**
 * Plugin Name: Reglas antispam para comentarios (Curso WordPress)
 */

const CWP_SPAM_URL_MAX     = 60;  // Caracteres máximos del campo Web.
const CWP_SPAM_ENLACES_MAX = 1;   // Enlaces máximos en el texto.
const CWP_SPAM_NOMBRE_MAX  = 40;  // Caracteres máximos del nombre.

add_filter( 'pre_comment_approved', function ( $aprobado, $datos ) {
	if ( 'spam' === $aprobado || is_wp_error( $aprobado ) || ! empty( $datos['user_id'] ) ) {
		return $aprobado;
	}

	$texto  = (string) ( $datos['comment_content'] ?? '' );
	$web    = (string) ( $datos['comment_author_url'] ?? '' );
	$nombre = (string) ( $datos['comment_author'] ?? '' );

	// 1. Campo web demasiado largo.
	if ( strlen( $web ) > CWP_SPAM_URL_MAX ) {
		return 'spam';
	}
	// 2. Demasiados enlaces en el texto.
	if ( preg_match_all( '#https?://|<a\s#i', $texto ) > CWP_SPAM_ENLACES_MAX ) {
		return 'spam';
	}
	// 3. Nombre demasiado largo o con un enlace.
	if ( mb_strlen( $nombre ) > CWP_SPAM_NOMBRE_MAX || preg_match( '#https?://|www\.#i', $nombre ) ) {
		return 'spam';
	}
	// 4. Comentario que es solo un enlace.
	if ( preg_match( '#^\s*https?://\S+\s*$#i', $texto ) ) {
		return 'spam';
	}
	return $aprobado;
}, 20, 2 );

Los comentarios atrapados no se pierden: quedan en Comentarios → Spam, donde puedes revisarlos y rescatar alguno si la regla se equivocó.

Revisa la carpeta de spam las primeras semanas. Si alguna regla atrapa comentarios legítimos (por ejemplo, alguien que pega un enlace a su código en GitHub para pedir ayuda), sube CWP_SPAM_ENLACES_MAX a 2.

La medida más efectiva: quitar el campo «Web»

Si el objetivo del spam es el enlace del campo «Web», quítalo del formulario. La mayoría de las personas que comentan de verdad no lo usan, y para los robots tu sitio pierde interés.

<?php
add_filter( 'comment_form_default_fields', function ( $campos ) {
	unset( $campos['url'] );
	return $campos;
} );

// Y si un robot lo envía igual (los robots no usan el formulario), se descarta.
add_filter( 'preprocess_comment', function ( $datos ) {
	if ( empty( $datos['user_id'] ) ) {
		$datos['comment_author_url'] = '';
	}
	return $datos;
} );

En temas de bloques, el formulario de comentarios es un bloque, pero sigue usando el mismo filtro, así que el campo desaparece igual. Si tu tema o un plugin de comentarios usa su propio formulario, revisa sus ajustes.

Cerrar comentarios en entradas antiguas

En Ajustes → Comentarios, marca Cerrar automáticamente los comentarios en las entradas con más de y elige, por ejemplo, 180 días. Si prefieres mantener abiertas algunas entradas antiguas muy activas, puedes reabrirlas una por una.

Y si el spam no para

Las reglas de esta guía son un complemento. Si recibes cientos de comentarios de spam al día, agrega una protección en el formulario como Turnstile (lo vimos en otra guía) o un servicio como Akismet. Así el spam ni siquiera llega a tu base de datos.

¿Qué patrón de spam te llega más? Compártelo en el foro (sin el enlace) y vemos qué regla lo atrapa.