Zähler für Kommentare, Track- und Pingbacks ab WordPress 2.7

Seit WordPress 2.7 gibt es eine API für den Bereich der Kommentare. Damit kann man auch den PHP-Anteil innerhalb der comments.php entschlacken, je nach eigenem Ermessen. Jean-Baptiste zeigt eine einfache Lösung, um die Kommentare zu zählen. Die Lösung sollte bekannt sein und wird quasi seit der ersten WordPress Veröffentlichung so realisiert. Wollte man dann aber einen Filter über den Zähler haben, der beispielsweise nur die Trackbacks zählt oder auch nur die Kommentare, die per Formular eingehen, dann scheitert diese Lösung. Außerdem ist das How To doch recht schmal und PHP-Laien könnten in Schwierigkeiten geraten. Aus diesem Zusammenhang und diverser Fragen zum Thema zeige ich mal zwei einfache Funktionen, die in der functions.php des Themes abgelegt werden und dann willkürlich im Theme genutzt werden können. In der Regel werden sie dann also zur Ausgabe in der comments.php heran gezogen.

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 7 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

Seit WordPress 2.7 gibt es eine API für den Bereich der Kommentare. Damit kann man auch den PHP-Anteil innerhalb der comments.php entschlacken, je nach eigenem Ermessen. Jean-Baptiste zeigt eine einfache Lösung, um die Kommentare zu zählen. Die Lösung sollte bekannt sein und wird quasi seit der ersten WordPress Veröffentlichung so realisiert. Hinweise dazu gibt es vielfach hier im Blog und im Netz. Wollte man dann aber einen Filter über den Zähler haben, der beispielsweise nur die Trackbacks zählt oder auch nur die Kommentare, die per Formular eingehen, dann scheitert diese Lösung. Außerdem ist das How To doch recht schmal und PHP-Laien könnten in Schwierigkeiten geraten.

Aus diesem Zusammenhang und diverser Fragen zum Thema zeige ich mal zwei einfache Funktionen, die in der functions.php des Themes abgelegt werden und dann willkürlich im Theme genutzt werden können. In der Regel werden sie dann also zur Ausgabe in der comments.php heran gezogen.


/**
 * count for Trackback, pingback, comment, pings
 *
 * so einbinden:
 * fb_comment_type_count('ping');
 * fb_comment_type_count('comment');
 */
if ( !function_exists('fb_comment_type_count') ) {
	function fb_get_comment_type_count( $type='all', $zero = false, $one = false, $more = false, $post_id = 0) {
		global $cjd_comment_count_cache, $id, $post;
		
		if ( !$post_id )
			$post_id = $post->ID;
		if ( !$post_id )
			return;
		
		if ( !isset($cjd_comment_count_cache[$post_id]) ) {
			$p = get_post($post_id);
			$p = array($p);
			update_comment_type_cache($p);
		}
		;
		if ( $type == 'pingback' || $type == 'trackback' || $type == 'comment' )
			$count = $cjd_comment_count_cache[$post_id][$type];
		elseif ( $type == 'pings' )
			$count = $cjd_comment_count_cache[$post_id]['pingback'] + $cjd_comment_count_cache[$post_id]['trackback'];
		else
			$count = array_sum((array) $cjd_comment_count_cache[$post_id]);
		
		return apply_filters('fb_get_comment_type_count', $count);
	}
	
	// comment, trackback, pingback, pings, all
	function fb_comment_type_count( $type='all', $zero = false, $one = false, $more = false, $post_id = 0 ) {
		
		$number = fb_get_comment_type_count( $type, $zero, $one, $more, $post_id );
		
		if ( $number > 1 )
			$output = str_replace('%', number_format_i18n($number), ( false === $more ) ? __('% Comments') : $more);
		elseif ( $number == 0 )
			$output = ( false === $zero ) ? __('No Comments') : $zero;
		else // must be one
			$output = ( false === $one ) ? __('1 Comment') : $one;

		echo apply_filters('fb_comment_type_count', $output, $number);
	}
}

if ( !function_exists('fb_update_comment_type_cache') ) {
	function fb_update_comment_type_cache(&$queried_posts) {
		global $cjd_comment_count_cache, $wpdb;
		
		if ( !$queried_posts )
			return $queried_posts;
		
		foreach ( (array) $queried_posts as $post )
			if ( !isset($cjd_comment_count_cache[$post->ID]) )
				$post_id_list[] = $post->ID;
		
		if ( $post_id_list ) {
			$post_id_list = implode(',', $post_id_list);
		
			foreach ( array('', 'pingback', 'trackback') as $type ) {
				$counts = $wpdb->get_results("SELECT ID, COUNT( comment_ID ) AS ccount
							FROM $wpdb->posts
							LEFT JOIN $wpdb->comments ON ( comment_post_ID = ID AND comment_approved = '1' AND comment_type='$type' )
							WHERE post_status = 'publish' AND ID IN ($post_id_list)
							GROUP BY ID");
				
				if ( $counts ) {
					if ( '' == $type )
						$type = 'comment';
					foreach ( $counts as $count )
						$cjd_comment_count_cache[$count->ID][$type] = $count->ccount;
				}
			}
		}
		
		return $queried_posts;
	}
	
	add_filter('the_posts', 'fb_update_comment_type_cache');
}

Sind die beiden Funktionen abgelegt und damit im Theme verfügbar, so könnte die Nutzung für die drei Formen comments, trackbacks und pingbacks zum Beispiel wie folgt aussehen.


if ( function_exists('wp_list_comments') ) {
	
	// WP 2.7 Kommentar Loop
	if ( have_comments() ) { ?>
		
		<?php if ( empty($comments_by_type['comment']) ) { ?>
			<h2 id="comments"><?php fb_comment_type_count( 'comment' ); ?></h2>
			<ol class="commentlist">
				<?php wp_list_comments( 'type=comment&callback=fb_theme_comment' ); ?>
			</ol>
		<?php } ?>
	
		<?php
		if ( function_exists( 'fb_comment_type_count' ) ) {
			// alternativ type pings fuer trackback + pingback
			if ( empty($comments_by_type['pingback']) ) { ?>
				<h2 id="pingback"><?php fb_comment_type_count( 'pingback', 'Keine Pingback', 'Ein Pingback', '% Pingbacks' ); ?></h2>
				<ol class="pingbacklist">
					<?php wp_list_comments('type=pingback'); ?>
				</ol>
			<?php } ?>
			
			<?php
			// alternativ type pings fuer trackback + pingback
			if ( empty($comments_by_type['trackback']) ) { ?>
				<h2 id="trackback"><?php fb_comment_type_count( 'trackback', 'Keine Trackback', 'Ein Trackback', '% Trackbacks' ); ?></h2>
				<ol class="trackbacklist">
					<?php wp_list_comments('type=trackback'); ?>
				</ol>
			<?php } 
		} ?>
		
		<div class="navigation nav_comments">
			<div class="alignleft"><?php previous_comments_link() ?></div>
			<div class="alignright"><?php next_comments_link() ?></div>
		</div>
			
	<?php } else { 
		// this is displayed if there are no comments so far 
	} ?>

Die obige Syntax zeigt nur einen Ausschnitt aus der comments.php und sollte daher in die jeweilige Anforderung eingepasst werden. Im Basis-Theme von mir ist es aktuell nicht drin, kommt aber.

Die obigen Bereiche können natürlich mit anderem Markup ausgestattet werden und die Klassen und IDs sind auch nur beispielhaft. Da sind die Möglichkeiten jedem überlassen und den eigenen Anforderungen anzupassen.
Hinweise, Lob, Verbesserungen oder Kritik - die Kommentare stehen euch wie immer offen, auch wenn die meisten ja eher per Feed hier mitlesen.

Comments are closed.