En bedre tegneserieside, del 1: 404 not found
Jeg har lige gennemført et storstilet redesign af tegneseriesiden.dk og vil da gerne dele et par af de tricks jeg har fået fyret af i koden. Til at starte med vil jeg komme lidt ind på hvad jeg har gjort ved min 404.php, altså den fil, som håndterer når en url ikke er fundet på serveren.
Den fil, der fulgte med mit tema var ikke meget bevendt - den skrev “404 not found” i en level 2-heading og det var såmænd det:
<?php get_header(); ?> <div id="content" class="widecolumn"> <h2 class="center">Error 404 - Not Found</h2> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
Oh, i en centreret level 2-heading. Ikke noget at skrive hjem om, med andre ord.
Der var meget at tage fat på - jeg ville have et søgefelt, arkiver, tagcloud og så kom et par andre ting til hen ad vejen.
Til at starte med kom søgefeltet, arkiverne (via plugin’et Smarter Archives) og tagclouden (via Wp 2.3) - det var sådan set nemt nok:
<?php get_header() ?>
<div id="content" class="widecolumn">
<h2 class="center">Åh nej!</h2>
<p>Den side du bad om er her ikke.</p>
<p>Måske har den aldrig været her.<br />
Måske har den været her en gang, men har skiftet navn.<br />
Måske har den forladt os for aldrig at vende tilbage.</p>
<p>Det er altsammen meget godt, men hvad skal du så gøre nu?</p>
<p>En mulighed kunne være søgning:<br />
<?php include (TEMPLATEPATH . '/searchform.php'); ?></p>
<p>Ellers kunne du måske bruge arkivfunktionen eller tagcloud'en til noget:</p>
<h2>Arkiv for tegneseriesiden</h2>
<?php if (function_exists('wp_smart_archives')) {wp_smart_archives();} ?>
<h2>Tags</h2>
<?php wp_tag_cloud('smallest=8&largest=22'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Bedre. Jeg installerede så Alex Kings plugin Popularity Contest, som kan udregne hvilke indlæg der er de mest populære. Måske folk ledte efter et af de populære indlæg, når de ramte ved siden af? Koden er nem at inkludere, så de fem mest populære indlæg kom med på min 404:
<p>Du kunne også kigge på de 5 populæreste indlæg: <ul class="bullets"> <?php akpc_most_popular(5); ?> </ul></p>
Jeg syntes at jeg var færdig, da jeg faldt over denne artikel - søgeresultater inkluderet på 404, gættet ud fra den URL man har forsøgt at tilgå? Nice. Meget nice.
Jeg væltede noget mere kode ind i min 404, som endte med at se sådan ud:
<?php
header("HTTP/1.1 404 Not Found");
header ("Pragma: no-cache"); // HTTP 1.0
header ("Expires: Mon, 25 Jul 1995 05:00:00 GMT"); // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header ("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP 1.1
header ("Cache-Control: post-check=0, pre-check=0, false"); // HTTP 1.1
// echo "\n<!–\n"; print_r($_REQUEST); echo "\n–>\n";
// her pilles 404-urlen fra hinanden
$search_term = substr($_SERVER['REQUEST_URI'],1);
$search_term = urldecode(stripslashes($search_term));
$find = array ("'.html'", "'.+/'", "'[-/_]'") ;
$replace = " " ;
$search_term = trim(preg_replace ( $find , $replace , $search_term ));
$search_term_q = preg_replace('/ /', '%20', $search_term);
get_header() ?>
<div id="content" class="widecolumn">
<h2 class="center">Åh nej!</h2>
<p>Den side du bad om er her ikke.</p>
<p>Måske har den aldrig været her.<br />
Måske har den været her en gang, men har skiftet navn.<br />
Måske har den forladt os for aldrig at vende tilbage.</p>
<p>Det er altsammen meget godt, men hvad skal du så gøre nu?</p>
<p>En mulighed kunne være søgning:<br /><?php include (TEMPLATEPATH . '/searchform.php'); ?></p>
<?php /* fyr urlen af som søgning */
query_posts('showposts=5&s='. $search_term_q );
?>
<?php if ( have_posts() ) :
/* check om der er hits på søgetermet inden vi går videre */ ?>
<h2>Du har muligvis kigget efter</h2>
<ul class="bullets">
<?php /* start af the loop */
while ( have_posts() ) : the_post(); ?>
<li><strong><a href="<?php the_permalink() ?>" title="Permanent Link til <?php the_title(); ?>" rel="bookmark"><?php the_title() ?></a></strong><br /> <em>Skrevet d. <?php unset($previousday); printf(__('%1$s', 'mimbo'), the_date('', '', '', false), get_the_time()) ?> <?php printf(__('i %s', 'mimbo'), get_the_category_list(', ')) ?></em>
<?php the_excerpt(); ?></li>
<?php /* slut på the loop */
endwhile; ?>
</ul>
<?php /* slut på else og if */
else : endif; ?>
<p>Du kunne også kigge på de 5 populæreste indlæg:
<ul class="bullets">
<?php akpc_most_popular(5); ?>
</ul></p>
<p>Ellers kunne du måske bruge arkivfunktionen eller tagcloud'en til noget:</p>
<h2>Arkiv for tegneseriesiden</h2>
<?php if (function_exists('wp_smart_archives')) {wp_smart_archives();} ?>
<h2>Tags</h2>
<?php wp_tag_cloud('smallest=8&largest=22'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Jeg har også tilføjet nogle http-headers til filen, men jeg er ikke sikker på andet end at WordPress selv tilføjer dem. Men hellere at de er der end at de mangler…
Nu kan vi prøve det af - en nonsens-URL som http://tegneseriesiden.dk/mlfaslonsfo udløser ikke nogle søgeresultater, da “mlfaslonsfo” ikke findes i databasen (det må jeg så gøre noget ved!).
Hvis man rammer ved siden af med http://tegneseriesiden.dk/batman findes ordet “batman” i databasen og man får 5 forslag, endda med søgeordet præsenteret i the_excerpt via plugin’et Search Excerpt. Mums.
Jeg er sådan set færdig med min 404 nu, med mindre der er nogen der påpeger enten graverende fejl eller vilde forbedringsforslag.
Spørgsmål?
Stil dem, så skal jeg forsøge at svare - jeg er ikke noget kodegeni, men god til at samle bidder sammen og få dem til at virke, og kan som sådan svare ud fra den egenskab.
2 kommentarer
Ligesom dig var jeg også irriteret over 404.php, og takket være din gennemgang, fik jeg løst mit problem, så tak for det.
Men har du så en ide til, hvor jeg ændrer sidetitlen for 404 siderne?
Det ser ikke skide godt ud med “Nothing found for ……….”.
Håber du kan hjælpe.
Iøvrigt har du et problem her på siden. Det er ikke let at ramme “Indsend kommentar”-knappen
Det var godt at høre at der var nogen der kunne bruge artiklen til noget. Mht. sidetitlerne, så bruger jeg på tegneseriesiden conditional tags til at vise forskellige sidetitler alt efter hvad type side man har at gøre med.
F.eks. ser titel-afsnittet af min header.php pt. sådan ud:
Her tager jeg højde for en masse ting, der er specifikke for tegneseriesiden (forskellige titler for de tre kategorier vi bruger f.eks.), men sidetitlen for min fejlside ligger i is_404-udtrykket. Se om ikke du kan bruge det til noget.
Og “Indsend kommentar” ser ganske rigtig noget mærkelig ud … i Internet Explorer, som jeg ikke bruger. Det må jeg hellere kigge på ved lejlighed.
(så tror pokker da at der aldrig er nogen der kommenterer hvad jeg skriver …)
Skriv en kommentar