web-dev-qa-db-ja.com

コメントウォーカーとコメントコールバック

私は今週カスタムコメントをいじっていて、いつウォーカーを使いたいのか、そしていつコールバックを使いたいのかを把握しようとしています...

変更方法を理解できないこともいくつかありますが、気にしているのは、子の<ul>タグにクラスを追加する方法です。

<ul class="children">

コメントウォーカーができること、コメントコールバックではできないことがあるのでしょうか。そして、テーマ開発者として使用するには、これらのうちの1つが「より良い」のでしょうか。たとえば、テーマでカスタムメニューウォーカーを使用している場合、多くのメニュープラグインが機能しないことがわかります。

とにかく、これは まったく同じコメントの例です ですが、1つはwalkerを使用して出力され、もう1つはコールバックを使用しています...なぜこれらの両方が必要なのでしょうか。

コメントコールバック

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
    }   
}
5
Bryan Willis

書き換えることができます:

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

walkerパラメータがnullの場合:

 wp_list_comments( array(
    'walker'        => null,
    'callback'      => 'bootstrap_comment_callback',
 ));

つまり、デフォルトのWalker_Commentクラスを使用しています。

  wp_list_comments( array(
    'walker'        => new Walker_Comment,
    'callback'      => 'bootstrap_comment_callback',
 ));

Walker_Comment::start_el()メソッドは、これらの protected メソッドのうちの1つのラッパーです。

Walker_Comment::comment()
Walker_Comment::html5_comment()
Walker_Comment::ping()

つまり、コンテキストに応じて、コメントツリーをたどるときに各コメントを出力文字列に追加します。

Walker_Commentクラスを拡張する カスタムwalker クラスを使用すると、これらの public メソッドをオーバーライドすることができます。

Walker_Comment::start_el()
Walker_Comment::end_el()
Walker_Comment::start_lvl()
Walker_Comment::end_lvl()
Walker_Comment::display_element()

上記の保護されたものに加えて。

start_el()メソッドの出力を変更するだけでよい場合は、wp_list_comments()callbackパラメータを使用するだけで済みます。

3
birgire

最も簡単な説明では、wp_list_comments()callback引数は、 individual コメントの始まりを構築する関数を参照するために使用されます。 (引数end-callbackは、個々のコメントを閉じる関数を参照しています。)

そのため、独自のカスタム関数を使用して個々のコメントを出力しながら、コアのWalker_Commentクラスを使用して whole commentリストを作成することができます。

逆に、あなた自身のクラスを使ってコアのWalker_Commentクラスの全部または一部をオーバーライドすることもできます。

上記の例では、1つのメソッドが定義されたカスタムウォーカークラスを定義しました:html5_comment()。コアのWalker_Commentクラスを拡張していますが、1つのメソッド(html_comment())のみをオーバーライドしているので、WPは残りのコメントリストを作成するためにWalker_Commentで定義された残りのメソッドを使用します。

基本的に、個々のコメントを作成するにはcallback/end-callbackを使用し、コメントリスト全体を作成するにはカスタムWalkerクラスを使用します。あなたは両方を必要としません、それはどちらか一方です。

ちなみに、私はWordPressのためのBootstrapコメントに関して私がリリースしたプラグインに基づいてこれをより詳細に概説する記事を書きました。あなたはそれをここで見つけることができます: http://darrinb.com/wp-bootstrap-comments/ /

1
darrinb