Title: _wp_dashboard_recent_comments_row
Published: April 25, 2014
Last modified: May 20, 2026

---

# _wp_dashboard_recent_comments_row( WP_Comment $comment, bool $show_date = true )

## In this article

 * [Parameters](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#parameters)
 * [Source](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#wp--skip-link--target)

This function’s access is marked private. This means it is not intended for use 
by plugin or theme developers, only by core. It is listed here for completeness.

Outputs a row for the Recent Comments widget.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#parameters)󠁿

 `$comment`[WP_Comment](https://developer.wordpress.org/reference/classes/wp_comment/)
required

The current comment.

`$show_date`booloptional

Whether to display the date.

Default:`true`

## 󠀁[Source](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#source)󠁿

    ```php
    function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) {
    	$GLOBALS['comment'] = clone $comment;

    	if ( $comment->comment_post_ID > 0 ) {
    		$comment_post_title = _draft_or_post_title( $comment->comment_post_ID );
    		$comment_post_url   = get_the_permalink( $comment->comment_post_ID );
    		$comment_post_link  = '<a href="' . esc_url( $comment_post_url ) . '">' . $comment_post_title . '</a>';
    	} else {
    		$comment_post_link = '';
    	}

    	$actions_string = '';
    	if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) {
    		// Pre-order it: Approve | Reply | Edit | Spam | Trash.
    		$actions = array(
    			'approve'   => '',
    			'unapprove' => '',
    			'reply'     => '',
    			'edit'      => '',
    			'spam'      => '',
    			'trash'     => '',
    			'delete'    => '',
    			'view'      => '',
    		);

    		$approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( 'approve-comment_' . $comment->comment_ID ) );
    		$del_nonce     = esc_html( '_wpnonce=' . wp_create_nonce( 'delete-comment_' . $comment->comment_ID ) );

    		$action_string = 'comment.php?action=%s&p=' . $comment->comment_post_ID . '&c=' . $comment->comment_ID . '&%s';

    		$approve_url   = sprintf( $action_string, 'approvecomment', $approve_nonce );
    		$unapprove_url = sprintf( $action_string, 'unapprovecomment', $approve_nonce );
    		$spam_url      = sprintf( $action_string, 'spamcomment', $del_nonce );
    		$trash_url     = sprintf( $action_string, 'trashcomment', $del_nonce );
    		$delete_url    = sprintf( $action_string, 'deletecomment', $del_nonce );

    		$actions['approve'] = sprintf(
    			'<a href="%s" data-wp-lists="%s" class="vim-a aria-button-if-js" aria-label="%s">%s</a>',
    			esc_url( $approve_url ),
    			"dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved",
    			esc_attr__( 'Approve this comment' ),
    			__( 'Approve' )
    		);

    		$actions['unapprove'] = sprintf(
    			'<a href="%s" data-wp-lists="%s" class="vim-u aria-button-if-js" aria-label="%s">%s</a>',
    			esc_url( $unapprove_url ),
    			"dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=unapproved",
    			esc_attr__( 'Unapprove this comment' ),
    			__( 'Unapprove' )
    		);

    		$actions['edit'] = sprintf(
    			'<a href="%s" aria-label="%s">%s</a>',
    			"comment.php?action=editcomment&amp;c={$comment->comment_ID}",
    			esc_attr__( 'Edit this comment' ),
    			__( 'Edit' )
    		);

    		$actions['reply'] = sprintf(
    			'<button type="button" onclick="window.commentReply && commentReply.open(\'%s\',\'%s\');" class="vim-r button-link hide-if-no-js" aria-label="%s">%s</button>',
    			$comment->comment_ID,
    			$comment->comment_post_ID,
    			esc_attr__( 'Reply to this comment' ),
    			/* translators: Comment reply button text. */
    			_x( 'Reply', 'verb' )
    		);

    		$actions['spam'] = sprintf(
    			'<a href="%s" data-wp-lists="%s" class="vim-s vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
    			esc_url( $spam_url ),
    			"delete:the-comment-list:comment-{$comment->comment_ID}::spam=1",
    			esc_attr__( 'Mark this comment as spam' ),
    			/* translators: "Mark as spam" link. */
    			_x( 'Spam', 'verb' )
    		);

    		if ( ! EMPTY_TRASH_DAYS ) {
    			$actions['delete'] = sprintf(
    				'<a href="%s" data-wp-lists="%s" class="delete vim-d vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
    				esc_url( $delete_url ),
    				"delete:the-comment-list:comment-{$comment->comment_ID}::trash=1",
    				esc_attr__( 'Delete this comment permanently' ),
    				__( 'Delete Permanently' )
    			);
    		} else {
    			$actions['trash'] = sprintf(
    				'<a href="%s" data-wp-lists="%s" class="delete vim-d vim-destructive aria-button-if-js" aria-label="%s">%s</a>',
    				esc_url( $trash_url ),
    				"delete:the-comment-list:comment-{$comment->comment_ID}::trash=1",
    				esc_attr__( 'Move this comment to the Trash' ),
    				_x( 'Trash', 'verb' )
    			);
    		}

    		$actions['view'] = sprintf(
    			'<a class="comment-link" href="%s" aria-label="%s">%s</a>',
    			esc_url( get_comment_link( $comment ) ),
    			esc_attr__( 'View this comment' ),
    			__( 'View' )
    		);

    		/** This filter is documented in wp-admin/includes/class-wp-comments-list-table.php */
    		$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );

    		$i = 0;

    		foreach ( $actions as $action => $link ) {
    			++$i;

    			if ( ( ( 'approve' === $action || 'unapprove' === $action ) && 2 === $i )
    				|| 1 === $i
    			) {
    				$separator = '';
    			} else {
    				$separator = ' | ';
    			}

    			// Reply and quickedit need a hide-if-no-js span.
    			if ( 'reply' === $action || 'quickedit' === $action ) {
    				$action .= ' hide-if-no-js';
    			}

    			if ( 'view' === $action && '1' !== $comment->comment_approved ) {
    				$action .= ' hidden';
    			}

    			$actions_string .= "<span class='$action'>{$separator}{$link}</span>";
    		}
    	}
    	?>

    		<li id="comment-<?php echo $comment->comment_ID; ?>" <?php comment_class( array( 'comment-item', wp_get_comment_status( $comment ) ), $comment ); ?>>

    			<?php
    			$comment_row_class = '';

    			if ( get_option( 'show_avatars' ) ) {
    				echo get_avatar( $comment, 50, 'mystery' );
    				$comment_row_class .= ' has-avatar';
    			}
    			?>

    			<?php if ( ! $comment->comment_type || 'comment' === $comment->comment_type ) : ?>

    			<div class="dashboard-comment-wrap has-row-actions <?php echo $comment_row_class; ?>">
    			<p class="comment-meta">
    				<?php
    				// Comments might not have a post they relate to, e.g. programmatically created ones.
    				if ( $comment_post_link ) {
    					printf(
    						/* translators: 1: Comment author, 2: Post link, 3: Notification if the comment is pending. */
    						__( 'From %1$s on %2$s %3$s' ),
    						'<cite class="comment-author">' . get_comment_author_link( $comment ) . '</cite>',
    						$comment_post_link,
    						'<span class="approve">' . __( '[Pending]' ) . '</span>'
    					);
    				} else {
    					printf(
    						/* translators: 1: Comment author, 2: Notification if the comment is pending. */
    						__( 'From %1$s %2$s' ),
    						'<cite class="comment-author">' . get_comment_author_link( $comment ) . '</cite>',
    						'<span class="approve">' . __( '[Pending]' ) . '</span>'
    					);
    				}
    				?>
    			</p>

    				<?php
    			else :
    				switch ( $comment->comment_type ) {
    					case 'pingback':
    						$type = __( 'Pingback' );
    						break;
    					case 'trackback':
    						$type = __( 'Trackback' );
    						break;
    					default:
    						$type = ucwords( $comment->comment_type );
    				}
    				$type = esc_html( $type );
    				?>
    			<div class="dashboard-comment-wrap has-row-actions">
    			<p class="comment-meta">
    				<?php
    				// Pingbacks, Trackbacks or custom comment types might not have a post they relate to, e.g. programmatically created ones.
    				if ( $comment_post_link ) {
    					printf(
    						/* translators: 1: Type of comment, 2: Post link, 3: Notification if the comment is pending. */
    						_x( '%1$s on %2$s %3$s', 'dashboard' ),
    						"<strong>$type</strong>",
    						$comment_post_link,
    						'<span class="approve">' . __( '[Pending]' ) . '</span>'
    					);
    				} else {
    					printf(
    						/* translators: 1: Type of comment, 2: Notification if the comment is pending. */
    						_x( '%1$s %2$s', 'dashboard' ),
    						"<strong>$type</strong>",
    						'<span class="approve">' . __( '[Pending]' ) . '</span>'
    					);
    				}
    				?>
    			</p>
    			<p class="comment-author"><?php comment_author_link( $comment ); ?></p>

    			<?php endif; // comment_type ?>
    			<blockquote><p><?php comment_excerpt( $comment ); ?></p></blockquote>
    			<?php if ( $actions_string ) : ?>
    			<p class="row-actions"><?php echo $actions_string; ?></p>
    			<?php endif; ?>
    			</div>
    		</li>
    	<?php
    	$GLOBALS['comment'] = null;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/dashboard.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-admin/includes/dashboard.php#L711)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-admin/includes/dashboard.php#L711-L926)

## 󠀁[Hooks](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#hooks)󠁿

 [apply_filters( ‘comment_row_actions’, string[] $actions, WP_Comment $comment )](https://developer.wordpress.org/reference/hooks/comment_row_actions/)

Filters the action links displayed for each comment in the Comments list table.

## 󠀁[Related](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#related)󠁿

| Uses | Description | 
| [_draft_or_post_title()](https://developer.wordpress.org/reference/functions/_draft_or_post_title/)`wp-admin/includes/template.php` |

Gets the post title.

  | 
| [esc_attr__()](https://developer.wordpress.org/reference/functions/esc_attr__/)`wp-includes/l10n.php` |

Retrieves the translation of $text and escapes it for safe use in an attribute.

  | 
| [get_avatar()](https://developer.wordpress.org/reference/functions/get_avatar/)`wp-includes/pluggable.php` |

Retrieves the avatar `<img>` tag for a user, email address, MD5 hash, comment, or post.

  | 
| [get_the_permalink()](https://developer.wordpress.org/reference/functions/get_the_permalink/)`wp-includes/link-template.php` |

Retrieves the full permalink for the current post or post ID.

  | 
| [get_comment_link()](https://developer.wordpress.org/reference/functions/get_comment_link/)`wp-includes/comment-template.php` |

Retrieves the link to a given comment.

  | 
| [comment_class()](https://developer.wordpress.org/reference/functions/comment_class/)`wp-includes/comment-template.php` |

Generates semantic classes for each comment element.

  | 
| [comment_excerpt()](https://developer.wordpress.org/reference/functions/comment_excerpt/)`wp-includes/comment-template.php` |

Displays the excerpt of the current comment.

  | 
| [get_comment_author_link()](https://developer.wordpress.org/reference/functions/get_comment_author_link/)`wp-includes/comment-template.php` |

Retrieves the HTML link to the URL of the author of the current comment.

  | 
| [comment_author_link()](https://developer.wordpress.org/reference/functions/comment_author_link/)`wp-includes/comment-template.php` |

Displays the HTML link to the URL of the author of the current comment.

  | 
| [wp_get_comment_status()](https://developer.wordpress.org/reference/functions/wp_get_comment_status/)`wp-includes/comment.php` |

Retrieves the status of a comment by comment ID.

  | 
| [current_user_can()](https://developer.wordpress.org/reference/functions/current_user_can/)`wp-includes/capabilities.php` |

Returns whether the current user has the specified capability.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [_x()](https://developer.wordpress.org/reference/functions/_x/)`wp-includes/l10n.php` |

Retrieves translated string with gettext context.

  | 
| [esc_url()](https://developer.wordpress.org/reference/functions/esc_url/)`wp-includes/formatting.php` |

Checks and cleans a URL.

  | 
| [esc_html()](https://developer.wordpress.org/reference/functions/esc_html/)`wp-includes/formatting.php` |

Escaping for HTML blocks.

  | 
| [wp_create_nonce()](https://developer.wordpress.org/reference/functions/wp_create_nonce/)`wp-includes/pluggable.php` |

Creates a cryptographic token tied to a specific action, user, user session, and window of time.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  | 
| [get_option()](https://developer.wordpress.org/reference/functions/get_option/)`wp-includes/option.php` |

Retrieves an option value based on an option name.

  |

[Show 13 more](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#)

| Used by | Description | 
| [wp_dashboard_recent_comments()](https://developer.wordpress.org/reference/functions/wp_dashboard_recent_comments/)`wp-admin/includes/dashboard.php` |

Show Comments section.

  | 
| [wp_ajax_replyto_comment()](https://developer.wordpress.org/reference/functions/wp_ajax_replyto_comment/)`wp-admin/includes/ajax-actions.php` |

Handles replying to a comment via AJAX.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/_wp_dashboard_recent_comments_row/?output_format=md#changelog)󠁿

| Version | Description | 
| [2.7.0](https://developer.wordpress.org/reference/since/2.7.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2F_wp_dashboard_recent_comments_row%2F)
before being able to contribute a note or feedback.