toscho.design

WordPress: Datum der letzten Änderung ausgeben

Manchmal stolpere ich noch über Beiträge aus der Zeit, als Usability noch keinen Wert hatte: Ich erkenne sie daran, daß ihnen das Publikationsdatum fehlt. Heute genügt selbst das oft nicht: Wer über Prozesse schreibt, sollte auch angeben, wie aktuell die Informationen sind und wann der Beitrag zuletzt geändert wurde.

Praktischerweise speichert WordPress dieses Datum separat in der Posts-Tabelle, und es gibt auch eine Funktion dafür: get_post_modified_time(). Jetzt fehlt uns nur noch ein vernünftiges Kriterium dafür, ab wann wir diese Information ausgeben wollen. Kleine Korrekturen noch vom selben Tag zähle ich einfach zum normalen Schreibprozess, die muß ich nicht angeben. Alles danach hingegen schon. Dieser Wert von 24 Stunden hängt natürlich sehr von der jeweiligen Website ab. Bei Heise.de etwa wäre er zu lang, bei anderen Seiten zu kurz. Deshalb passe das folgende Beipsiel an deine Bedürfnisse an, kopiere es nicht einfach in die functions.php deines Themes.

/**
 * Date of last modification if at least one day later than the post creation date.
 *
 * @param string $template Parsed with sprintf(). Must contain a '%s'.
 * @return string|void
 */
function t5_post_last_mode( $template )
{
	// UINX time stamps in seconds:
	$made    = get_the_date( 'U' );
	$changed = get_post_modified_time( 'U' );

	// 86400 seconds == 1 day.
	if ( ( $changed - $made ) > 86400 )
	{
		// readable formatted date
		$human_last_mod = get_post_modified_time( 
			get_option( 'date_format' ),
			FALSE, // GMT
			NULL,  // Post
			TRUE   // translate
		);
		return sprintf( $template, $human_last_mod );
	}
}

Im Theme benutze die Funktion beispielsweise so:

print t5_post_last_mode( __( ' · Last modified: %s', 't5_theme' ) );

Das %s wird dann von der Funktion durch das jeweilige Datum ersetzt.

5 Kommentare

  1. Alex am 08.08.2012 · 00:16

    Schönes Snippet, hab ich gleich mal eingebaut! Da ich mein Theme auf Deutsch benutze, hab ich den Code an einer Stelle modifiziert, damit der Monat im Datum übersetzt ausgegeben wird:

    // readable formatted date
    		$human_last_mod = get_post_modified_time( 
    			get_option( 'date_format' ), false, null, true 
    		);
    

    Hier ist der letzte Parameter von get_post_modified_time() für die Übersetzungsoption zuständig: true = übersetze, false = übersetze nicht.

  2. Thomas Scholz am 08.08.2012 · 00:30

    @Alex: Ah, danke, guter Hinweis! Habe ich gleich übernommen.

  3. Ralf Albert am 08.08.2012 · 02:26

    Mit strtotime() kann man noch etwas mehr readability rein bringen und der Funktion einen weiteren von Menschen verständlichen Parameter verpassen ( https://gist.github.com/3290861 )

    '+1 hour' bedeutet bei PHP allerdings mindestens 60 Minuten und 1 Sekunde. Ist der Timestamp des Posts '12:45:30', greift die Funktion erst bei '13:45:31'

  4. Thomas Scholz am 08.08.2012 · 02:56

    @Ralf Albert: Ich hatte im ersten Ansatz mal einen Parameter für den Zeitabstand in der Funktion. Allerdings mit Sekunden, damit man nicht erst die Syntax für strtotime() lernen muß.

    Ich habe das wieder entfernt, weil ich einfach nie die Situation hatte, daß ich in einem Theme unterschiedliche Zeitabstände gebraucht hätte. In einer Bibliothek wäre das sicher richtig, in einem Plugin … vielleicht. In einem öffentlichen Theme könnte man die 86400 mit apply_filters() änderbar machen, damit Childthemes ein bißchen mehr Flexibilität bekommen.

    Mal sehen, eventuell gebe ich das entstehende T5-Theme frei, dann werde ich das sicher so handhaben.

  5. Ralf Albert am 08.08.2012 · 05:22

    Normalerweise hätte ich den Parameter $time_diff so ausgelegt, dass man einen String (strtotime) oder Integer (Sekunden) angeben kann bzw. der komplette Parameter optional ist.
    Für jemanden der sich sein Theme bzw. functions.php per Copy&Paste zusammenklickt ist die strtotime-Syntax ggf. leichter zu verstehen. Aus Performance-Sicht sind Sekunden wahrscheinlich die bessere Wahl.

    Nützlich könnte der Parameter sein wenn man die Funktion in unterschiedlichen Kategorien verwendet. Zum Beispiel wenn in der Kategorie "News" Änderungen auch in kurzen Abständen gekennzeichnet werden und in der Kategorie "Kolumne" die Zeitabstände größer sein sollen.
    Das geht sicherlich auch mit apply_filters(), die direkte Parameterübergabe dürfte aber deutlich schlanker sein.