| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 | <?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	 * @var string	 *	 * @see Walker::$tree_type	 */	public $tree_type = 'comment';	/**	 * Database fields to use.	 *	 * @since 2.7.0	 * @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	 *	 * @see Walker::start_lvl()	 * @global int $comment_depth	 *	 * @param string $output Used to append additional content (passed by reference).	 * @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	 *	 * @see Walker::end_lvl()	 * @global int $comment_depth	 *	 * @param string $output Used to append additional content (passed by reference).	 * @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	 *	 * @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	 *	 * @see Walker::start_el()	 * @see wp_list_comments()	 * @global int        $comment_depth	 * @global WP_Comment $comment       Global comment object.	 *	 * @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	 *	 * @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	 *	 * @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	 *	 * @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';		}		$commenter = wp_get_current_commenter();		if ( $commenter['comment_author_email'] ) {			$moderation_note = __( 'Your comment is awaiting moderation.' );		} else {			$moderation_note = __( 'Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.' );		}		?>		<<?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				printf(					/* translators: %s: Comment author link. */					__( '%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 echo $moderation_note; ?></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	 *	 * @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';		$commenter = wp_get_current_commenter();		if ( $commenter['comment_author_email'] ) {			$moderation_note = __( 'Your comment is awaiting moderation.' );		} else {			$moderation_note = __( 'Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.' );		}		?>		<<?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							printf(								/* translators: %s: Comment author link. */								__( '%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 ) : ?>					<em class="comment-awaiting-moderation"><?php echo $moderation_note; ?></em>					<?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	}}
 |