7. Mai 2009
Mein letztes kleines Projekt war die Anpassung eines WordPress Themes an WordPress 2.7, wo meistens die verschachtelten Kommentare eine Hauptrolle spielen. Weil man nämlich dafür im Kommentar-Template einiges umstellen muss, erkläre ich euch am besten mal, wie das geht. Ziel dieses Beitrags ist es, die Ausgabe der Kommentare ab WordPress 2.7 manuell zu verändern, weil die WordPress-eigene Darstellung nicht für jedes Design und jeden Blog geeignet ist.
Früher sah das Kommentar-Template so aus:
<?php if ($comments) : ?>
<h2><?php comments_number('0 Kommentare', '1 Kommentare', '% Kommentare' ); ?></h2>
<ul>
<?php foreach ($comments as $comment) : ?>
<li id="comment-<?php echo $commentcount ?>">
<?php comment_author_link(); ?>
?> am <?php comment_date('j. F Y') ?> um <?php comment_time() ?></p>
<?php if ($comment->comment_approved == '0') : ?>
Dein Kommentar muss noch geprüft werden.<?php endif; ?>
<?php comment_text() ?>
<?php edit_comment_link('Kommentar bearbeiten'); ?>
</li>
<?php $commentcount++; endforeach; /* end for each comment */ ?>
</ul>
<?php endif; ?>
Heute ist es ganz anders. Nichts mehr mit lästigen Variablen un eher zweckmässigen Funktionen. Ab WordPress 2.7 hat das Kommentar-Template de facto den gleichen Stand wie die Beiträge, da es jetzt eine eigene Loop ist. Eine Loop für Kommentare eben. Im Vergleich zu vorher ist das neue Template auch ein wenig schlanker geworden. Der Kern ist der hervorgehobene Template Tag <?php wp_list_comments(); ?>
<?php if ( have_comments() ) : ?>
<h3><?php comments_number('0 Kommentare', '1 Kommentar', '% Kommentare' );?></h3>
<ul class="commentlist">
<?php wp_list_comments('type=comment&callback=magazin_comment'); ?>
</ul>
<div class="navigation">
<div class="alignleft"><?php previous_comments_link() ?></div>
<div class="alignright"><?php next_comments_link() ?></div>
</div>
<?php else : // Falls es noch keine Kommentare zum Beitrag gibt ?>
<?php if ('open' == $post->comment_status) : ?>
<?php else : // comments are closed ?>
<p>Kommentare sind geschlossen.</p>
<?php endif; endif; ?>
Jetzt haben wir also schon eine vernünftige Basis, die aber noch einiges an Erklärungen bedarf! Die ersten Zeilen dürften klar sein, da die Funktionen doch recht aussagekräftige Namen haben. Der Container mit den zwei Template Tags <?php previous_comments_link() ?> und <?php next_comments_link() ?> sorgt übrigens für die Navigation, falls die Kommentare auf mehrere Seiten verteilt sind. Dies kann man aber in den WordPress Einstellungen deaktivieren, was dann diesen Code-Teil überflüssig macht.
Habt ihr gesehen, dass ab WordPress 2.7 die Angaben über Kommentierer und Datum nicht mehr direkt im Template stehen? Für diese hat WordPress nämlich schon eine Vorlage. Wer diese Vorlage ändern will, braucht dazu nur <?php wp_list_comments(); ?> zu erweitern! Und zwar um den Parameter 'callback=myown_comments'. Folglich sieht diese Zeile nun so aus: <?php wp_list_comments('callback=myown_comments'); ?>.
Jetzt muss man nur noch folgende Zeilen in der functions.php des Themes einfügen und schon kann man die Ausgabe nach Belieben verändern!
<?php function myown_comments($comment, $args, $depth) {
$GLOBALS['comment'] = $comment; ?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>">
<div id="comment-<?php comment_ID(); ?>">
<div class="comment-author vcard">
<?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?>
<?php printf(__('%s says:'), get_comment_author_link()) ?>
</div>
<?php if ($comment->comment_approved == '0') : ?>
<em><?php _e('Your comment is awaiting moderation.') ?></em>
<br />
<?php endif; ?>
<div class="comment-meta commentmetadata">
<a href="<?php echo htmlspecialchars(
get_comment_link( $comment->comment_ID ) ) ?>">
<?php printf(__('%1$s at %2$s'), get_comment_date(), get_comment_time()) ?></a>
<?php edit_comment_link(__('(Edit)'),' ','') ?></div>
<?php comment_text() ?>
<div class="reply">
<?php comment_reply_link(array_merge(
$args, array('depth' => $depth, 'max_depth' => $args['max_depth'])
)) ?>
</div>
</div>
<?php } ?>
Hinweis: Am Ende fehlt ein schliessendes </li>, dieses fügt WordPress automatisch ein, wenn es Child-Kommentare gibt!
© 2012 Schweizer WordPress Magazin | Realisiert von Pascal Birchler | 52 Queries. 0,534 Sekunden.
Hallo, danke für den Tipp. Leider habe ich bei der Funktion mit der Zeile
Probleme. Daraus wird bei mir
%A %B %e%q, %Y at %I:%M %p
Woran kann das liegen?
Danke, Pascal, für den tollen Beitrag. Hat mir viel Zeit und Nerven erspart.
@Tini: Sieht aus, als hättest Du QTranslate im Einsatz.
Probier mal testweise das: printf(__(‘%1$s at %2$s’), get_comment_date(‘F j., Y’), get_comment_date(‘G:i’))