注释遍历与注释回调

时间:2016-02-01 作者:Bryan Willis

这周我一直在摆弄自定义评论,我想知道什么时候我想用助行器,什么时候我想用回拨器。。。

有些事情我不太明白如何改变,但让我抓狂的是如何给孩子们上课<ul> 标签:

<ul class="children">

是否有一些评论步行者可以做的事情是评论回调所不能做的?。。。反之亦然?作为主题开发人员使用其中一个“更好”吗?例如,我知道当一个主题使用自定义菜单遍历器时,很多菜单插件都不起作用。

无论如何,这里有一个exact same comments, 但一个是使用walker输出的,另一个是使用回调。。。我错过了什么?为什么两者都需要?

注释回调

wp_list_comments( array(
    \'callback\'      => \'bootstrap_comment_callback\',
 ));

function bootstrap_comment_callback( $comment, $args, $depth ){
        $GLOBALS[\'comment\'] = $comment; ?>
    <li id="comment-<?php comment_ID(); ?>" <?php comment_class( empty( $args[\'has_children\'] ) ? \'\' : \'parent\' ); ?>>

    <?php if ( 0 != $args[\'avatar_size\'] ): ?>
    <div class="media-left">
        <a href="<?php echo get_comment_author_url(); ?>" class="media-object"><?php echo get_avatar( $comment, $args[\'avatar_size\'] ); ?></a>
    </div>
    <?php endif; ?>

    <div class="media-body">
    <?php printf( \'<h4 class="media-heading">%s</h4>\', get_comment_author_link() ); ?>
    <div class="comment-metadata">
        <a href="<?php echo esc_url( get_comment_link( $comment->comment_ID, $args ) ); ?>">
            <time datetime="<?php comment_time( \'c\' ); ?>">
                <?php printf( _x( \'%1$s at %2$s\', \'1: date, 2: time\' ), get_comment_date(), get_comment_time() ); ?>
            </time>
        </a>
    </div><!-- .comment-metadata -->

    <?php if ( \'0\' == $comment->comment_approved ) : ?>
    <p class="comment-awaiting-moderation label label-info"><?php _e( \'Your comment is awaiting moderation.\' ); ?></p>
    <?php endif; ?>             

    <div class="comment-content">
         <?php comment_text(); ?>
    </div>

    <ul class="list-inline">
        <?php edit_comment_link( __( \'Edit\' ), \'<li class="edit-link">\', \'</li>\' ); ?>

    <?php
        comment_reply_link( array_merge( $args, array(
            \'add_below\' => \'div-comment\',
            \'depth\'     => $depth,
            \'max_depth\' => $args[\'max_depth\'],
            \'before\'    => \'<li class="reply-link">\',
            \'after\'     => \'</li>\'
        ) ) );  
    ?>
    </ul>
    </div>  
<?php
}
评论步行者
wp_list_comments( array(
    \'walker\'        => new Bootstrap_Comment_Walker(),
 ));

class Bootstrap_Comment_Walker extends Walker_Comment {
    protected function html5_comment( $comment, $depth, $args ) {

?><li id="comment-<?php comment_ID(); ?>" <?php comment_class( empty( $args[\'has_children\'] ) ? \'\' : \'parent\' ); ?>>

    <?php if ( 0 != $args[\'avatar_size\'] ): ?>
    <div class="media-left">
        <a href="<?php echo get_comment_author_url(); ?>" class="media-object"><?php echo get_avatar( $comment, $args[\'avatar_size\'] ); ?></a>
    </div>
    <?php endif; ?>

    <div class="media-body">
    <?php printf( \'<h4 class="media-heading">%s</h4>\', get_comment_author_link() ); ?>
    <div class="comment-metadata">
        <a href="<?php echo esc_url( get_comment_link( $comment->comment_ID, $args ) ); ?>">
            <time datetime="<?php comment_time( \'c\' ); ?>">
                <?php printf( _x( \'%1$s at %2$s\', \'1: date, 2: time\' ), get_comment_date(), get_comment_time() ); ?>
            </time>
        </a>
    </div><!-- .comment-metadata -->

    <?php if ( \'0\' == $comment->comment_approved ) : ?>
    <p class="comment-awaiting-moderation label label-info"><?php _e( \'Your comment is awaiting moderation.\' ); ?></p>
    <?php endif; ?>             

    <div class="comment-content">
         <?php comment_text(); ?>
    </div>

    <ul class="list-inline">
        <?php edit_comment_link( __( \'Edit\' ), \'<li class="edit-link">\', \'</li>\' ); ?>

    <?php
        comment_reply_link( array_merge( $args, array(
            \'add_below\' => \'div-comment\',
            \'depth\'     => $depth,
            \'max_depth\' => $args[\'max_depth\'],
            \'before\'    => \'<li class="reply-link">\',
            \'after\'     => \'</li>\'
        ) ) );  
    ?>
    </ul>
    </div>      
<?php
    }   
}

3 个回复
SO网友:birgire

我们可以重写:

wp_list_comments( array(
    \'callback\'      => \'bootstrap_comment_callback\',
 ));
使用空值walker 参数:

 wp_list_comments( array(
    \'walker\'        => null,
    \'callback\'      => \'bootstrap_comment_callback\',
 ));
这意味着我们使用的是默认值Walker_Comment 类别:

  wp_list_comments( array(
    \'walker\'        => new Walker_Comment,
    \'callback\'      => \'bootstrap_comment_callback\',
 ));
TheWalker_Comment::start_el() 方法只是以下受保护方法之一的包装:

Walker_Comment::comment()
Walker_Comment::html5_comment()
Walker_Comment::ping()
这取决于上下文,当沿着注释树行走时,会将每个注释附加到输出字符串。

使用自定义walker类扩展Walker_Comment 类,使我们能够重写这些公共方法:

Walker_Comment::start_el()
Walker_Comment::end_el()
Walker_Comment::start_lvl()
Walker_Comment::end_lvl()
Walker_Comment::display_element()
除上述受保护的以外。

如果我们只需要修改start_el() 方法,我们只需要使用callback 中的参数wp_list_comments().

SO网友:darrinb

最简单的解释是callback 的参数wp_list_comments() 用于引用将生成individual 议论(Theend-callback 参数引用将关闭单个注释的函数。)

因此,您可以使用自己的自定义函数输出单个注释,同时仍使用核心Walker_Comment 类来构建entire 注释列表。

相反,您也可以使用自己的类重写核心的全部或部分Walker_Comment

在上面的示例中,您定义了一个自定义walker类,其中定义了一个方法:html5_comment(). 既然你在扩展核心Walker_Comment 类,但仅重写一个方法(html_comment()), WP将使用中定义的其他方法Walker_Comment 以构建注释列表的其余部分。

本质上,使用callback/end-callback 构建单个注释,并使用自定义Walker类构建整个注释列表。你不需要两者兼而有之,两者皆有之。

顺便提一下,我刚刚写了一篇文章,根据我发布的一个插件,对WordPress的引导评论进行了更详细的概述。您可以在此处找到:http://darrinb.com/wp-bootstrap-comments/

SO网友:amarinediary

有些事情我不太明白如何改变,但让我抓狂的是如何给孩子们上课<ul class="children"> ...

除了使用walker和回调之外,直截了当的修复方法是preg_replace 之前echo把它弄出来。

<?php

$buffer = wp_list_comments(
    array (
        //...
        \'echo\' => false,
    ),
    //...
);

$buffer = preg_replace( \'/class="children"/\', \'class="list-unstyled"\', $buffer );

echo $buffer;