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
| <td>
<div class="php codecolorer">
<span class="co1">// Archive Seite</span><br /> <span class="kw2">function</span> my_archive<span class="br0">(</span><span class="br0">)</span><br /> <span class="br0">{</span><br /> <span class="co1">// set locale</span><br /> [<span class="kw3">setlocale</span>](http://www.php.net/setlocale)<span class="br0">(</span>LC_ALL<span class="sy0">,</span><span class="st_h">'de_DE.UTF-8'</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="kw2">global</span> <span class="re0">$wpdb</span><span class="sy0">;</span><br /> <span class="re0">$now</span> <span class="sy0">=</span> [<span class="kw3">gmdate</span>](http://www.php.net/gmdate)<span class="br0">(</span><span class="st0">"Y-m-d H:i:s"</span><span class="sy0">,</span><span class="br0">(</span>[<span class="kw3">time</span>](http://www.php.net/time)<span class="br0">(</span><span class="br0">)</span><span class="sy0">+</span><span class="br0">(</span><span class="br0">(</span>get_settings<span class="br0">(</span><span class="st_h">'gmt_offset'</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">*</span><span class="nu0">3600</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// get the current GMT date</span><br /> <br /> <span class="re0">$allPosts</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-></span><span class="me1">get_results</span><span class="br0">(</span><span class="st0">"<br /> SELECT ID AS id, post_title AS title, post_name AS name, UNIX_TIMESTAMP(post_date) AS date<br /> FROM <span class="es4">$wpdb->posts</span> <br /> WHERE post_type = 'post' <br /> AND post_status = 'publish' <br /> ORDER BY post_date DESC"</span><span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="re0">$lastdate</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span><br /> <br /> <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$allPosts</span> <span class="kw1">as</span> <span class="re0">$post</span><span class="br0">)</span> <span class="br0">{</span><br /> <br /> <span class="kw1">if</span><span class="br0">(</span><span class="re0">$lastdate</span> <span class="sy0">!=</span> [<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">(</span><span class="st_h">'Ym'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-></span>[<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">)</span> <span class="br0">)</span> <span class="br0">{</span><br /> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span>[<span class="kw3">empty</span>](http://www.php.net/empty)<span class="br0">(</span><span class="re0">$lastdate</span><span class="br0">)</span><span class="br0">)</span> <span class="re0">$archive</span> <span class="sy0">.=</span> <span class="st_h">''</span><span class="sy0">;</span><br /> <span class="re0">$archive</span> <span class="sy0">.=</span> <span class="st_h">'<h2>[.</span> get_month_link<span class="br0">(</span><a href="http://www.php.net/date"><span class="kw3">date</span>]('</span> <span class=)<span class="br0">(</span><span class="st_h">'Y'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-></span>[<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">)</span><span class="sy0">,</span> [<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">(</span><span class="st_h">'m'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-></span>[<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">)</span><span class="br0">)</span> <span class="sy0">.</span> <span class="st_h">'">'</span> <span class="sy0">.</span> [<span class="kw3">strftime</span>](http://www.php.net/strftime)<span class="br0">(</span><span class="st_h">'%B %Y'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-></span>[<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">)</span> <span class="sy0">.</span> <span class="st_h">'</a></h2>'</span><span class="sy0">;</span><br /> <span class="re0">$archive</span> <span class="sy0">.=</span> <span class="st_h">'<ul style="list-style: none;">'</span><span class="sy0">;</span><br /> <br /> <span class="re0">$lastdate</span> <span class="sy0">=</span> [<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">(</span><span class="st_h">'Ym'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-></span>[<span class="kw3">date</span>](http://www.php.net/date)<span class="br0">)</span><span class="sy0">;</span><br /> <span class="br0">}</span><br /> <br /> <span class="re0">$archive</span> <span class="sy0">.=</span> <span class="st_h">'<li>[.</span> get_permalink<span class="br0">(</span><span class="re0">$post</span><span class="sy0">-></span><span class="me1">id</span><span class="br0">)</span> <span class="sy0">.</span> <span class="st_h">'">'</span> <span class="sy0">.</span> <span class="re0">$post</span><span class="sy0">-></span><span class="me1">title</span> <span class="sy0">.</span> <span class="st_h">']('</span> <span class=)</li>'</span><span class="sy0">;</span><br /> <br /> <span class="br0">}</span><br /> <span class="re0">$archive</span> <span class="sy0">.=</span> <span class="st_h">'</ul>'</span><span class="sy0">;</span><br /> <br /> <span class="re0">$my_post</span> <span class="sy0">=</span> [<span class="kw3">array</span>](http://www.php.net/array)<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span><br /> <span class="re0">$my_post</span><span class="br0">[</span><span class="st_h">'ID'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="nu0">171</span><span class="sy0">;</span> <br /> <span class="re0">$my_post</span><span class="br0">[</span><span class="st_h">'post_content'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$archive</span><span class="sy0">;</span><br /> <br /> <span class="co1">// Update the post into the database</span><br /> wp_update_post<span class="br0">(</span> <span class="re0">$my_post</span> <span class="br0">)</span><span class="sy0">;</span><br /> <br /> <span class="br0">}</span><br /> add_action<span class="br0">(</span><span class="st_h">'publish_post'</span><span class="sy0">,</span> <span class="st_h">'my_archive'</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// generate archives after a new post</span>
</div>
</td>
</tr>
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
| <td>
<div class="php codecolorer">
<span class="kw2"><?php</span> <span class="kw1">if</span> <span class="br0">(</span>have_posts<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">:</span> <span class="kw1">while</span> <span class="br0">(</span>have_posts<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">:</span> the_post<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?></span><br /> <span class="kw2"><?php</span> the_content<span class="br0">(</span><span class="st_h">'<p class="serif">Weiterlesen »'</span><span class="br0">)</span><span class="sy0">;</span> <span class="sy1">?></span><br /> <span class="kw2"><?php</span> <span class="kw1">endwhile</span><span class="sy0">;</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?></span>
</div>
</td>
</tr>
Damit das Archiv angelegt wird, muss einmal ein Beitrag geschrieben werden.