toscho.design

WordPress: Umbruch im Titel steuern

Überschriften sind der erste Teil des Textes, der gelesen wird. Manchmal auch der letzte. Deshalb wollen wir sie möglichst gut aussehen lassen.

Damit das letzte Wort einer Überschrift nicht in einer separaten Zeile verhungert, wenn jemand mit schmalem Browserfenster oder großer Schrift daherkommt, habe ich mir eine kleine Hilfsfunktion in meine Themes gebaut:

Update: Martin Gandrath hat meine Version erheblich verkürzt.

if ( ! function_exists('prevent_widows') )
{
    function prevent_widows($str)
    {
        $pos = strrpos($str, ' ');
        if ( $pos === false || strlen($str) - $pos > 11)
        { // Nothing to do.
            return $str;
        }
        /* U+00A0 NO-BREAK SPACE == C2 A0 in UTF-8
         * @see http://www.fileformat.info/info/unicode/char/00a0/index.htm
         */
        return substr_replace($str, "\xC2\xA0", $pos, 1);
    }
}
add_filter('the_title', 'prevent_widows');

ScreenshotWenn also das letzte Wort kürzer als 11 Zeichen ist, dann wird es mit einem geschützten Leerzeichen an das vorletzte gebunden. Hier schlägt es demnach zu, bei den Grundlagen der Zeichenkodierung aber nicht.

In Ermangelung eines besseren Ausdrucks nenne ich solche Worte hier Widow (zu Deutsch: Witwe, früher Hurenkind). Da kein Seitenumbruch in der Überschrift entsteht, stimmt das eigentlich nicht. Egal.

Ich hätte das vermutlich nie gebloggt, wenn nicht Chris Coyier neulich danach gefragt hätte. Offenbar ist diese Lösung doch nicht so selbstverständlich, wie ich dachte.

Shaun Inman hat ein Plugin namens »Widon’t« geschrieben, das ungefähr dasselbe tut – mit ein paar Unterschieden:

  • Es arbeitet mit einem regulären Ausdruck.
  • Es prüft nicht die Länge des letzten Wortes – was im Englischen ja meistens kein Problem ist.
  • Es erfaßt auch andere HTML-Elemente, wenn man die entsprechende Option einstellt.
  • Es geht ein bißchen sorglos mit dem POST-Request für die Optionen um. Nichts Dramatisches, aber es gibt bessere Wege …
    Ich habe Shaun darüber informiert; dieses Problem wird also vermutlich in der nächsten Version behoben sein.

Verwandte Artikel

8 Kommentare

  1. Martin Grandrath am 11.10.2009 · 22:38

    Den String in einen Array auseinanderzunehmen und wieder zusammenzusetzen ist nicht wirklich notwendig. Das Ersetzen kann man auch allein mit String-Funktionen lösen, was vermutlich performanter ist:

    $pos = strrpos( $str, ' ' );

    if ( $pos === false || strlen( $str ) - $pos > 11)
    {// Nothing to do.
    return $str;
    }

    return substr_replace( $str, ' ', $pos, 1 );

  2. Thomas Scholz am 12.10.2009 · 00:49

    @Martin Grandrath: Stimmt, da habe ich wieder zu umständlich gedacht. Ich habe deine Version jetzt übernommen.

  3. Claudia am 28.10.2009 · 12:41

    Interessant! Als Nicht-Programmiererin hab ich gleich mal ausprobiert, ob es auf die einfache Art auch geht: einfach zwischen den Worten ein HTML-Leerzeichen   einsetzen - und ja, das klappt!

    Hier das Testbeispiel.

    (Blöd: weder mit Block-Code noch mit Inline-Code gelingt es mir, den Code für ein schlichtes HTML-geschütztes Leerzeichen hier sichtbar zu machen! Deshalb hier dieser Link zur Erläuterung in SELFHTML.)

  4. Thomas Scholz am 28.10.2009 · 14:18

    @Claudia: Das manuelle Setzen geschützter Leerzeichen   finde ich auch besser. Leider vergißt man das gerne mal. Wenn ich Ellipsen (…) oder Gedankenstriche (–) schreibe, denke ich daran; beim Erstellen des Titels eher nicht.

    Mein Kommentarplugin maskiert nicht doppelt; das muß man selbst machen. Also:  . Hm … das sollte ich vielleicht mal irgendwo hinschreiben.

  5. Sportytrader am 30.10.2009 · 10:04

    Hey, ich finds gut, dass du das gebloggt hast, denn für mich war das nicht selbstverständlich.Hab mich immer geärgert, wenn die Überschrift in die nächste Zeile ging. Danke für den Tipp!

  6. Michael am 02.12.2010 · 15:07

    @Sportytrader: Stimme voll zu. Sehr nützlich der Tipp. Ohne Programmierkenntnisse und Plugins wäre ich da nie darauf gekommen. Und so sieht es wirklich viel schöner im Blog aus - mit aufgeräumten Überschriften.

  7. Martin Heinze am 17.02.2011 · 15:35

    In welche Datei von meinem Theme muss ich das einbauen? In die functions.php oder page.php/single.php?

  8. Thomas Scholz am 17.02.2011 · 16:24

    @Martin Heinze: Pack es in die functions.php. Vielleicht mache ich irgendwann mal ein Plugin daraus.