Displays a list of comments.
Description
Used in the comments.php template to list comments for a particular post.
See also
- WP_Query::$comments
Parameters
$argsstring|arrayoptional- Formatting options.
walkerobjectInstance of a Walker class to list comments. Default null.max_depthintThe maximum comments depth.stylestringThe style of list ordering. Accepts'ul','ol', or'div'.
'div'will result in no additional list markup. Default'ul'.callbackcallableCallback function to use. Default null.end-callbackcallableCallback function to use at the end. Default null.typestringType of comments to list. Accepts'all','comment','pingback','trackback','pings'. Default'all'.pageintPage ID to list comments for.per_pageintNumber of comments to list per page.avatar_sizeintHeight and width dimensions of the avatar size. Default 32.reverse_top_levelboolOrdering of the listed comments. If true, will display newest comments first. Default null.reverse_childrenboolWhether to reverse child comments in the list. Default null.formatstringHow to format the comments list. Accepts'html5','xhtml'.
Default'html5'if the theme supports it.short_pingboolWhether to output short pings. Default false.echoboolWhether to echo the output or return it. Default true.
Default:
array() $commentsWP_Comment[]optional- Array of WP_Comment objects.
Default:
null
Source
function wp_list_comments( $args = array(), $comments = null ) { global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop; $in_comment_loop = true; $comment_alt = 0; $comment_thread_alt = 0; $comment_depth = 1; $defaults = array( 'walker' => null, 'max_depth' => '', 'style' => 'ul', 'callback' => null, 'end-callback' => null, 'type' => 'all', 'page' => '', 'per_page' => '', 'avatar_size' => 32, 'reverse_top_level' => null, 'reverse_children' => '', 'format' => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml', 'short_ping' => false, 'echo' => true, ); $parsed_args = wp_parse_args( $args, $defaults ); /** * Filters the arguments used in retrieving the comment list. * * @since 4.0.0 * * @see wp_list_comments() * * @param array $parsed_args An array of arguments for displaying comments. */ $parsed_args = apply_filters( 'wp_list_comments_args', $parsed_args ); // Figure out what comments we'll be looping through ($_comments). if ( null !== $comments ) { $comments = (array) $comments; if ( empty( $comments ) ) { return; } if ( 'all' !== $parsed_args['type'] ) { $comments_by_type = separate_comments( $comments ); if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) { return; } $_comments = $comments_by_type[ $parsed_args['type'] ]; } else { $_comments = $comments; } } else { /* * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query, * perform a separate comment query and allow Walker_Comment to paginate. */ if ( $parsed_args['page'] || $parsed_args['per_page'] ) { $current_cpage = (int) get_query_var( 'cpage' ); if ( ! $current_cpage ) { $current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages; } $current_per_page = (int) get_query_var( 'comments_per_page' ); if ( (int) $parsed_args['page'] !== $current_cpage || (int) $parsed_args['per_page'] !== $current_per_page ) { $comment_args = array( 'post_id' => get_the_ID(), 'orderby' => 'comment_date_gmt', 'order' => 'ASC', 'status' => 'approve', ); if ( is_user_logged_in() ) { $comment_args['include_unapproved'] = array( get_current_user_id() ); } else { $unapproved_email = wp_get_unapproved_comment_author_email(); if ( $unapproved_email ) { $comment_args['include_unapproved'] = array( $unapproved_email ); } } $comments = get_comments( $comment_args ); if ( 'all' !== $parsed_args['type'] ) { $comments_by_type = separate_comments( $comments ); if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) { return; } $_comments = $comments_by_type[ $parsed_args['type'] ]; } else { $_comments = $comments; } } // Otherwise, fall back on the comments from `$wp_query->comments`. } else { if ( empty( $wp_query->comments ) ) { return; } if ( 'all' !== $parsed_args['type'] ) { if ( empty( $wp_query->comments_by_type ) ) { $wp_query->comments_by_type = separate_comments( $wp_query->comments ); } if ( empty( $wp_query->comments_by_type[ $parsed_args['type'] ] ) ) { return; } $_comments = $wp_query->comments_by_type[ $parsed_args['type'] ]; } else { $_comments = $wp_query->comments; } if ( $wp_query->max_num_comment_pages ) { $default_comments_page = get_option( 'default_comments_page' ); $cpage = (int) get_query_var( 'cpage' ); if ( 'newest' === $default_comments_page ) { $parsed_args['cpage'] = $cpage; } elseif ( 1 === $cpage ) { /* * When the first page shows the oldest comments, * post permalink is the same as the comment permalink. */ $parsed_args['cpage'] = ''; } else { $parsed_args['cpage'] = $cpage; } $parsed_args['page'] = 0; $parsed_args['per_page'] = 0; } } } if ( '' === $parsed_args['per_page'] && get_option( 'page_comments' ) ) { $parsed_args['per_page'] = get_query_var( 'comments_per_page' ); } if ( empty( $parsed_args['per_page'] ) ) { $parsed_args['per_page'] = 0; $parsed_args['page'] = 0; } if ( '' === $parsed_args['max_depth'] ) { if ( get_option( 'thread_comments' ) ) { $parsed_args['max_depth'] = get_option( 'thread_comments_depth' ); } else { $parsed_args['max_depth'] = -1; } } if ( '' === $parsed_args['page'] ) { if ( empty( $overridden_cpage ) ) { $parsed_args['page'] = get_query_var( 'cpage' ); } else { $threaded = ( -1 !== (int) $parsed_args['max_depth'] ); $parsed_args['page'] = ( 'newest' === get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1; set_query_var( 'cpage', $parsed_args['page'] ); } } // Validation check. $parsed_args['page'] = (int) $parsed_args['page']; $parsed_args['per_page'] = (int) $parsed_args['per_page']; if ( 0 === $parsed_args['page'] && 0 !== $parsed_args['per_page'] ) { $parsed_args['page'] = 1; } if ( null === $parsed_args['reverse_top_level'] ) { $parsed_args['reverse_top_level'] = ( 'desc' === get_option( 'comment_order' ) ); } if ( empty( $parsed_args['walker'] ) ) { $walker = new Walker_Comment(); } else { $walker = $parsed_args['walker']; } $output = $walker->paged_walk( $_comments, $parsed_args['max_depth'], $parsed_args['page'], $parsed_args['per_page'], $parsed_args ); $in_comment_loop = false; if ( $parsed_args['echo'] ) { echo $output; } else { return $output; } } Hooks
- apply_filters( ‘wp_list_comments_args’,
array $parsed_args ) Filters the arguments used in retrieving the comment list.
Changelog
| Version | Description |
|---|---|
| 2.7.0 | Introduced. |
Example migrated from Codex:
Comments Only With A Custom Comment Display
Displays just comments (no pingbacks or trackbacks) while using a custom callback function to control the look of the comment. You may want to add a
max_depth=Xparameter, if the reply links are not appearing.You will need to define your custom callback function in your theme’s functions.php file. Here is an example:
Note the lack of a trailing
</li>. In order to accommodate nested replies, WordPress will add the appropriate closing tag after listing any child elements.If you are using WordPress 4.9.6 or higher and not showing “Comment is awaiting moderation” alert.
You can follow the steps below.
– ) Settings -> Discussion -> enable “Show comments cookies opt-in checkbox.”
– ) After activating checkbox will show on comments form like this. “Save my name, email, and website in this browser for the next time I comment.”
That’s it.
If you want to customize this checkbox field, you can use this code.
wp_list_comments()will not do anything by itself. It has to be called from inside thecomments templatefile.An example:
The page/post file where you want to insert comments:
Then, in
comments.php:Example migrated from Codex:
Outputs an ordered list of comments for a specific page or post. Things like threading or paging being enabled or disabled are controlled via the Settings Discussion SubPanel.
Customize the default wp_list_comments() ;
Example migrated from Codex:
Default Usage
Outputs an ordered list of the comments. Things like threading or paging being enabled or disabled are controlled via the Settings Discussion SubPanel.