Da mein kleines Weblog jetzt auch schon fast 22 Jahre alt ist, wollte ich gerne einen Counter haben, der Besuchern anzeigt, wie lange diese Seite hier schon online ist.
Mit PHP ist das ja schnell programmiert. Ich habe allerdings hierbei kein neues Plugin geschrieben, sondern WPCode genutzt, das ich hier eh schon installiert habe. Dort kann ich den Programmcode direkt einfügen und laufen lassen.
Mit nur einem Shortcode

Dargestellt werden soll nun folender Satz: Online seit $ Jahren, $ Monaten und $ Tagen
. Diesen wiedrum möchte ich via WordPress-Shortcode einbinden. Hierzu habe ich die Funktion wp_online_since
geschieben:
// Gibt einen formatierten Text zur Online-Dauer des Blogs aus (z. B.
// "Online seit 3 Jahren, 2 Monaten und 5 Tagen").
// WordPress-Shortcode:
// - [online_since]
function wp_online_since() {
// Startdatum des Blogs
$start_date = new DateTime('2003-09-03');
// Aktuelles Datum
$current_date = new DateTime();
// Berechne Differenz zwischen Startdatum und heute
$interval = $start_date->diff($current_date);
// Helferfunktion für Singular/Plural-Ausgabe
$plural = function($count, $singular, $plural) {
return $count . ' ' . ($count === 1 ? $singular : $plural);
};
// Liste der Zeitabschnitte, die ausgegeben werden sollen
$parts = [];
// Füge Jahre, Monate, Tage nur hinzu, wenn der Wert größer als 0 ist
if ($interval->y > 0) $parts[] = $plural($interval->y, 'Jahr', 'Jahren');
if ($interval->m > 0) $parts[] = $plural($interval->m, 'Monat', 'Monaten');
if ($interval->d > 0) $parts[] = $plural($interval->d, 'Tag', 'Tagen');
// Falls alle Werte 0 sind (z. B. am ersten Tag)
if (empty($parts)) {
return 'Online seit heute';
}
// Baue den finalen Satz
$last = array_pop($parts);
$text = count($parts) ? implode(', ', $parts) . ' und ' . $last : $last;
return 'Online seit ' . $text;
}
// Registriere den Shortcode "[online_since]"
add_shortcode('online_since', 'wp_online_since');
Code-Sprache: PHP (php)
Die Variable $start_date
legt das Startdatum fest, $current_date
erzeugt das Datum zum Zeitpunkt der Ausführung und $interval
berechnet via diff()
die Zeitspanne zwischen Startdatum und aktuellem Datum als DateInterval
-Objekt. Die Methode $start_date->diff($current_date)
nutzt die PHP-Klasse DateTime::diff()
und rechnet kalendergenau, berücksichtigt also z.B. auch Schaltjahre.
Mithilfe einer anonymen Helferfunktion und drei Parametern müssen wir nun noch unterscheiden, ob wir ein Wort im Singular oder im Plural verwenden. Da wir »seit« im Satz stehen haben, initialisieren wir im Array $parts
für den Plural natürlich den Dativ. Sollte das Array $parts
leer sein, dann lassen wir Online seit heute
ausgeben.
Nachdem der Satz in sauberer Grammatik zusammengesetzt worden ist, wird abschließend noch mit add_shortcode
der Shortcode online_since
registriert. Dieser kann nun nach Belieben in Beiträgen oder Seiten eingefügt werden. Nutzt man ein aktuelles Theme und den »WordPress-Editor«, so lässt sich der Shortcode auch problemlos in einen Shortcode-Block schreiben.
Das Ergebnis sieht dann so aus: »Online seit 21 Jahren, 11 Monaten und 15 Tagen«.
Mit eigenen Shortcodes für Jahr, Monat und Tag

Der Code hat in dieser Form allerdings einen kleinen Nachteil: er ist, jedenfalls was sein Ausgabe anbelangt, doch sehr statisch. Vielleicht möchte man ja nicht genau diesen einen Satz ausgeben, sondern – etwas flexibler – die Daten aufgeteilter bekommen.
Praktischer wäre es in solch einem Fall also, wenn wir für die Daten Jahre, Monate und Tage eigene Shortcodes hätten. Diese sollen, da wir auch hier noch davon sprechen wollen, »seit« wann das Weblog online ist, natürlich ebenfalls in korrekter Grammatik dargestellt werden. Ich hatte zuerst darüber nachgedacht, einfach nur die nackten Zahlen auszugeben. Aber dann hat man erneut grammatikalische Probleme, denn der um die nackten Zahlen geschriebene Satz bleibt gleich, wohingegen die Zeit selbstverständlich vergeht. 😉
Wie dem auch sei. Das um diese Funktionalität erweiterte Programmbeispiel könnte jedenfalls so ausschauen:
// Gibt einen formatierten Text zur Online-Dauer des Blogs aus (z. B.
// "Online seit 3 Jahren, 2 Monaten und 5 Tagen").
// WordPress-Shortcodes:
// - [online_since]
// - [online_since_days]
// - [online_since_months]
// - [online_since_years]
function wp_online_since_diff() {
// Caching der Berechnung für Wiederverwendung
static $interval = null;
if ($interval === null) {
// Startdatum des Blogs
$start_date = new DateTime('2003-09-03');
// Aktuelles Datum
$current_date = new DateTime();
// Berechne Differenz zwischen Startdatum und heute
$interval = $start_date->diff($current_date);
}
return $interval;
}
// Singular und Plural
function wp_pluralize($count, $singular, $plural) {
return $count . ' ' . ($count === 1 ? $singular : $plural);
}
// Funktion für den vollständigen Satz
function wp_online_since() {
// Hole berechneten Unterschied
$interval = wp_online_since_diff();
// Liste der Zeitabschnitte, die ausgegeben werden sollen
$parts = [];
// Füge Jahre, Monate, Tage nur hinzu, wenn der Wert größer als 0 ist
if ($interval->y > 0) {
$parts[] = wp_pluralize($interval->y, 'Jahr', 'Jahren');
}
if ($interval->m > 0) {
$parts[] = wp_pluralize($interval->m, 'Monat', 'Monaten');
}
if ($interval->d > 0) {
$parts[] = wp_pluralize($interval->d, 'Tag', 'Tagen');
}
// Falls alle Werte 0 sind (z. B. am ersten Tag)
if (empty($parts)) {
return 'Online seit heute';
}
// Baue den finalen Satz
$last = array_pop($parts);
$text = count($parts) ? implode(', ', $parts) . ' und ' . $last : $last;
return 'Online seit ' . $text;
}
// Nur die Jahre
function wp_online_since_years() {
return wp_pluralize(wp_online_since_diff()->y, 'Jahr', 'Jahren');
}
// Nur die Monate
function wp_online_since_months() {
return wp_pluralize(wp_online_since_diff()->m, 'Monat', 'Monaten');
}
// Nur die Tage
function wp_online_since_days() {
return wp_pluralize(wp_online_since_diff()->d, 'Tag', 'Tagen');
}
// Registriere die Shortcodes
add_shortcode('online_since', 'wp_online_since');
add_shortcode('online_since_days', 'wp_online_since_days');
add_shortcode('online_since_months', 'wp_online_since_months');
add_shortcode('online_since_years', 'wp_online_since_years');
Code-Sprache: PHP (php)
Während man im ersten Code-Beispiel mit lediglich einer Funktion auskommt, wird die Berechnung im zweiten Beispiel in die Funktion wp_online_since_diff
ausgelagert.
Das zwischengespeicherte Ergebnis wird anschließend von der bereits aus dem ersten Code-Beispiel bekannten Funktion wp_online_since
sowie den neuen Funktionen wp_online_since_years
(Jahre), wp_online_since_months
(Monate) sowie wp_online_since_days
(Tage) abgerufen und weiter verarbeitet.
Neben dem Shortcode [online_since]
für den statischen Satz registriert dieses Beispiel drei neue Shortcodes: [online_since_years]
, [online_since_months]
und [online_since_days]
. Damit kann man nun wunderhübsch von der Struktur des statischen Satzes abweichen: »Diese kleine Webseite werkelt seit 21 Jahren, 11 Monaten sowie 15 Tagen«.
Freilich hat man nun das kosmetische Problem potentieller Nullwerte. Aber irgendwas is‘ ja immer. Da ich allerdings eh nur den Shortcode [online_since]
nutze, ist mir das an dieser Stelle auch egal. Darüber hinaus: die Nullwerte vergehen ja auch wieder. 😉