Cómo añadir un honeypot a un formulario de contacto de Contact Form 7

Valencia, 14/08/2024, G.B.
Para ampliar la información del artículo Cómo evitar el spam en los formularios de Contact Form 7 en WordPress, vamos ahora a ver cómo añadir un «honeypot» o «tarro de miel» a un formulario de Contact Form 7 para engañar a los bots y evitar así el maldito spam, en la medida de lo posible…

Son tres sencillos pasos:

1) Añadir el campo oculto al formulario

En el editor de Contact Form 7, dentro de la pestaña Formulario, añade este campo en cualquier parte del formulario (por ejemplo, justo después del campo de nombre):

[text website-url]

Esto genera un campo de texto normal llamado website-url. El nombre es arbitrario, pero conviene que suene «atractivo» para un bot (website, url, phone-number… campos que suelen rellenar automáticamente).

2) Ocultarlo con CSS

Añade esta regla a la hoja de estilos del tema (o al Personalizador → CSS adicional):

.wpcf7-form p:has(input[name="website-url"]) {
position: absolute;
left: -9999px;
top: -9999px;
}

Si prefieres no depender de :has() (por compatibilidad con navegadores muy antiguos), puedes envolver el campo en un <span> con una clase propia desde el editor de CF7 en modo HTML:

<span class="cf7-honeypot">[text website-url]</span>

y luego:

.cf7-honeypot {
position: absolute;
left: -9999px;
top: -9999px;
}

Ambas opciones son válidas; la primera es más simple si no necesitas soportar navegadores muy antiguos.

3) Validar el envío en functions.php

Contact Form 7 incluye desde la versión 5.1 el filtro wpcf7_spam, pensado justo para esto:

add_filter( 'wpcf7_spam', function ( $spam, $submission ) {
if ( $spam ) {
return $spam; // ya marcado como spam por otra regla, no seguimos
}

$data = $submission->get_posted_data();

if ( ! empty( $data['website-url'] ) ) {
return true; // el honeypot llegó relleno: es un bot
}

return $spam;
}, 10, 2 );

Con esto, si el campo website-url llega con cualquier contenido, Contact Form 7 marca el envío como spam internamente y lo bloquea antes de que se envíe el correo, sin mostrar ningún error confuso al bot (simplemente no pasa nada, como sería el comportamiento esperado desde su perspectiva).

Nota importante sobre el name del campo

Evita nombres como honeypot o trap: los bots más elaborados ya los reconocen y los saltan. Cuanto más «normal» parezca el nombre del campo (address, company, fax-number), más probable es que un bot lo rellene sin sospechar nada.