X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/03f2fa83c13c1b532284205fa7efcab9b8b2c41f..8d3bb1a5dcfdea9857d3c88c3751f09593e34dc8:/wp-includes/comment-template.php diff --git a/wp-includes/comment-template.php b/wp-includes/comment-template.php index ada53c89..42ebd41e 100644 --- a/wp-includes/comment-template.php +++ b/wp-includes/comment-template.php @@ -34,7 +34,7 @@ function get_comment_author( $comment_ID = 0 ) { } /** - * Filter the returned comment author name. + * Filters the returned comment author name. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. @@ -60,7 +60,7 @@ function comment_author( $comment_ID = 0 ) { $author = get_comment_author( $comment ); /** - * Filter the comment author's name for display. + * Filters the comment author's name for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. @@ -85,7 +85,7 @@ function get_comment_author_email( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); /** - * Filter the comment author's returned email address. + * Filters the comment author's returned email address. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. @@ -102,7 +102,7 @@ function get_comment_author_email( $comment_ID = 0 ) { * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commentors' email address. Most assume that - * their email address will not appear in raw form on the blog. Doing so will + * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * @@ -117,7 +117,7 @@ function comment_author_email( $comment_ID = 0 ) { $author_email = get_comment_author_email( $comment ); /** - * Filter the comment author's email for display. + * Filters the comment author's email for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. @@ -133,20 +133,23 @@ function comment_author_email( $comment_ID = 0 ) { * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commentors' email address. Most assume that - * their email address will not appear in raw form on the blog. Doing so will + * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 0.71 + * @since 4.6.0 Added the `$comment` parameter. * - * @param string $linktext Optional. Text to display instead of the comment author's email address. - * Default empty. - * @param string $before Optional. Text or HTML to display before the email link. Default empty. - * @param string $after Optional. Text or HTML to display after the email link. Default empty. + * @param string $linktext Optional. Text to display instead of the comment author's email address. + * Default empty. + * @param string $before Optional. Text or HTML to display before the email link. Default empty. + * @param string $after Optional. Text or HTML to display after the email link. Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. */ -function comment_author_email_link( $linktext = '', $before = '', $after = '' ) { - if ( $link = get_comment_author_email_link( $linktext, $before, $after ) ) +function comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { + if ( $link = get_comment_author_email_link( $linktext, $before, $after, $comment ) ) { echo $link; + } } /** @@ -154,22 +157,26 @@ function comment_author_email_link( $linktext = '', $before = '', $after = '' ) * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commentors' email address. Most assume that - * their email address will not appear in raw form on the blog. Doing so will + * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 2.7.0 + * @since 4.6.0 Added the `$comment` parameter. * - * @param string $linktext Optional. Text to display instead of the comment author's email address. - * Default empty. - * @param string $before Optional. Text or HTML to display before the email link. Default empty. - * @param string $after Optional. Text or HTML to display after the email link. Default empty. - * @return string + * @param string $linktext Optional. Text to display instead of the comment author's email address. + * Default empty. + * @param string $before Optional. Text or HTML to display before the email link. Default empty. + * @param string $after Optional. Text or HTML to display after the email link. Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. + * @return string HTML markup for the comment author email link. By default, the email address is obfuscated + * via the {@see 'comment_email'} filter with antispambot(). */ -function get_comment_author_email_link( $linktext = '', $before = '', $after = '' ) { - $comment = get_comment(); +function get_comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { + $comment = get_comment( $comment ); + /** - * Filter the comment author's email for display. + * Filters the comment author's email for display. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. @@ -181,6 +188,7 @@ function get_comment_author_email_link( $linktext = '', $before = '', $after = ' * @param WP_Comment $comment The comment object. */ $email = apply_filters( 'comment_email', $comment->comment_author_email, $comment ); + if ((!empty($email)) && ($email != '@')) { $display = ($linktext != '') ? $linktext : $email; $return = $before; @@ -216,7 +224,7 @@ function get_comment_author_link( $comment_ID = 0 ) { $return = "$author"; /** - * Filter the comment author's link for display. + * Filters the comment author's link for display. * * @since 1.5.0 * @since 4.1.0 The `$author` and `$comment_ID` parameters were added. @@ -256,7 +264,7 @@ function get_comment_author_IP( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); /** - * Filter the comment author's returned IP address. + * Filters the comment author's returned IP address. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. @@ -293,11 +301,16 @@ function comment_author_IP( $comment_ID = 0 ) { */ function get_comment_author_url( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); - $url = ('http://' == $comment->comment_author_url) ? '' : $comment->comment_author_url; - $url = esc_url( $url, array('http', 'https') ); + $url = ''; + $id = 0; + if ( ! empty( $comment ) ) { + $author_url = ( 'http://' == $comment->comment_author_url ) ? '' : $comment->comment_author_url; + $url = esc_url( $author_url, array( 'http', 'https' ) ); + $id = $comment->ID; + } /** - * Filter the comment author's URL. + * Filters the comment author's URL. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. @@ -306,7 +319,7 @@ function get_comment_author_url( $comment_ID = 0 ) { * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ - return apply_filters( 'get_comment_author_url', $url, $comment->comment_ID, $comment ); + return apply_filters( 'get_comment_author_url', $url, $id, $comment ); } /** @@ -323,7 +336,7 @@ function comment_author_url( $comment_ID = 0 ) { $author_url = get_comment_author_url( $comment ); /** - * Filter the comment author's URL for display. + * Filters the comment author's URL for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. @@ -345,17 +358,20 @@ function comment_author_url( $comment_ID = 0 ) { * in the order of $before, link, and finally $after. * * @since 1.5.0 + * @since 4.6.0 Added the `$comment` parameter. * - * @param string $linktext Optional. The text to display instead of the comment - * author's email address. Default empty. - * @param string $before Optional. The text or HTML to display before the email link. - * Default empty. - * @param string $after Optional. The text or HTML to display after the email link. - * Default empty. + * @param string $linktext Optional. The text to display instead of the comment + * author's email address. Default empty. + * @param string $before Optional. The text or HTML to display before the email link. + * Default empty. + * @param string $after Optional. The text or HTML to display after the email link. + * Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. + * Default is the current comment. * @return string The HTML link between the $before and $after parameters. */ -function get_comment_author_url_link( $linktext = '', $before = '', $after = '' ) { - $url = get_comment_author_url(); +function get_comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { + $url = get_comment_author_url( $comment ); $display = ($linktext != '') ? $linktext : $url; $display = str_replace( 'http://www.', '', $display ); $display = str_replace( 'http://', '', $display ); @@ -367,7 +383,7 @@ function get_comment_author_url_link( $linktext = '', $before = '', $after = '' $return = "$before$display$after"; /** - * Filter the comment author's returned URL link. + * Filters the comment author's returned URL link. * * @since 1.5.0 * @@ -380,16 +396,19 @@ function get_comment_author_url_link( $linktext = '', $before = '', $after = '' * Displays the HTML link of the url of the author of the current comment. * * @since 0.71 + * @since 4.6.0 Added the `$comment` parameter. * - * @param string $linktext Optional. Text to display instead of the comment author's - * email address. Default empty. - * @param string $before Optional. Text or HTML to display before the email link. - * Default empty. - * @param string $after Optional. Text or HTML to display after the email link. - * Default empty. + * @param string $linktext Optional. Text to display instead of the comment author's + * email address. Default empty. + * @param string $before Optional. Text or HTML to display before the email link. + * Default empty. + * @param string $after Optional. Text or HTML to display after the email link. + * Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. + * Default is the current comment. */ -function comment_author_url_link( $linktext = '', $before = '', $after = '' ) { - echo get_comment_author_url_link( $linktext, $before, $after ); +function comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { + echo get_comment_author_url_link( $linktext, $before, $after, $comment ); } /** @@ -493,7 +512,7 @@ function get_comment_class( $class = '', $comment_id = null, $post_id = null ) { $classes = array_map('esc_attr', $classes); /** - * Filter the returned CSS classes for the current comment. + * Filters the returned CSS classes for the current comment. * * @since 2.7.0 * @@ -524,7 +543,7 @@ function get_comment_date( $d = '', $comment_ID = 0 ) { else $date = mysql2date($d, $comment->comment_date); /** - * Filter the returned comment date. + * Filters the returned comment date. * * @since 1.5.0 * @@ -569,7 +588,7 @@ function get_comment_excerpt( $comment_ID = 0 ) { $words = explode( ' ', $comment_text ); /** - * Filter the amount of words used in the comment excerpt. + * Filters the amount of words used in the comment excerpt. * * @since 4.4.0 * @@ -587,7 +606,7 @@ function get_comment_excerpt( $comment_ID = 0 ) { $excerpt .= '…'; } /** - * Filter the retrieved comment excerpt. + * Filters the retrieved comment excerpt. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. @@ -613,7 +632,7 @@ function comment_excerpt( $comment_ID = 0 ) { $comment_excerpt = get_comment_excerpt( $comment ); /** - * Filter the comment excerpt for display. + * Filters the comment excerpt for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. @@ -635,7 +654,7 @@ function get_comment_ID() { $comment = get_comment(); /** - * Filter the returned comment ID. + * Filters the returned comment ID. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` parameter was added. @@ -670,12 +689,13 @@ function comment_ID() { * @param array $args { * An array of optional arguments to override the defaults. * - * @type string $type Passed to {@see get_page_of_comment()}. + * @type string $type Passed to get_page_of_comment(). * @type int $page Current page of comments, for calculating comment pagination. * @type int $per_page Per-page value for comment pagination. - * @type int $max_depth Passed to {@see get_page_of_comment()}. - * @type int|string $cpage Value to use for the comment's "comment-page" or "cpage" value. If provided, this - * value overrides any value calculated from `$page` and `$per_page`. + * @type int $max_depth Passed to get_page_of_comment(). + * @type int|string $cpage Value to use for the comment's "comment-page" or "cpage" value. + * If provided, this value overrides any value calculated from `$page` + * and `$per_page`. * } * @return string The permalink to the given comment. */ @@ -684,7 +704,7 @@ function get_comment_link( $comment = null, $args = array() ) { $comment = get_comment($comment); - // Backwards compat + // Back-compat. if ( ! is_array( $args ) ) { $args = array( 'page' => $args ); } @@ -730,13 +750,12 @@ function get_comment_link( $comment = null, $args = array() ) { * If the default page displays the oldest comments, the permalinks for comments on the default page * do not need a 'cpage' query var. */ - $default_comments_page = get_option( 'default_comments_page' ); if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) { $cpage = ''; } } - if ( $cpage ) { + if ( $cpage && get_option( 'page_comments' ) ) { if ( $wp_rewrite->using_permalinks() ) { if ( $cpage ) { $link = trailingslashit( $link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage; @@ -756,7 +775,7 @@ function get_comment_link( $comment = null, $args = array() ) { $link = $link . '#comment-' . $comment->comment_ID; /** - * Filter the returned single comment permalink. + * Filters the returned single comment permalink. * * @since 2.8.0 * @since 4.4.0 Added the `$cpage` parameter. @@ -784,7 +803,7 @@ function get_comments_link( $post_id = 0 ) { $comments_link = get_permalink( $post_id ) . $hash; /** - * Filter the returned post comments permalink. + * Filters the returned post comments permalink. * * @since 3.6.0 * @@ -806,7 +825,7 @@ function comments_link( $deprecated = '', $deprecated_2 = '' ) { if ( !empty( $deprecated ) ) _deprecated_argument( __FUNCTION__, '0.72' ); if ( !empty( $deprecated_2 ) ) - _deprecated_argument( __FUNCTION__, '1.3' ); + _deprecated_argument( __FUNCTION__, '1.3.0' ); echo esc_url( get_comments_link() ); } @@ -829,7 +848,7 @@ function get_comments_number( $post_id = 0 ) { } /** - * Filter the returned comment count for a post. + * Filters the returned comment count for a post. * * @since 1.5.0 * @@ -851,7 +870,7 @@ function get_comments_number( $post_id = 0 ) { */ function comments_number( $zero = false, $one = false, $more = false, $deprecated = '' ) { if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '1.3' ); + _deprecated_argument( __FUNCTION__, '1.3.0' ); } echo get_comments_number_text( $zero, $one, $more ); } @@ -874,6 +893,27 @@ function get_comments_number_text( $zero = false, $one = false, $more = false ) $output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) ); } else { // % Comments + /* translators: If comment number in your language requires declension, + * translate this to 'on'. Do not translate into your own language. + */ + if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) { + $text = preg_replace( '#.+?#', '', $more ); + $text = preg_replace( '/&.+?;/', '', $text ); // Kill entities + $text = trim( strip_tags( $text ), '% ' ); + + // Replace '% Comments' with a proper plural form + if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) { + /* translators: %s: number of comments */ + $new_text = _n( '%s Comment', '%s Comments', $number ); + $new_text = trim( sprintf( $new_text, '' ) ); + + $more = str_replace( $text, $new_text, $more ); + if ( false === strpos( $more, '%' ) ) { + $more = '% ' . $more; + } + } + } + $output = str_replace( '%', number_format_i18n( $number ), $more ); } } elseif ( $number == 0 ) { @@ -882,7 +922,7 @@ function get_comments_number_text( $zero = false, $one = false, $more = false ) $output = ( false === $one ) ? __( '1 Comment' ) : $one; } /** - * Filter the comments count for display. + * Filters the comments count for display. * * @since 1.5.0 * @@ -912,7 +952,7 @@ function get_comment_text( $comment_ID = 0, $args = array() ) { $comment = get_comment( $comment_ID ); /** - * Filter the text of a comment. + * Filters the text of a comment. * * @since 1.5.0 * @@ -942,7 +982,7 @@ function comment_text( $comment_ID = 0, $args = array() ) { $comment_text = get_comment_text( $comment, $args ); /** - * Filter the text of a comment to be displayed. + * Filters the text of a comment to be displayed. * * @since 1.2.0 * @@ -976,7 +1016,7 @@ function get_comment_time( $d = '', $gmt = false, $translate = true ) { $date = mysql2date($d, $comment_date, $translate); /** - * Filter the returned comment time. + * Filters the returned comment time. * * @since 1.5.0 * @@ -1016,7 +1056,7 @@ function get_comment_type( $comment_ID = 0 ) { $comment->comment_type = 'comment'; /** - * Filter the returned comment type. + * Filters the returned comment type. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. @@ -1072,7 +1112,7 @@ function get_trackback_url() { $tb_url = get_option('siteurl') . '/wp-trackback.php?p=' . get_the_ID(); /** - * Filter the returned trackback URL. + * Filters the returned trackback URL. * * @since 2.2.0 * @@ -1092,7 +1132,7 @@ function get_trackback_url() { */ function trackback_url( $deprecated_echo = true ) { if ( true !== $deprecated_echo ) { - _deprecated_argument( __FUNCTION__, '2.5', + _deprecated_argument( __FUNCTION__, '2.5.0', /* translators: %s: get_trackback_url() */ sprintf( __( 'Use %s instead if you do not want the value echoed.' ), 'get_trackback_url()' @@ -1118,7 +1158,7 @@ function trackback_url( $deprecated_echo = true ) { */ function trackback_rdf( $deprecated = '' ) { if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '2.5' ); + _deprecated_argument( __FUNCTION__, '2.5.0' ); } if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) { @@ -1154,7 +1194,7 @@ function comments_open( $post_id = null ) { $open = ( 'open' == $_post->comment_status ); /** - * Filter whether the current post is open for comments. + * Filters whether the current post is open for comments. * * @since 2.5.0 * @@ -1179,7 +1219,7 @@ function pings_open( $post_id = null ) { $open = ( 'open' == $_post->ping_status ); /** - * Filter whether the current post is open for pings. + * Filters whether the current post is open for pings. * * @since 2.5.0 * @@ -1220,16 +1260,16 @@ function wp_comment_form_unfiltered_html_nonce() { * the post does not have comments. * * Uses the WordPress database object to query for the comments. The comments - * are passed through the 'comments_array' filter hook with the list of comments + * are passed through the {@see 'comments_array'} filter hook with the list of comments * and the post ID respectively. * - * The $file path is passed through a filter hook called, 'comments_template' + * The `$file` path is passed through a filter hook called {@see 'comments_template'}, * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path * first and if it fails it will require the default comment template from the * default theme. If either does not exist, then the WordPress process will be * halted. It is advised for that reason, that the default theme is not deleted. * - * @uses $withcomments Will not try to get the comments if the post has none. + * Will not try to get the comments if the post has none. * * @since 1.5.0 * @@ -1242,6 +1282,7 @@ function wp_comment_form_unfiltered_html_nonce() { * @global int $user_ID * @global string $user_identity * @global bool $overridden_cpage + * @global bool $withcomments * * @param string $file Optional. The file to load. Default '/comments.php'. * @param bool $separate_comments Optional. Whether to separate the comments by comment type. @@ -1285,11 +1326,16 @@ function comments_template( $file = '/comments.php', $separate_comments = false 'order' => 'ASC', 'status' => 'approve', 'post_id' => $post->ID, - 'hierarchical' => 'threaded', 'no_found_rows' => false, 'update_comment_meta_cache' => false, // We lazy-load comment meta for performance. ); + if ( get_option('thread_comments') ) { + $comment_args['hierarchical'] = 'threaded'; + } else { + $comment_args['hierarchical'] = false; + } + if ( $user_ID ) { $comment_args['include_unapproved'] = array( $user_ID ); } elseif ( ! empty( $comment_author_email ) ) { @@ -1313,32 +1359,75 @@ function comments_template( $file = '/comments.php', $separate_comments = false } else { // If fetching the first page of 'newest', we need a top-level comment count. $top_level_query = new WP_Comment_Query(); - $top_level_count = $top_level_query->query( array( + $top_level_args = array( 'count' => true, 'orderby' => false, 'post_id' => $post->ID, - 'parent' => 0, - ) ); + 'status' => 'approve', + ); + + if ( $comment_args['hierarchical'] ) { + $top_level_args['parent'] = 0; + } + + if ( isset( $comment_args['include_unapproved'] ) ) { + $top_level_args['include_unapproved'] = $comment_args['include_unapproved']; + } + + $top_level_count = $top_level_query->query( $top_level_args ); $comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page; } } + /** + * Filters the arguments used to query comments in comments_template(). + * + * @since 4.5.0 + * + * @see WP_Comment_Query::__construct() + * + * @param array $comment_args { + * Array of WP_Comment_Query arguments. + * + * @type string|array $orderby Field(s) to order by. + * @type string $order Order of results. Accepts 'ASC' or 'DESC'. + * @type string $status Comment status. + * @type array $include_unapproved Array of IDs or email addresses whose unapproved comments + * will be included in results. + * @type int $post_id ID of the post. + * @type bool $no_found_rows Whether to refrain from querying for found rows. + * @type bool $update_comment_meta_cache Whether to prime cache for comment meta. + * @type bool|string $hierarchical Whether to query for comments hierarchically. + * @type int $offset Comment offset. + * @type int $number Number of comments to fetch. + * } + */ + $comment_args = apply_filters( 'comments_template_query_args', $comment_args ); $comment_query = new WP_Comment_Query( $comment_args ); $_comments = $comment_query->comments; // Trees must be flattened before they're passed to the walker. - $comments_flat = array(); - foreach ( $_comments as $_comment ) { - $comments_flat = array_merge( $comments_flat, array( $_comment ), $_comment->get_children( array( - 'format' => 'flat', - 'status' => $comment_args['status'], - 'orderby' => $comment_args['orderby'] - ) ) ); + if ( $comment_args['hierarchical'] ) { + $comments_flat = array(); + foreach ( $_comments as $_comment ) { + $comments_flat[] = $_comment; + $comment_children = $_comment->get_children( array( + 'format' => 'flat', + 'status' => $comment_args['status'], + 'orderby' => $comment_args['orderby'] + ) ); + + foreach ( $comment_children as $comment_child ) { + $comments_flat[] = $comment_child; + } + } + } else { + $comments_flat = $_comments; } /** - * Filter the comments array. + * Filters the comments array. * * @since 2.1.0 * @@ -1347,9 +1436,6 @@ function comments_template( $file = '/comments.php', $separate_comments = false */ $wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID ); - // Set up lazy-loading for comment metadata. - add_action( 'get_comment_metadata', array( $wp_query, 'lazyload_comment_meta' ), 10, 2 ); - $comments = &$wp_query->comments; $wp_query->comment_count = count($wp_query->comments); $wp_query->max_num_comment_pages = $comment_query->max_num_pages; @@ -1372,7 +1458,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false $theme_template = STYLESHEETPATH . $file; /** - * Filter the path to the theme template file used for the comments template. + * Filters the path to the theme template file used for the comments template. * * @since 1.5.1 * @@ -1388,45 +1474,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false } /** - * Display the JS popup script to show a comment. - * - * If the $file parameter is empty, then the home page is assumed. The defaults - * for the window are 400px by 400px. - * - * For the comment link popup to work, this function has to be called or the - * normal comment link will be assumed. - * - * @global string $wpcommentspopupfile The URL to use for the popup window. - * @global int $wpcommentsjavascript Whether to use JavaScript. Set when function is called. - * - * @since 0.71 - * - * @param int $width Optional. The width of the popup window. Default 400. - * @param int $height Optional. The height of the popup window. Default 400. - * @param string $file Optional. Sets the location of the popup window. - */ -function comments_popup_script( $width = 400, $height = 400, $file = '' ) { - global $wpcommentspopupfile, $wpcommentsjavascript; - - if (empty ($file)) { - $wpcommentspopupfile = ''; // Use the index. - } else { - $wpcommentspopupfile = $file; - } - - $wpcommentsjavascript = 1; - $javascript = "\n"; - echo $javascript; -} - -/** - * Displays the link to the comments popup window for the current post ID. - * - * Is not meant to be displayed on single posts and pages. Should be used - * on the lists of posts - * - * @global string $wpcommentspopupfile The URL to use for the popup window. - * @global int $wpcommentsjavascript Whether to use JavaScript. Set when function is called. + * Displays the link to the comments for the current post ID. * * @since 0.71 * @@ -1440,8 +1488,6 @@ function comments_popup_script( $width = 400, $height = 400, $file = '' ) { * Default false. */ function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { - global $wpcommentspopupfile, $wpcommentsjavascript; - $id = get_the_ID(); $title = get_the_title(); $number = get_comments_number( $id ); @@ -1478,31 +1524,21 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c } echo '' . $text . ''; /** - * Filter the cancel comment reply link HTML. + * Filters the cancel comment reply link HTML. * * @since 2.7.0 * @@ -1783,7 +1819,7 @@ function get_comment_id_fields( $id = 0 ) { $result .= "\n"; /** - * Filter the returned comment id fields. + * Filters the returned comment id fields. * * @since 3.0.0 * @@ -1810,8 +1846,13 @@ function comment_id_fields( $id = 0 ) { * * Only affects users with JavaScript disabled. * + * @internal The $comment global must be present to allow template tags access to the current + * comment. See https://core.trac.wordpress.org/changeset/36512. + * * @since 2.7.0 * + * @global WP_Comment $comment Current comment. + * * @param string $noreplytext Optional. Text to display when not replying to a comment. * Default false. * @param string $replytext Optional. Text to display when replying to a comment. @@ -1821,7 +1862,7 @@ function comment_id_fields( $id = 0 ) { * to their comment. Default true. */ function comment_form_title( $noreplytext = false, $replytext = false, $linktoparent = true ) { - $comment = get_comment(); + global $comment; if ( false === $noreplytext ) $noreplytext = __( 'Leave a Reply' ); if ( false === $replytext ) $replytext = __( 'Leave a Reply to %s' ); @@ -1831,6 +1872,7 @@ function comment_form_title( $noreplytext = false, $replytext = false, $linktopa if ( 0 == $replytoid ) echo $noreplytext; else { + // Sets the global so that template tags can be used in the comment form. $comment = get_comment($replytoid); $author = ( $linktoparent ) ? '' . get_comment_author( $comment ) . '' : get_comment_author( $comment ); printf( $replytext, $author ); @@ -1903,7 +1945,7 @@ function wp_list_comments( $args = array(), $comments = null ) { $r = wp_parse_args( $args, $defaults ); /** - * Filter the arguments used in retrieving the comment list. + * Filters the arguments used in retrieving the comment list. * * @since 4.0.0 * @@ -1927,34 +1969,81 @@ function wp_list_comments( $args = array(), $comments = null ) { $_comments = $comments; } } else { - if ( empty($wp_query->comments) ) - return; - if ( 'all' != $r['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[$r['type']]) ) - return; - $_comments = $wp_query->comments_by_type[$r['type']]; - } else { - $_comments = $wp_query->comments; - } + /* + * 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 ( $r['page'] || $r['per_page'] ) { + $current_cpage = 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 = get_query_var( 'comments_per_page' ); + if ( $r['page'] != $current_cpage || $r['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'] = get_current_user_id(); + } else { + $commenter = wp_get_current_commenter(); + if ( $commenter['comment_author_email'] ) { + $comment_args['include_unapproved'] = $commenter['comment_author_email']; + } + } + + $comments = get_comments( $comment_args ); - // Pagination is already handled by `WP_Comment_Query`, so we tell Walker not to bother. - if ( $wp_query->max_num_comment_pages ) { - $default_comments_page = get_option( 'default_comments_page' ); - $cpage = get_query_var( 'cpage' ); - if ( 'newest' === $default_comments_page ) { - $r['cpage'] = $cpage; + if ( 'all' != $r['type'] ) { + $comments_by_type = separate_comments( $comments ); + if ( empty( $comments_by_type[ $r['type'] ] ) ) { + return; + } + + $_comments = $comments_by_type[ $r['type'] ]; + } else { + $_comments = $comments; + } + } - // When first page shows oldest comments, post permalink is the same as the comment permalink. - } elseif ( $cpage == 1 ) { - $r['cpage'] = ''; + // Otherwise, fall back on the comments from `$wp_query->comments`. + } else { + if ( empty($wp_query->comments) ) + return; + if ( 'all' != $r['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[$r['type']]) ) + return; + $_comments = $wp_query->comments_by_type[$r['type']]; } else { - $r['cpage'] = $cpage; + $_comments = $wp_query->comments; } - $r['page'] = 0; - $r['per_page'] = 0; + if ( $wp_query->max_num_comment_pages ) { + $default_comments_page = get_option( 'default_comments_page' ); + $cpage = get_query_var( 'cpage' ); + if ( 'newest' === $default_comments_page ) { + $r['cpage'] = $cpage; + + /* + * When first page shows oldest comments, post permalink is the same as + * the comment permalink. + */ + } elseif ( $cpage == 1 ) { + $r['cpage'] = ''; + } else { + $r['cpage'] = $cpage; + } + + $r['page'] = 0; + $r['per_page'] = 0; + } } } @@ -1991,6 +2080,8 @@ function wp_list_comments( $args = array(), $comments = null ) { if ( null === $r['reverse_top_level'] ) $r['reverse_top_level'] = ( 'desc' == get_option('comment_order') ); + wp_queue_comments_for_comment_meta_lazyload( $_comments ); + if ( empty( $r['walker'] ) ) { $walker = new Walker_Comment; } else { @@ -2009,13 +2100,13 @@ function wp_list_comments( $args = array(), $comments = null ) { } /** - * Output a complete commenting form for use within a template. + * Outputs a complete commenting form for use within a template. * * Most strings and form fields may be controlled through the $args array passed - * into the function, while you may also choose to use the comment_form_default_fields + * into the function, while you may also choose to use the {@see 'comment_form_default_fields'} * filter to modify the array of default fields if you'd just like to add a new * one or remove a single field. All fields are also individually passed through - * a filter of the form comment_form_field_$name where $name is the key used + * a filter of the {@see 'comment_form_field_$name'} where $name is the key used * in the array of fields. * * @since 3.0.0 @@ -2023,12 +2114,15 @@ function wp_list_comments( $args = array(), $comments = null ) { * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments. * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after', * 'cancel_reply_before', and 'cancel_reply_after' arguments. + * @since 4.5.0 The 'author', 'email', and 'url' form fields are limited to 245, 100, + * and 200 characters, respectively. + * @since 4.6.0 Introduced the 'action' argument. * * @param array $args { * Optional. Default arguments and form fields to override. * * @type array $fields { - * Default comment fields, filterable by default via the 'comment_form_default_fields' hook. + * Default comment fields, filterable by default via the {@see 'comment_form_default_fields'} hook. * * @type string $author Comment author field HTML. * @type string $email Comment author email field HTML. @@ -2041,6 +2135,7 @@ function wp_list_comments( $args = array(), $comments = null ) { * if the user is not logged in. * Default 'Your email address will not be published.'. * @type string $comment_notes_after HTML element for a message displayed after the textarea field. + * @type string $action The comment form element action attribute. Default '/wp-comments-post.php'. * @type string $id_form The comment form element id attribute. Default 'commentform'. * @type string $id_submit The comment submit element id attribute. Default 'submit'. * @type string $class_form The comment form element class attribute. Default 'comment-form'. @@ -2084,17 +2179,17 @@ function comment_form( $args = array(), $post_id = null ) { $html5 = 'html5' === $args['format']; $fields = array( 'author' => '

' . ' ' . - '

', + '

', 'email' => '

' . - '

', + '

', 'url' => '

' . - '

', + '

', ); $required_text = sprintf( ' ' . __('Required fields are marked %s'), '*' ); /** - * Filter the default comment form fields. + * Filters the default comment form fields. * * @since 3.0.0 * @@ -2103,13 +2198,26 @@ function comment_form( $args = array(), $post_id = null ) { $fields = apply_filters( 'comment_form_default_fields', $fields ); $defaults = array( 'fields' => $fields, - 'comment_field' => '

', + 'comment_field' => '

', /** This filter is documented in wp-includes/link-template.php */ - 'must_log_in' => '

' . sprintf( __( 'You must be logged in to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

', + 'must_log_in' => '

' . sprintf( + /* translators: %s: login URL */ + __( 'You must be logged in to post a comment.' ), + wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) + ) . '

', /** This filter is documented in wp-includes/link-template.php */ - 'logged_in_as' => '

' . sprintf( __( 'Logged in as %2$s. Log out?' ), get_edit_user_link(), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

', + 'logged_in_as' => '

' . sprintf( + /* translators: 1: edit user link, 2: accessibility text, 3: user name, 4: logout URL */ + __( 'Logged in as %3$s. Log out?' ), + get_edit_user_link(), + /* translators: %s: user name */ + esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity ) ), + $user_identity, + wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) + ) . '

', 'comment_notes_before' => '

' . __( 'Your email address will not be published.' ) . ''. ( $req ? $required_text : '' ) . '

', 'comment_notes_after' => '', + 'action' => site_url( '/wp-comments-post.php' ), 'id_form' => 'commentform', 'id_submit' => 'submit', 'class_form' => 'comment-form', @@ -2129,9 +2237,9 @@ function comment_form( $args = array(), $post_id = null ) { ); /** - * Filter the comment form default arguments. + * Filters the comment form default arguments. * - * Use 'comment_form_default_fields' to filter the comment fields. + * Use {@see 'comment_form_default_fields'} to filter the comment fields. * * @since 3.0.0 * @@ -2174,7 +2282,7 @@ function comment_form( $args = array(), $post_id = null ) { */ do_action( 'comment_form_must_log_in_after' ); else : ?> -
> + > $args['comment_field'] ) + (array) $args['fields']; /** - * Filter the comment form fields. + * Filters the comment form fields, including the textarea. * * @since 4.4.0 * @@ -2239,7 +2347,7 @@ function comment_form( $args = array(), $post_id = null ) { if ( 'comment' === $name ) { /** - * Filter the content of the comment textarea field for display. + * Filters the content of the comment textarea field for display. * * @since 3.0.0 * @@ -2261,7 +2369,7 @@ function comment_form( $args = array(), $post_id = null ) { } /** - * Filter a comment form field for display. + * Filters a comment form field for display. * * The dynamic portion of the filter hook, `$name`, refers to the name * of the comment form field. Such as 'author', 'email', or 'url'. @@ -2292,7 +2400,7 @@ function comment_form( $args = array(), $post_id = null ) { ); /** - * Filter the submit button for the comment form to display. + * Filters the submit button for the comment form to display. * * @since 4.2.0 * @@ -2308,7 +2416,7 @@ function comment_form( $args = array(), $post_id = null ) { ); /** - * Filter the submit field for the comment form to display. + * Filters the submit field for the comment form to display. * * The submit field includes the submit button, hidden fields for the * comment form, and any wrapper markup.