Als ich im Januar 2008 von dem Blog-System Sunlog auf WordPress umstieg, gefiel mir die Archive-Seite, die WordPress mitlieferte, überhaupt nicht. Mit dem Plugin Smart Archive von Justin Blaton kam ich aber ungefähr zu dem zurück, was ich vorher hatte.
Was mir aber nie wirklich passte war, dass bei jedem Aufruf der Archiv-Seite weit über 600 Datenbankabfragen gemacht wurden. 50 Datenbankabfragen (auch Queries genannt) durch die sehr ineffektive Programmierung des Plugin. Alle weiteren kommen durch einen zwingenden Aufruf der WordPress-Funktion get_permalink().
Mir fiel keine andere Lösung ein, als das alles zu cachen. Darum habe ich auch mir auch etwas zusammenprogammiert, was jeder gerne auch nutzen kann, dem es gefällt. Mir ist erst im nachhinein aufgefallen, dass die neue Version von Smart Archive auch Caching behinhaltet. Ich finde meine Version aber smarter 😉 . Smart Archive cached in einer eigenen Textdatei. Bei mir wird nach jedem erstellen eines neuen Artikels das Archiv neu erstellt und als Post direkt in WordPress gespeichert.
Als erstes muss folgender Code in die Datei function.php in eurem Template kopiert werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // Archive Seite function my_archive() { // set locale setlocale(LC_ALL,'de_DE.UTF-8'); global $wpdb; $now = gmdate("Y-m-d H:i:s",(time()+((get_settings('gmt_offset'))*3600))); // get the current GMT date $allPosts = $wpdb->get_results(" SELECT ID AS id, post_title AS title, post_name AS name, UNIX_TIMESTAMP(post_date) AS date FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC"); $lastdate = ''; foreach ($allPosts as $post) { if($lastdate != date('Ym', $post->date) ) { if(!empty($lastdate)) $archive .= ''; $archive .= '<h2><a href="' . get_month_link(date('Y', $post->date), date('m', $post->date)) . '">' . strftime('%B %Y', $post->date) . '</a></h2>'; $archive .= '<ul style="list-style: none;">'; $lastdate = date('Ym', $post->date); } $archive .= '<li><a href="' . get_permalink($post->id) . '">' . $post->title . '</a></li>'; } $archive .= '</ul>'; $my_post = array(); $my_post['ID'] = 171; $my_post['post_content'] = $archive; // Update the post into the database wp_update_post( $my_post ); } add_action('publish_post', 'my_archive'); // generate archives after a new post |
In Zeile 41 muss die Zeile muss die ID (hier 171) durch die ID des Archiv-Posts ersetzt werden. Am einfachsten ist dies herauszufinden, wenn man im Admin-Menu die Archiv Seite editiert. In der Adress-Zeile findest man die ID hinter post= .
Nun muss das Archiv Template in der Datei archives.php angepasst werden. Hierfür wird alles um wp_get_archives() und wp_list_categories() durch folgendes ersetzt:
1 2 3 | <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <?php the_content('<p class="serif">Weiterlesen »'); ?> <?php endwhile; endif; ?> |
Damit das Archiv angelegt wird, muss einmal ein Beitrag geschrieben werden.