Página de error 404 personalizada para Word Press
El otro día hablábamos sobre el modo de personalizar la página de error de página no encontrada. Decíamos que se le podría añadir una lista de entradas relacionadas con la url que hemos introducido incorrectamente. Y como no hay nada mejor que los ejemplos, vamos a explicar como se podría realizar para Word Press.
Una vez seguidos los pasos necesarios para configurar nuestro servidor, nos ponemos a realizar la página de error, cuya estructura es la siguiente:
- Recuperar la url incorrecta.
- Obtener información de esa url, en este caso vamos a quedarnos con la última palabra, que normalmente es la más significativa.
- Consultar en la base de datos las entradas que tienen relación con la información obtenida en la URL
- Mostrar los resultados
Los dos primeros puntos ya los explicamos en la entrada anterior, lo que es nuevo es el método necesario para obtener las entradas relacionadas. La BD de Word Press es bastante sencillita, lo que no hace difícil entender su funcionamiento. Las entradas se guardan en la tabla wp_post y entre los campos que tiene, destacamos:
- guid: acceso directo a la entrada
- post_title: título del post
- post_content: contenido del post
Por lo cual, para obtener las entradas que contienen la palabra obtenida de la URL, deberemos ejecutar la siguiente query:
SELECT guid, post_title, post_content
FROM wp_posts
WHERE UPPER(post_title) RLIKE [ultima-palabra-url] OR
UPPER(post_content) RLIKE [ultima-palabra-url]
En este caso obtenemos todas las entradas que tiene en el título o en el contenido texto similar a la última palabra de la url. No es muy eficiente hacer esto, quizás sería preferible solo buscar en el título, limitar el número de resultados, … pero para este ejemplo nos es válido.
Veamos cómo sería el contenido de la página de error.
Primero es necesario incluir la página wp-blog-header.php, que es la que hace que se incluyan las librerías de Word Press.
<?php require('[url-raiz-wordpress]/wp-blog-header.php'); ?>
Presentación del mensaje de error
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="estilos.css" />
<title>Sentido Web: error 404</title>
</head>
<body>
<p class="error">La página a la que ha accedido no existe:</p>
<?php
$pagina = $_SERVER['REQUEST_URI'];
?>
<p><?php echo $pagina; ?></p>
Obtenemos información de la url.
<p>Páginas relacionadas:</p>
<?php
// Obtenemos la última palabra
if (strrpos($pagina, "/") == strlen($pagina) -1) {
$pagina = substr($pagina, 0, strlen($pagina)-2);
}
$ultimaPalabra = substr($pagina, strrpos($pagina, "/")+1);
if (strrpos($ultimaPalabra, ".") > 0) {
$ultimaPalabra = substr($ultimaPalabra, 0, strrpos($ultimaPalabra, "."));
}
$ultimaPalabra = strtoupper($ultimaPalabra);
Y por último obtenemos la información de la BD, para ello usamos la variable $wpdb que se gestiona la relación con la BD.
$entradas = $wpdb->get_results("SELECT guid, post_title, post_content FROM $wpdb->posts WHERE UPPER(post_title) RLIKE '$ultimaPalabra' OR UPPER(post_content) RLIKE '$ultimaPalabra'", ARRAY_N);
?>
<ul>
<?php
foreach ($entradas as $entrada) {
?>
<li><a href="<?php echo $entrada[0]; ?>"><?php echo $entrada[1]; ?></a></li>
<?php
}
?>
</ul>
</body>
</html>