|
- <?php
- /**
- * Comment API: Walker_Comment class
- *
- * @package WordPress
- * @subpackage Comments
- * @since 4.4.0
- */
-
- /**
- * Core walker class used to create an HTML list of comments.
- *
- * @since 2.7.0
- *
- * @see Walker
- */
- class Walker_Comment extends Walker {
-
- /**
- * What the class handles.
- *
- * @since 2.7.0
- * @access public
- * @var string
- *
- * @see Walker::$tree_type
- */
- public $tree_type = 'comment';
-
- /**
- * Database fields to use.
- *
- * @since 2.7.0
- * @access public
- * @var array
- *
- * @see Walker::$db_fields
- * @todo Decouple this
- */
- public $db_fields = array ('parent' => 'comment_parent', 'id' => 'comment_ID');
-
- /**
- * Starts the list before the elements are added.
- *
- * @since 2.7.0
- * @access public
- *
- * @see Walker::start_lvl()
- * @global int $comment_depth
- *
- * @param string $output Passed by reference. Used to append additional content.
- * @param int $depth Optional. Depth of the current comment. Default 0.
- * @param array $args Optional. Uses 'style' argument for type of HTML list. Default empty array.
- */
- public function start_lvl( &$output, $depth = 0, $args = array() ) {
- $GLOBALS['comment_depth'] = $depth + 1;
-
- switch ( $args['style'] ) {
- case 'div':
- break;
- case 'ol':
- $output .= '<ol class="children">' . "\n";
- break;
- case 'ul':
- default:
- $output .= '<ul class="children">' . "\n";
- break;
- }
- }
-
- /**
- * Ends the list of items after the elements are added.
- *
- * @since 2.7.0
- * @access public
- *
- * @see Walker::end_lvl()
- * @global int $comment_depth
- *
- * @param string $output Passed by reference. Used to append additional content.
- * @param int $depth Optional. Depth of the current comment. Default 0.
- * @param array $args Optional. Will only append content if style argument value is 'ol' or 'ul'.
- * Default empty array.
- */
- public function end_lvl( &$output, $depth = 0, $args = array() ) {
- $GLOBALS['comment_depth'] = $depth + 1;
-
- switch ( $args['style'] ) {
- case 'div':
- break;
- case 'ol':
- $output .= "</ol><!-- .children -->\n";
- break;
- case 'ul':
- default:
- $output .= "</ul><!-- .children -->\n";
- break;
- }
- }
-
- /**
- * Traverses elements to create list from elements.
- *
- * This function is designed to enhance Walker::display_element() to
- * display children of higher nesting levels than selected inline on
- * the highest depth level displayed. This prevents them being orphaned
- * at the end of the comment list.
- *
- * Example: max_depth = 2, with 5 levels of nested content.
- * 1
- * 1.1
- * 1.1.1
- * 1.1.1.1
- * 1.1.1.1.1
- * 1.1.2
- * 1.1.2.1
- * 2
- * 2.2
- *
- * @since 2.7.0
- * @access public
- *
- * @see Walker::display_element()
- * @see wp_list_comments()
- *
- * @param WP_Comment $element Comment data object.
- * @param array $children_elements List of elements to continue traversing. Passed by reference.
- * @param int $max_depth Max depth to traverse.
- * @param int $depth Depth of the current element.
- * @param array $args An array of arguments.
- * @param string $output Used to append additional content. Passed by reference.
- */
- public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
- if ( !$element )
- return;
-
- $id_field = $this->db_fields['id'];
- $id = $element->$id_field;
-
- parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
-
- /*
- * If at the max depth, and the current element still has children, loop over those
- * and display them at this level. This is to prevent them being orphaned to the end
- * of the list.
- */
- if ( $max_depth <= $depth + 1 && isset( $children_elements[$id]) ) {
- foreach ( $children_elements[ $id ] as $child )
- $this->display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
-
- unset( $children_elements[ $id ] );
- }
-
- }
-
- /**
- * Starts the element output.
- *
- * @since 2.7.0
- * @access public
- *
- * @see Walker::start_el()
- * @see wp_list_comments()
- * @global int $comment_depth
- * @global WP_Comment $comment
- *
- * @param string $output Used to append additional content. Passed by reference.
- * @param WP_Comment $comment Comment data object.
- * @param int $depth Optional. Depth of the current comment in reference to parents. Default 0.
- * @param array $args Optional. An array of arguments. Default empty array.
- * @param int $id Optional. ID of the current comment. Default 0 (unused).
- */
- public function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 ) {
- $depth++;
- $GLOBALS['comment_depth'] = $depth;
- $GLOBALS['comment'] = $comment;
-
- if ( !empty( $args['callback'] ) ) {
- ob_start();
- call_user_func( $args['callback'], $comment, $args, $depth );
- $output .= ob_get_clean();
- return;
- }
-
- if ( ( 'pingback' == $comment->comment_type || 'trackback' == $comment->comment_type ) && $args['short_ping'] ) {
- ob_start();
- $this->ping( $comment, $depth, $args );
- $output .= ob_get_clean();
- } elseif ( 'html5' === $args['format'] ) {
- ob_start();
- $this->html5_comment( $comment, $depth, $args );
- $output .= ob_get_clean();
- } else {
- ob_start();
- $this->comment( $comment, $depth, $args );
- $output .= ob_get_clean();
- }
- }
-
- /**
- * Ends the element output, if needed.
- *
- * @since 2.7.0
- * @access public
- *
- * @see Walker::end_el()
- * @see wp_list_comments()
- *
- * @param string $output Used to append additional content. Passed by reference.
- * @param WP_Comment $comment The current comment object. Default current comment.
- * @param int $depth Optional. Depth of the current comment. Default 0.
- * @param array $args Optional. An array of arguments. Default empty array.
- */
- public function end_el( &$output, $comment, $depth = 0, $args = array() ) {
- if ( !empty( $args['end-callback'] ) ) {
- ob_start();
- call_user_func( $args['end-callback'], $comment, $args, $depth );
- $output .= ob_get_clean();
- return;
- }
- if ( 'div' == $args['style'] )
- $output .= "</div><!-- #comment-## -->\n";
- else
- $output .= "</li><!-- #comment-## -->\n";
- }
-
- /**
- * Outputs a pingback comment.
- *
- * @since 3.6.0
- * @access protected
- *
- * @see wp_list_comments()
- *
- * @param WP_Comment $comment The comment object.
- * @param int $depth Depth of the current comment.
- * @param array $args An array of arguments.
- */
- protected function ping( $comment, $depth, $args ) {
- $tag = ( 'div' == $args['style'] ) ? 'div' : 'li';
- ?>
- <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( '', $comment ); ?>>
- <div class="comment-body">
- <?php _e( 'Pingback:' ); ?> <?php comment_author_link( $comment ); ?> <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?>
- </div>
- <?php
- }
-
- /**
- * Outputs a single comment.
- *
- * @since 3.6.0
- * @access protected
- *
- * @see wp_list_comments()
- *
- * @param WP_Comment $comment Comment to display.
- * @param int $depth Depth of the current comment.
- * @param array $args An array of arguments.
- */
- protected function comment( $comment, $depth, $args ) {
- if ( 'div' == $args['style'] ) {
- $tag = 'div';
- $add_below = 'comment';
- } else {
- $tag = 'li';
- $add_below = 'div-comment';
- }
- ?>
- <<?php echo $tag; ?> <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?> id="comment-<?php comment_ID(); ?>">
- <?php if ( 'div' != $args['style'] ) : ?>
- <div id="div-comment-<?php comment_ID(); ?>" class="comment-body">
- <?php endif; ?>
- <div class="comment-author vcard">
- <?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?>
- <?php
- /* translators: %s: comment author link */
- printf( __( '%s <span class="says">says:</span>' ),
- sprintf( '<cite class="fn">%s</cite>', get_comment_author_link( $comment ) )
- );
- ?>
- </div>
- <?php if ( '0' == $comment->comment_approved ) : ?>
- <em class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.' ) ?></em>
- <br />
- <?php endif; ?>
-
- <div class="comment-meta commentmetadata"><a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>">
- <?php
- /* translators: 1: comment date, 2: comment time */
- printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)' ), ' ', '' );
- ?>
- </div>
-
- <?php comment_text( $comment, array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
-
- <?php
- comment_reply_link( array_merge( $args, array(
- 'add_below' => $add_below,
- 'depth' => $depth,
- 'max_depth' => $args['max_depth'],
- 'before' => '<div class="reply">',
- 'after' => '</div>'
- ) ) );
- ?>
-
- <?php if ( 'div' != $args['style'] ) : ?>
- </div>
- <?php endif; ?>
- <?php
- }
-
- /**
- * Outputs a comment in the HTML5 format.
- *
- * @since 3.6.0
- * @access protected
- *
- * @see wp_list_comments()
- *
- * @param WP_Comment $comment Comment to display.
- * @param int $depth Depth of the current comment.
- * @param array $args An array of arguments.
- */
- protected function html5_comment( $comment, $depth, $args ) {
- $tag = ( 'div' === $args['style'] ) ? 'div' : 'li';
- ?>
- <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?>>
- <article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
- <footer class="comment-meta">
- <div class="comment-author vcard">
- <?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?>
- <?php
- /* translators: %s: comment author link */
- printf( __( '%s <span class="says">says:</span>' ),
- sprintf( '<b class="fn">%s</b>', get_comment_author_link( $comment ) )
- );
- ?>
- </div><!-- .comment-author -->
-
- <div class="comment-metadata">
- <a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>">
- <time datetime="<?php comment_time( 'c' ); ?>">
- <?php
- /* translators: 1: comment date, 2: comment time */
- printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() );
- ?>
- </time>
- </a>
- <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?>
- </div><!-- .comment-metadata -->
-
- <?php if ( '0' == $comment->comment_approved ) : ?>
- <p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.' ); ?></p>
- <?php endif; ?>
- </footer><!-- .comment-meta -->
-
- <div class="comment-content">
- <?php comment_text(); ?>
- </div><!-- .comment-content -->
-
- <?php
- comment_reply_link( array_merge( $args, array(
- 'add_below' => 'div-comment',
- 'depth' => $depth,
- 'max_depth' => $args['max_depth'],
- 'before' => '<div class="reply">',
- 'after' => '</div>'
- ) ) );
- ?>
- </article><!-- .comment-body -->
- <?php
- }
- }
|