Etwas fürs Archiv (1):
Geordnetes Monatsarchiv

Monate und Jahre Der erste von zwei weitereren kleinen WordPress-Tips, diesmal für die Archivseite. Dorthin packt man ja gerne eine Übersicht über alle Beiträge nach Monaten und nach Kategorien, und in einigen Themes steckt so eine Funktionalität bereits drin, einige Plugins bieten ebenfalls diverse Funktionen.

Wie man solche Archive mit Bordmitteln, nämlich der Funtion wp_get_archives() und einer Theme-Template-Seite macht, hat etwa Perun im Januar beschrieben; für das Kategorienarchiv benutze ich diese auch. Für mein Monatsarchiv hab ich aber „natürlich“ eine eigene Funktion geschrieben, die mir eine schönere Darstellung nach Jahren gruppiert bietet – darum geht es in diesem Beitrag. In ein paar Tagen zeige ich euch dann den Code für die Schlagwort-Mehrfachauswahl, die ihr bereits auf der Archivseite findet.

Stellt sich nur generell die Frage, ob allzu viele Besucher diese Archiv-Funktionalität auch wirklich nutzen… aber egal, im Zweifelsfall betrachtet’s man einfach als ein bisschen Blog-Spielerei.^^

In diesem Fall hab ich den PHP-Code direkt in die Seite geschrieben (im HTML-Editor von WordPress) – weshalb auch das <?php...?>-Tag mittendrin steht –, da ich hier eh schon das Plugin Exec-PHP einsetze, das ebendies ermöglicht1. Alternativ kann man den Code natürlich auch anderweitig unterbringen, etwa über entsprechende Unterscheidungen im Theme oder komfortablerweise per Template – siehe Peruns Artikel.

Wie ihr auf dem Bild oben erkennen dürftet, sind hier Monate vor dem Blogbeginn und nach dem aktuellen Datum gar nicht dargestellt und Lücken der Regelmäßigkeit halber grau; zudem – was aber nur eine Stylingfrage ist – gibt’s keine unnötigen ansonsten listentypischen • Bullets und Einrückungen. Und in Klammern steht die Anzahl der Beiträge.

Das ist der Code dazu:

<style type="text/css">
div.yeararch { float: left; color:#777; margin-right: 2em; }
ul.montharch { list-style-type: none; padding-left: 0px; }
</style>

<?php global $wpdb;
$mnames = array (1=>'Januar', 2=>'Februar', 3=>'März', 4=>'April', 5=>'Mai', 6=>'Juni', 7=>'Juli', 8=>'August', 9=>'September', 10=>'Oktober', 11=>'November', 12=>'Dezember');
$started = false;
$years = $wpdb->get_results("SELECT YEAR(post_date) AS year, COUNT(*) AS count
FROM $wpdb->posts
WHERE post_type='post'
  AND post_status='publish'
GROUP BY year
ORDER BY year ASC");
foreach ($years as $y) {
  echo '<div class="yeararch"><h4><a href="/'.$y->year.'/">'.$y->year.'</a> <small>('.$y->count.')</small></h4><ul class="montharch">';
  $months = $wpdb->get_results("SELECT MONTH(post_date) AS month, COUNT(*) AS count
  FROM $wpdb->posts
  WHERE post_type='post'
    AND post_status='publish'
    AND YEAR(post_date)=$y->year
  GROUP BY month
  ORDER BY month ASC");
  $ms = array();
  foreach ($months as $m) { $ms[$m->month] = $m->count; }
  for ($i=1; $i<=12; $i++) {
    $m0 = sprintf('%02d',$i);
    $mname = $mnames[$i];
    if ($ms[$i]>0) {
      echo '<li><a href="/'.$y->year.'/'.$m0.'/">'.$mname.'</a> ('.$ms[$i].')</li>';
      $started = true;
    } else {
      if ($y->year<date('Y') || $i<=date('n')) {
        if (!$started) echo '<li>&nbsp;</li>'; else echo '<li>'.$mname.' (0)</li>';
      }
    }
  }
  echo "</ul></div>\n";
}
?>

<div style="clear:both;"></div>

Großes Hexenwerk ist der Code nicht: Nach der kleinen CSS-Definition (direkt auf der Seite, da ja nur hier benötigt) schaut der PHP-Code erst in der Datenbank nach, welche Jahre denn in Frage kommen – YEAR(post_date) AS year ... GROUP BY year – und nimmt auch die Beitragsanzahl – COUNT(*) AS count gleich mit.

Für jedes Jahr wird dann ein div-Container generiert, die dank des CSS am Anfang nebeneinander stehen – so viele wie halt auf die Seite passen, bei mir geht’s 2011 dann darunter weiter; ihr könnt ja mit den Abständen (margin-right) spielen. (Der div am Ende mit clear:both; sorgt dafür, dass nachfolgender Text darunter und nicht daneben landet.)

Dann gibt’s für jedes Jahr natürlich eine analoge Datenbank-Abfrage für die nach Monaten gruppierten Beiträge des jeweiligen Jahres, die dann nacheinander ausgegeben werden. Da diese Abfrage nur so viele Array-Einträge liefert, wie Monate benutzt wurden, sortiere ich sie ins Array $ms um, um in der Schleife alle Monate von 1 bis 12 durchlaufen und für leere Monate je nachdem, ob das Blog noch gar nicht begonnen wurde (!$started) oder ob es eine Lücke ist, eine Leerzeile bzw. eine nicht verlinkte Zeile mit der traurigen Null ausgeben zu können.

(Die Monatsnamen bekäme man an sich auch eleganter über PHP-Funktionen, aber irgendwie hatte ich da Probleme im Zusammenhang mit meiner Sprachumschaltung, deshalb die Lösung mit dem $mnames-Array.)

Bei den Links zu den Monatsarchivseiten geht der Code davon aus, dass sie dem Schema /2009/12/ folgen – wer ein anderes Schema mit pretty permalinks verwendet (kommt das denn vor?), muss sie entsprechend anpassen, ebenso wer die „unschöne“ Variante mit ? und Argumenten verwendet; das wäre dann ?m=200912 etc.

So, das war der erste Beitrag zum Archiv – wer Fragen, Anregungen, Verbesserungsvorschläge o.ä. hat, möge jetzt sprechen oder für immer schweigen… Wie erwähnt geht’s dann demnächst um die Mehrfachauswahl bei den Schlagwörtern, aber vielleicht schiebe ich auch noch die Einbindung von WP.com-Stats anstelle von WP-PostViews für die Ermittlung der beliebtesten Beiträge dazwischen, wie Robert angeregt hatte. Mal sehen.

 


  1. Nebenwirkung: Man muss den HTML-Editor von WordPress verwenden, weil der visuelle nicht mehr möglich ist. []

5 Kommentare
1 Trackback

  1. T

    Sehr schön. Das schaut richtig gut aus und nicht so aufgebläht. Ich habe mir den Tipp schon einmal gebookmarkt. Werde ich mal einbauen, wenn Zeit dazu ist.

    Viele Grüße
    Thomas

  2. jL

    Also ich schaue nicht oft ins Archiv von anderen Blogs, aber wenn, dann sollte das schon übersichtlich sein. Denn entweder suche ich was oder ich möchte einen Überblick über den Blog bekommen und da ist so eine praktische Übersicht wie bei dir sehr hilfreich.
    Momentan nutze ich WP-eigene Funktionen und einige Plugins, aber wenn ich durch das hier einiges einspare, wäre das sehr gut.

    Ah, und gerade wollte ich fragen, warum man denn den HTML-Editor für Exec-PHP nehmen muss, als mir auffiel, dass das der Gegeneditor zum visuellen ist (ich nenne die immer „normaler“ Editor und WYSIWYG ;) )

    • c

      Ja, du hast ein ziemlich umfangreiches Archiv – bzw. hattest es gestern noch, derzeit bricht’s unter „Beiträge nach Tags“ ab mit

      Fatal error: Call to undefined function taxonomy_exists() in […]wp-content/plugins/simple-tags/inc/client.php on line 1699

      Da hast du wohl eine WP-3.0-Version des Plugins eingespielt, denn taxonomy_exists gibt’s in 2.9.x noch nicht…

      So eine Monats-Grafik wie bei dir könnte ich auch noch nachbauen. :)

Schreib einen Kommentar

Alle Angaben sind freiwillig. Die E-Mail-Adresse wird nicht veröffentlicht oder weitergegeben.

  • Moderation: Wer zum ersten Mal kommentiert, dessen Kommentar muss manuell von mir freigeschaltet werden.
  • Benimm dich! Keine Beleidigungen, keine rechtswidrigen Inhalte u.s.w.! Sollte eigentlich selbst­verständlich sein, oder...?
  • Webseite: Nichts gegen Blogs mit Werbung, aber rein kommerzielle Links sind unerwünscht und werden gelöscht. Reine Spam-Kommentare natürlich auch.
  • E-Mail-Benachrichtigung bei neuen Kommentaren: Diese Funktion musst du über eine beim ersten Mal verschickte Bestätigungs-Mail freischalten. Diese Benachrichtigungen können mit dem auch in jeder Mail enthaltenen Link auch wieder deaktiviert werden.
  • Twitter: Wenn du einen Twitter-Account hast, kannst du im entsprechenden Feld deinen Twitter-Namen eingeben (egal ob mit oder ohne dem @), der dann bei allen (auch älteren) Kommentaren, die dieselbe E-Mail-Adresse enthalten, angezeigt wird. (Heißt auch: das E-Mail-Adressfeld muss auch ausgefüllt sein.)
  • Erlaubte HTML-Tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <sub> <sup> <big> <small> <u>