私は今週カスタムコメントをいじっていて、いつウォーカーを使いたいのか、そしていつコールバックを使いたいのかを把握しようとしています...
変更方法を理解できないこともいくつかありますが、気にしているのは、子の<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
}
}
書き換えることができます:
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
パラメータを使用するだけで済みます。
最も簡単な説明では、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/ /