jueves, 16 de junio de 2011

Cómo integrar reCAPTCHA en Wordpress

Últimamente estamos recibiendo mucho spam en los blogs de la plataforma. Y eso que tenemos instalado un plugin, WP-SpamFree, que parece que no está realizando del todo bien su trabajo.

Así que como primera medida preventiva, vamos a introducir un captcha en el formulario de envío de comentarios. La más popular de estas herramientas, adquirida y auspiciada hace tiempo por Google, es reCAPTCHA.

Supuestamente hay disponible un plugin para Wordpress. Y digo supuestamente porque el plugin parece haberse roto en las versiones 3.x de WP. Así que nuestro gozo en un pozo.

Tenemos, pues, tres opciones:

  • Buscar otro plugin que permita añadir captchas a los formularios. La verdad es que no nos ha convencido ninguno.
  • Arreglar el plugin de reCAPTCHA. Como contribución a la comunidad estaría genial, pero no tenemos los conocimientos ni la experiencia suficientes como para afrontar la tarea en un corto periodo de tiempo.
  • Modificar nosotros el código de nuestro tema de Wordpress para añadir reCAPTCHA.

Al final hemos optado por la última opción. Una vez efectuadas las investigaciones pertinentes, no ha resultado demasiado complicado.

La implementación en el formulario es muy sencilla, siguiendo las instrucciones que podemos encontrar en su web: http://code.google.com/apis/recaptcha/docs/display.html.

Ahora sólo queda comprobar, a la hora de procesar el alta de comentarios, que el captcha introducido es correcto. Para ello, nuevamente tenemos dos opciones: escribir un plugin al uso o añadir código en la librería personalizada functions.php. Optamos una vez más por la segunda opción.

Lo que hemos hecho ha sido escribir una función que comprueba el captcha, a partir de las instrucciones que encontramos en la documentación: http://code.google.com/apis/recaptcha/docs/php.html. Y, haciendo uso de los filtros de Wordpress (tremendamente útiles para poder personalizar su comportamiento sin tocar el "core"), asignamos la función recién creada al filtro "pre_comment_approved", que se ejecuta antes de verificar si el comentario debe o no aprobarse.


// Custom reCAPTCHA "plugin"
add_filter('pre_comment_approved', 'recaptcha_solved_comment');
function recaptcha_solved_comment($approved)
{
require_once(dirname(__FILE__) . '/lib/recaptcha/recaptchalib.php');

$privatekey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX';

$resp = recaptcha_check_answer($privatekey, $_SERVER['REMOTE_ADDR'], $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field']);

if (!$resp->is_valid)
{
$approved = 'spam';
wp_die( __('Debes introducir el código de verificación correcto.') );
}
return $approved;
}