Autor

Alejandro Alcalde

Graduado en Ingeniería Informática en la ETSIIT, Granada. Creador de El Baúl del Programador

Más artículos de Alejandro Alcalde

El error 404 debe tratarse adecuadamente en las webs para no asustar al usuario y provocar que salga de nuestro sitio.

Es una buena práctica sugerir enlaces que puedan estar relacionados con lo que estaba buscando, poner un enlace a la página principal o al mapa de la web.

Con todo esto en mente busqué cómo crear errores 404 personalizados y modificarlos a mi gusto. La solución la encontré en la misma página del proyecto wordpress:


¿Te gusta el blog? Ayúdame a seguir escribiendo


<p>
  You
  <?php
#some variables for the script to use
#if you have some reason to change these, do.  but wordpress can handle it
$adminemail = get_option('admin_email'); #the administrator email address, according to wordpress
$website = get_bloginfo('url'); #gets your blog's url from wordpress
$websitename = get_bloginfo('name'); #sets the blog's name, according to wordpress

  if (!isset($_SERVER['HTTP_REFERER'])) {
    #politely blames the user for all the problems they caused
        echo "tried going to "; #starts assembling an output paragraph
    $casemessage = "All is not lost!";
  } elseif (isset($_SERVER['HTTP_REFERER'])) {
    #this will help the user find what they want, and email me of a bad link
    echo "clicked a link to"; #now the message says You clicked a link to...
        #setup a message to be sent to me
   $failuremess = "A user tried to go to $website"
        .$_SERVER['REQUEST_URI']." and received a 404 (page not found) error. ";
   $failuremess .= "It wasn't their fault, so try fixing it.
        They came from ".$_SERVER['HTTP_REFERER'];
    mail($adminemail, "Bad Link To ".$_SERVER['REQUEST_URI'],
        $failuremess, "From: $websitename <noreply@$website?>"); #email you about problem
   $casemessage = "An administrator has been emailed
          about this problem, too.";#set a friendly message
    }
    echo " ".$website.$_SERVER['REQUEST_URI']; ?>
  and it doesn't exist.

  <?php echo $casemessage; ??>  You can click back
  and try again or search for what you're looking for:


  <?php include(TEMPLATEPATH . "/searchform.php"); ??>
</p>

Esta porción de código hay que pegarla en el archivo 404.php de la plantilla en uso. Con este código informamos al lector que la página no existe y se proporciona un formulario de búsqueda, además se envía un correo al administrador del blog informándo de este error 404. Aún podemos tratar el error de una manera más amigable y ofrecer más opciones. Por ejemplo las últimas publicaciones del blog:

<h4>
  Publicaciones recientes
</h4>
<ul>
<?php
         $recent_posts = wp_get_recent_posts( array('post_status' =?> 'publish') );
           foreach( $recent_posts as $recent ){
       echo '

  <li>
<a href="' . get_permalink($recent[" id="ID">' .   $recent["post_title"].'</a>
</li> ';
           }
        ?>

</ul>

Incluso es posible sugerir entradas relacionadas en base a la url que devolvió el 404:

<?php
$query_args = array( 's' =?> basename($_SERVER['REQUEST_URI']) );
$query = new WP_Query( $query_args );

if($query->have_posts()){
   echo "

<h4>
  Quizá buscaba...
</h4>";

   // The Loop
   echo '

<ul>
  ';
     while ( $query->have_posts() ) : $query->the_post();
        echo '

  <li>
    ';
    ?>
          <a href="<?php the_permalink() ?>"><?php the_permalink() ??>" title="Permanent Link to <?php the_title_attribute(); ??>"><?php the_title(); ??></a>
<?php
      echo '</li?>';
       endwhile;
       echo '</li></ul>';

       // Reset Post Data
       wp_reset_postdata();
    }
    ?>

Al juntarlo todo, la estructura del código queda así:

<p>
  Ha
  <?php
   #some variables for the script to use
   #if you have some reason to change these, do.  but wordpress can handle it
   $adminemail = get_option('admin_email'); #the administrator email address, according to wordpress
   $website = get_bloginfo('url'); #gets your blog's url from wordpress
   $websitename = get_bloginfo('name'); #sets the blog's name, according to wordpress

   if (!isset($_SERVER['HTTP_REFERER'])) {
      #politely blames the user for all the problems they caused
      echo "intentado ir a "; #starts assembling an output paragraph
      $casemessage = "¡No está todo perdido!";
   } elseif (isset($_SERVER['HTTP_REFERER'])) {
      #this will help the user find what they want, and email me of a bad link
      echo "pinchado en un enlace a"; #now the message says You clicked a link to...
      #setup a message to be sent to me
      $failuremess = "A user tried to go to $website"
      .$_SERVER['REQUEST_URI']." and received a 404 (page not found) error. ";
      $failuremess .= "It wasn't their fault, so try fixing it.
      They came from ".$_SERVER['HTTP_REFERER'];
      mail($adminemail, "Bad Link To ".$_SERVER['REQUEST_URI'],
      $failuremess, "From: $websitename <noreply@$website?>"); #email you about problem
        $casemessage = "El administrador ha sido informado sobre este error.";#set a friendly message
     }
     echo " ".$website.$_SERVER['REQUEST_URI']; ?>
     y no existe.

  <?php echo $casemessage; ??>  Puede volver atrás
     e intentarlo de nuevo o buscar lo que desee en el formulario:


  <?php include(TEMPLATEPATH . "/searchform.php"); ??>
</p>
<?php
   $query_args = array( 's' =?> basename($_SERVER['REQUEST_URI']) );
   $query = new WP_Query( $query_args );

   if($query->have_posts()){
      echo "

<h4>
  Quizá buscaba...
</h4>";

      // The Loop
      echo '

<ul>
  ';
        while ( $query->have_posts() ) : $query->the_post();
           echo '

  <li>
    ';
    ?>
             <a href="<?php the_permalink() ?>"><?php the_permalink() ??>" title="Permanent Link to <?php the_title_attribute(); ??>"><?php the_title(); ??></a>
<?php
    echo '</li?>';
          endwhile;
          echo '</li></ul>';
          // Reset Post Data
          wp_reset_postdata();
    }
    ?>


    <br />
<h4>
      Publicaciones recientes
    </h4>
<ul>
<?php
   $recent_posts = wp_get_recent_posts( array('post_status' =?> 'publish') );
         foreach( $recent_posts as $recent ){
            echo '

      <li>
<a href="' . get_permalink($recent[" id="ID">' .   $recent["post_title"].'</a>
</li> ';
         }
      ?>

    </ul>

Fuente | Creating an Error 404 Page

¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo.

Categorías:Etiquetas:

Quizá también te interese leer...