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>
Interesante estudio sobre comparativa de sentencias en PHP5 que obtienen el mismo resultado, para conocer cual de ellas es la más rápida. Por ejemplo: es más rápido concatenar una cadena a una variable usando el punto (.) que incluyéndo la variable entre comillas dobles, para expresiones regulares es más rápido usar preg_match que eregi, es 8 veces más rápido usar explode que split. También es una buena referencia para saber como hacer lo mismo de distintas formas. Pero lo que más me ha sorprendido es que comparando con PHP4 las expresiones regulares se han vuelto más lentas (casi 7 veces más rápido en PHP4 que en PHP5), lo cual me hace pensar que o bien es debido a una mejora que completa las expresiones regulares, o antes no se hacÃan muy bien, porque ir a peor no tiene mucho sentido.