Skip to content

Instantly share code, notes, and snippets.

@hameedullah
Created July 4, 2011 14:49
Show Gist options
  • Save hameedullah/1063419 to your computer and use it in GitHub Desktop.
Save hameedullah/1063419 to your computer and use it in GitHub Desktop.
Count comment print index
<?php
/*
Plugin Name: Comment Count Walker for WPSE
Author: Hameedullah Khan
Author URI: http://hameedullah.com
Version: 0.1
*/
class CC_Custom_Walker_Comment extends Walker_Comment {
function paged_walk( $elements, $max_depth, $page_num, $per_page ) {
global $current_comment_print_index;
$current_comment_print_index = 0;
/* sanity check */
if ( empty($elements) || $max_depth < -1 )
return '';
$args = array_slice( func_get_args(), 4 );
$output = '';
$id_field = $this->db_fields['id'];
$parent_field = $this->db_fields['parent'];
$count = -1;
if ( -1 == $max_depth )
$total_top = count( $elements );
if ( $page_num < 1 || $per_page < 0 ) {
// No paging
$paging = false;
$start = 0;
if ( -1 == $max_depth )
$end = $total_top;
$this->max_pages = 1;
} else {
$paging = true;
$start = ( (int)$page_num - 1 ) * (int)$per_page;
$end = $start + $per_page;
if ( -1 == $max_depth )
$this->max_pages = ceil($total_top / $per_page);
}
// flat display
if ( -1 == $max_depth ) {
if ( !empty($args[0]['reverse_top_level']) ) {
$elements = array_reverse( $elements );
$oldstart = $start;
$start = $total_top - $end;
$end = $total_top - $oldstart;
}
if ( $paging ) {
// HK: if paging enabled and its a flat display.
// HK: mark the current print index from page number * comments per page
$current_comment_print_index = ( (int) $page_num - 1 ) * $per_page;
}
$empty_array = array();
foreach ( $elements as $e ) {
$count++;
if ( $count < $start )
continue;
if ( $count >= $end )
break;
$this->display_element( $e, $empty_array, 1, 0, $args, $output );
}
return $output;
}
/*
* separate elements into two buckets: top level and children elements
* children_elements is two dimensional array, eg.
* children_elements[10][] contains all sub-elements whose parent is 10.
*/
$top_level_elements = array();
$children_elements = array();
foreach ( $elements as $e) {
if ( 0 == $e->$parent_field )
$top_level_elements[] = $e;
else
$children_elements[ $e->$parent_field ][] = $e;
}
$total_top = count( $top_level_elements );
if ( $paging )
$this->max_pages = ceil($total_top / $per_page);
else
$end = $total_top;
if ( !empty($args[0]['reverse_top_level']) ) {
$top_level_elements = array_reverse( $top_level_elements );
$oldstart = $start;
$start = $total_top - $end;
$end = $total_top - $oldstart;
}
if ( !empty($args[0]['reverse_children']) ) {
foreach ( $children_elements as $parent => $children )
$children_elements[$parent] = array_reverse( $children );
}
foreach ( $top_level_elements as $e ) {
$count++;
// HK: current iteration index, will be added to global index
// NOTE: will only be added to global index if already printed
$iteration_comment_print_index = 1;
// HK: count of current iteration children ( includes grand children too )
$iteration_comment_print_index += $this->count_children( $e->comment_ID, $children_elements );
//for the last page, need to unset earlier children in order to keep track of orphans
if ( $end >= $total_top && $count < $start )
$this->unset_children( $e, $children_elements );
if ( $count < $start ) {
// HK: if we have already printed this top level comment
// HK: then just add the count (including children) to global index and continue
$current_comment_print_index += $iteration_comment_print_index;
continue;
}
if ( $count >= $end )
break;
$this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );
}
if ( $end >= $total_top && count( $children_elements ) > 0 ) {
$empty_array = array();
foreach ( $children_elements as $orphans )
foreach( $orphans as $op )
$this->display_element( $op, $empty_array, 1, 0, $args, $output );
}
return $output;
}
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
global $current_comment_print_index;
if ( !$element )
return;
// increment for current comment we are printing
$current_comment_print_index += 1;
parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
function count_children( $comment_id, $children_elements ) {
$children_count = 0;
if ( isset( $children_elements[$comment_id] ) ) {
$children_count = count( $children_elements[$comment_id] );
foreach( $children_elements[$comment_id] as $child ) {
$children_count += $this->count_children( $child->comment_ID, $children_elements );
}
}
return $children_count;
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment