Wordpress: Kommentare nummerieren (v.2.7+)

Anmerkung: Klaus hat mich darauf hingewiesen, dass dieser Artikel in der ersten Fassung etwas zu kurz und zu abstrakt geraten ist und dadurch zu unverständlich ist. Aus diesem Grund habe ich diesen Artikel noch einmal überarbeitet um die einzelnen Schritte nachvollziehbarer zu machen.

Worum es geht

Dieses kurze Tutorial soll zeigen, wie man in Wordpress die Kommentare fortlaufend nummeriert. Der Semantik wäre schon genüge getan, wenn man jeden einzelnen Kommentar als Punkt einer nummerierten Liste (<ol>) auszeichnet. Manchmal will man aber die Nummern Ziffern mit in die Gestaltung einbeziehen und mit CSS aufhübschen. Wie man die Nummer für jeden Kommentar als Zahl in den Quelltext bekommt, soll hier gezeigt werden.

Die Idee

Der HTML-Code für die Kommentare wird erzeugt, in dem die Datensätze in einer Schleife durchlaufen werden und für jeden Durchlauf der entsprechende Kommentar sein HTML-Kleid bekommt. Für unser Vorhaben reicht es also, vor dem Schleifenaufruf eine Zählvariable zu definieren (ich nenne sie hier mal $comment_counter). Innerhalb der Schleife setzen wir einen Befehl, der den Variablenwert um den Wert 1 erhöht.
Vor der Version 2.7 musste man diese Schleife noch von Hand schreiben und die Zählvariable konnte man bequem mit unterbringen. Das Kommentartemplate (comments.php) sah bis 2.7 schematisch etwa so aus:

/**  
* in der comments.php
*/
# Unsere Zählvariable
$comment_counter = 1;

# der Kommentar-Loop
foreach ( $comments as $comment ) : ?>

	<li id="comment-<?php comment_ID(); ?>">
	<cite>
		<?php 
		# Avater, Autor und Datum
		if ( function_exists( 'get_avatar' ) ) echo get_avatar();
		comment_author_link(); ?>
		–
		<?php comment_date(); ?> 
		um
		<a href="#comment-<?php comment_ID(); ?>">
			<?php comment_time(); ?>
		</a>
	</cite>
        <?php edit_comment_link(); ?>
        
	<?php 
	# hier kommt die Nummer
	echo $comment_counter; ?>

	<?php comment_text(); ?>
	<?php
	# zum Schluss setzen wir die Zählvariable noch eins hoch:
	$comment_counter++; ?>
	</li>
	<?php
endforeach; ?>

Soweit, so gut.

Umsetzung seit Version 2.7

Seit Version 2.7 muss man die Schleife nicht mehr von Hand starten, sondern hat dafür die Funktion wp_list_comments() zur Verfügung. Diese Funktion organisiert den Schleifendurchlauf automatisch und erzeugt gleichzeitig das HTML, auf welches man geringfügig Einfluss nehmen kann, in dem man der Funktion bestimmte Parameter übergibt. Eine Nummerierung der Kommentare ist leider nicht vorgesehen.

Um das erzeugte HTML komplett selbst zu bestimmen (und somit die Kommentarnummer einzufügen), akzeptiert wp_list_comments() eine sogenannte Callback-Funktion, die man selbst schreiben muss und in der man die HTML-Maske für die einzelnen Kommentare bestimmt. Eine solche Funktion, man könnte sie z.B. mytheme_comment() nennen, schreiben wir in die functions.php. Der Name dieser Funktion kann beliebig gewählt werden, allerdings muss sie dem folgendem Schema genügen, um die Funktionalität zu gewährleisten:

/**
 * functions.php
 */
function mytheme_comment( $comment, $args, $depth ) {

	$GLOBALS['comment'] = $comment; 
	# Ab folgt die Gestaltung des einzelnen Kommentars
	?>
	<li> id="comment-< ?php comment_ID() ?>">
	<h3 class="comment-author vcard">
		<cite class="fn">< ?php comment_author_link();?></cite>
	</h3>
	<div class="comment-meta">
		Geschrieben am
		<?php comment_date() ?>
		um 
		<?php comment_time() ?>
	</div>
        <?php 
	if ( '0' == $comment->comment_approved ) : ?>
		<p>Dein Kommentar muss erst durch den Administrator freigeschaltet werden</p>
		<?php 
	endif ?>
	<div class="comment-content">< ?php comment_text() ?></div>
	< ?php
	/**
	 *   Das schließende</li>-Tag für den einzelnen Kommentar
	 *   setzt die Funktion wp_list_comments() von selbst, der
	 *   darf hier nicht gesetzt werden!
	 */ 
}

Um diese Callback-Funktion aufzurufen, übergeben wir deren Name als Parameter in Form eines Strings an die wp_list_comments():

/**
 * der Aufruf in der comments.php
 */
?>
<ol id="commentlist">
	<?php wp_list_comments( 'callback=mytheme_comment' ); ?>
</ol>

Um auch hier die Kommentare mit ihrer Nummer zu versehen, definieren wir die Zählvariable wieder außerhalb der Schleife, also noch von dem Aufruf der Funktion wp_list_comments():

/**
 * comments.php
 */
?>
<ol>
	<?php
	$comment_counter = 0;
	wp_list_comments('callback=mytheme_comment'); ?>
</ol>

Da diese Zählvariable außerhalb der Funktion mytheme_comment definiert wird, ist sie innerhalb der Funktion auch noch nicht „sichtbar“. Da wir sie nich einfach als Parameter an die Funktion übergeben können, müssen wir sie innerhalb von mytheme_comment als global definieren um darauf zugreifen zu können. Anschließend kann man sie per echo-Befehl an der gewünschten Stelle ausgeben und setzt deren Wert zum Schluss noch um 1 höher:

/**
 * functions.php
 */
function mytheme_comment( $comment, $args, $depth ) {

	# Zugriff auf die Zählvariable ( startet bei 0 )
	global $comment_counter;
	# Zähler heraufsetzen.
	$comment_counter ++;
	
	$GLOBALS['comment'] = $comment;
	# ...

	echo '<p>' . $comment_counter . '</p>';
}
?>

Ab jetzt hat jeder Kommentar seine eigene Nummer, die man per CSS beliebig gestalten kann.

Kommentare

  1. 01) 17.12.2010
    Hans

    Hallo,

    ich bin gerade auf diesen Artikel gestoßen, dessen Anleitung bei fortlaufender Nummerierung bestens funktioniert.

    Was passiert aber, wenn die neusten Kommentare oben stehen und somit jeder neue Kommentar die jeweils neuste (höchste) Kommentar-Nummerierung erhalten soll?
    Die o.g. Methode nummeriert immer fortlaufend, egal nach was die Kommentare sortiert werden.

    Gibt es für meine Fragestellugn auch eine Lösung? Evtl. von einer Maximalvariabel runterzählen?

    Gruß Hans

  2. 02) 17.12.2010
    David

    Hallo Hans,

    die Möglichkeit die Kommentare entgegen ihrer zeitlichen Abfolge anzuordenen war mir zwar bekannt, aber in diesem fall gar nicht so bewusst. Das kann so natürlich nicht funktionieren, klar.

    Eine Lösung wäre hier, dass die Kommentare vorher gezählt werden:

    $comment_counter = count($comments_by_type['comment']);
    

    In der Callback-Funktion zählt man dann einfach rückwerts:

    global $comment_counter;
    echo '' . $comment_counter . '';
    $comment_counter--;
    

    Das ganze ist natürlich nur eine Behelfslösung und ich hab das so auch nicht getestet.
    Ich werde versuchen, das ganze mal in eine eigene Template-Funktion zu gießen, die unabhängig von der Einstellung im Backend arbeitet.

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>

Dieser Artikel wurde auf folgenden Seiten verlinkt

  1. 29. Juni 2010: Comments.php mit functions.php kombinieren | funkygog Blog