Crear un módulo custom para evitar errores 404 en los nodos eliminados en Drupal 7

El SEO es un mundo en sí mismo, y muchos programadores se olvidan de él. Según el proyecto tiene o no importancia, ya que si estamos desarrollando una plataforma de gestión interna no tiene sentido que Google y los demás buscadores nos indexen, mientras que si lo que estamos programando es un portal institucional, corporativo o un e-commerce la importancia es crítica. ¿Qué sentido tiene crear una tienda on-line si luego nadie nos va a encontrar? Podríamos desarrollar el mejor proyecto del mundo, que convirtiera en ventas las visitas en un alto porcentaje… pero si no llegan visitas el fracaso está al caer.

Después de esta pequeña reflexión sobre el SEO, os quería explicar uno de los módulos custom que suelo instalar en mis proyectos en Drupal 7. Depende del módulo redirect, ya que las opciones de configuración aparecen dentro de las suyas, además de utilizar algunas funciones propias de ese módulo.

El módulo Redirect

Comencemos con el concepto de redirección, que simplemente es configurar una directiva que hace que cuando un usuario visite una página Web, de forma automática vaya a otra distinta. Es decir, nos va a cambiar la dirección que visitamos en nuestro navegador. El sentido de esto es que cuando nosotros eliminamos un contenido de nuestra Web, cuando un usuario que tiene esa URL en favoritos o la encuentra en algún lado accede, se va a encontrar con un error de página no encontrada (el famoso error 404). Pero si nosotros creamos una redirección permanente (301) a otra página que tenga contenido igual o equivalente la experiencia de usuario no sufre, y además los buscadores no nos van a penalizar. Se utiliza mucho en las migraciones de páginas en las que todas las URLs cambian y no queremos perder el posicionamiento adquirido durante años con las URLs de la web antigua.

Pues bien, redirect es uno de los módulos imprescindibles para el SEO. Nos permite realizar redirecciones 301 de una URL a otra sin tener que meterlas en la configuración de Apache ni en el .htaccess, si bien es más recomendable hacerlo de este otro modo. Hacer las redirecciones con el módulo redirect en lugar de mediante .htaccess hace que exista mayor procesamiento en nuestro CMS, lo que puede retardar la carga (aunque casi siempre de forma imperceptible). Además de poder llevar una gestión de las redirecciones 301, nos permite que al cambiar una URL de una página se genere el redirect 301 de la URL antigua a la actual de forma automática.

¿Qué intento arreglar con mi módulo custom?

Haciendo una revisión SEO me di cuenta de que cuando elimino un contenido su identificador de nodo ya no se vuelve a rellenar. Así que si alguien se ha guardado la URL http://www.example.com/node/2 y yo he eliminado el nodo 2, cuando acceda se encontrará un error de página no encontrada. El propósito del módulo es buscar todos los nodos que han sido eliminados y que no tienen redirección 301, y añadirle una que apunte a la home de nuestra Web.

Programación

He denominado a estos nodos, nodos huérfanos. En primer lugar vamos a crear mediante el hook hook_menu las URLs de administración en el backend. Como ya he comentado antes, se colocarán dentro de las opciones del módulo redirect. Se trata de tres URLs:

  1. Las opciones globales del módulo: nos permitirán acceder a un formulario con dos opciones: si está marcada la primera revisará todos los nodos huérfanos y creará una redirección 301 a la home, mientras que si la segunda esta marcada hará esta operación en cada ejecución del cron.
  2. Listado de nodos huérfanos: será una lista de los nodos huérfanos. Nos permitirá añadirle redirección si no la tiene, o copiar el texto de la redirección para pegarlo directamente en .htaccess. Si la redirección existe nos mostrará hacia donde apunta y nos dejará modificarla.
  3. Texto para .htaccess: Será un texto con todas las redirección 301 creadas en formato .htaccess para copiarlo entero y pegarlo en ese archivo.

Formulario principal

En este crearemos los dos checkboxes para las dos opciones que ya he comentado. Solo utilizaremos una variable de sistema para conocer si en el cron debe hacer alguna operación o no. El otro checkbox es una opción inmediata que se ejecuta al enviar el formulario, por lo que no tiene sentido:

Vamos a ver las operaciones que se ejecutan al guardar el form. Comprueba si debe crear los redirects ahora mismo, y si es así llama a una función que realizará esta tarea. Veremos esa función en seguida. Después actualiza la variable de la ejecución durante el cron según el valor marcado en el formulario:

Veamos ahora la función que crea los redirects. Obtiene el valor más alto del número de nodo creado, ya que va a tener que buscar de ahí para abajo aquellos que no existan. Cuando detecta uno, crea la redirección a la página principal del sitio web:

Esta es la función que obtiene el número máximo de nodo:

Ejecución del cron

Ahora debemos crear el comportamiento que tendrá cuando ejecute el cron, ya que si la configuración está activa tendrá que crear esos redirects 301. Utilizaremos el hook_cron. Como vemos simplemente es mirar la variable de sistema y si está activa llamar a la función que hemos visto anteriormente, que es la encargada de crear los redirects.

Listado de nodos huérfanos

La función que mostrará esta funcionalidad construye una tabla con todos los nodos huérfanos. Si el nodo tiene redirección ya, la muestra y permite modificarla o eliminarla, mientras que si no la tiene nos dejará agregarla, además de mostrarnos un texto que podríamos pegar en nuestro archivo .htaccess para hacerlo a nivel de servidor:

Texto para .htaccess

Para terminar, encontramos esta función que genera un formulario con un área de texto. En esta encontraremos el texto que habría que pegar en .htaccess para generar las redirecciones 301 a nivel de servidor, si es que no queremos hacerlo mediante el módulo redirect.

 

Experto en la Gestión de Proyectos Web basados en Drupal con más de 8 años de experiencia. Desarrollo Full Stack (Front-end, Back-end, Site-Builder).

No Replies to "Crear un módulo custom para evitar errores 404 en los nodos eliminados en Drupal 7"