获取与所有帖子评论相关的评论编号

时间:2011-06-20 作者:onetrickpony

有没有办法做到这一点?

类似这样的方式可能会奏效,但如果有线程化注释,您会得到错误的编号,因为带有线程化注释的页面实际上比comments_per_page 设置:

$c_page = get_query_var(\'cpage\');
$c_per_page = get_query_var(\'comments_per_page\');

$number = ($c_page * $c_per_page) - $c_per_page + $current_c_index;
($current_c_index 是一个全局变量,用于存储当前页面循环的注释计数)

稍后编辑:

部分解决方案是扩展Walker\\u Comment类,克隆paged\\u walk()函数,在其中增加$top_elements 环但这还不包括孩子的评论:(

2 个回复
最合适的回答,由SO网友:Hameedullah Khan 整理而成

请尝试以下自定义Comment Walker类。walker在名为$current_comment_print_index; 在paged_walk 作用

可以打印全局变量$current_comment_print_index 显示当前打印的注释编号。

<?php 
/*
Plugin Name: Comment Count Walker for WPSE 20527
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;
        }

}
?>

SO网友:kaiser

不久前我也需要类似的东西。以下代码来自我的注释回调函数。在注释回调函数中,调用wpse20527_count_children();. 我想你的$number 是全局变量。

function wpse20527_count_children()
{
    static $ancestors = null;
    $parent = (int) $comment->comment_parent;

    $is_child = false;
    if ( $parent > (int) 0 )
    {
        $is_child = true;

        if ( ! isset( $ancestors ) )
            $ancestors = array();

        if ( ! array_key_exists( $parent, $ancestors ) )
        {
            $ancestors[$parent] = get_comment_ID();
        }
        else 
        {
            foreach ( $ancestors as $parent_id => $child_id )
            {
                if ( $parent_id == $parent )
                {
                    $ancestors_temp[$parent_id] = $child_id;
                    break;
                }

                $ancestors_temp[$parent_id] = $child_id;
            }
            $ancestors = $ancestors_temp;
        }

        $parent_counter = count( $ancestors );
    }
    return $GLOBALS[\'number\'] + $parent_counter;
}

结束