Autor

Alejandro Alcalde

Graduado en Ingeniería Informática en la ETSIIT, Granada.

Más artículos de Alejandro Alcalde

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

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:



<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