Wordpress: Aufzählung der Kategorien und Tags im Satz

Die Template-Tags the_category() und the_tags() geben die Kateorien und Stichworte eines Artikels wahlweise als eine ungeordnete Liste, oder durch einen Seperator getrennt aus. Für eine lose Aufzählung wäre ein naheliegendes Trennzeichen das Komma; der Funktionsaufruf dazu schaut so aus: the_tags(', ').  Das Ergebnis wäre eine Aufzählung aller Stichworte, die durch ein Komma getrennt sind.

Für diesen Beitrag würde das so aussehen: , . Kurz und knackig, aber ein ordentlicher Satz lässt sich daraus nicht formulieren, dazu fehlt das „und“ zwischen den beiden (letzten) Stichworten.

Um solche Aufzählungen in einen vernünftigen Satz einbinden zu können habe ich mir folgenden Code-Schnipsel in die functions.php des Themes geschrieben:

/**
 *  Ersetzt das letzte Komma durch ein »und« 
 * 
 * @param string $tags
 * @return string
 */
function mytheme_tag_list( $tags ) {

	# wenn mehr als ein link vorhanden ist
	if ( substr_count( $tags, '<a href="' ) > 1 ) {
		$pattern = '#</a>\s*,\s*<a ([^>]*)>([^<]*)</a>\s?$#';
		$replace = '</a> und <a $1>$2</a>';
		$tags = preg_replace($pattern,$replace,$tags);
	}

	return $tags;
}
add_filter( 'the_category', 'mytheme_tag_list');
add_filter( 'the_tags', 'mytheme_tag_list' );

In dieser Form greift der reguläre Ausdruck nur Auflistungen heraus, die durch ein Komma (und evtl. Whitespace) getrennt sind. Aufzählungen ohne oder mit anderen Trennzeichen bleiben unberührt.

Nun kann ich formulieren, dass dieser Beitrag die Themen und behandelt.

Kommentare

  1. 01) 02.03.2010
    Francesco

    Gerade heute hab ich mir den Kopf zerbrochen, wie ich das bewerkstelligen könnte. Diese einfache Lösung passt wie die Faust auf's Auge – vielen Dank!

  2. 02) 04.03.2010
    Thomas Scholz

    Ich gehe einen etwas anderen Weg, der auch Plural und Singular berücksichtigt:

    function nice_cats(
    	$singular='Thema', $plural='Themen', $sep=', ', $last=' und ')
    {
    	$a  = explode('#', get_the_category_list('#'));
    	$n  = count($a);
    	$t  = array_pop($a);
    
    	/* Ja, das *ist* häßlich. */
    	return ( 1 < $n ? $plural : $singular )
    		. ': ' . implode($sep, $a) . ( 0 < $n-1 ? $last : '' ) . $t;
    }
  3. 03) 04.03.2010
    David

    Das geht natürlich auch. Ich hab die Plural behandlung bewusst außen vor gelassen um mehr flexibilität im Satzbau zu lassen.

    P.S. Ich habe mir erlaubt, die Attribute 'line' und 'escape' aus dem <pre> zu nehmen, sonst erkennt mein Plugin das nicht als Code.

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>