]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/comment-template.php
Wordpress 4.6
[autoinstalls/wordpress.git] / wp-includes / comment-template.php
index ad5b9caf5e9e681423b23460f8be48fc060a7c43..42ebd41e3c079770417a85e9fbf3f37d8ed43180 100644 (file)
@@ -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 = "<a href='$url' rel='external nofollow' class='url'>$author</a>";
 
        /**
-        * 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<a href='$url' rel='external'>$display</a>$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 .= '&hellip;';
        }
        /**
-        * 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,7 +750,6 @@ 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 = '';
                }
@@ -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( '#<span class="screen-reader-text">.+?</span>#', '', $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.' ),
                                '<code>get_trackback_url()</code>'
@@ -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.
@@ -1339,6 +1380,30 @@ function comments_template( $file = '/comments.php', $separate_comments = false
                }
        }
 
+       /**
+        * 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;
 
@@ -1362,7 +1427,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false
        }
 
        /**
-        * Filter the comments array.
+        * Filters the comments array.
         *
         * @since 2.1.0
         *
@@ -1371,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;
@@ -1396,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
         *
@@ -1412,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 = "<script type='text/javascript'>\nfunction wpopen (macagna) {\n    window.open(macagna, '_blank', 'width=$width,height=$height,scrollbars=yes,status=yes');\n}\n</script>\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
  *
@@ -1464,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 );
@@ -1502,31 +1524,21 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c
        }
 
        echo '<a href="';
-       if ( $wpcommentsjavascript ) {
-               if ( empty( $wpcommentspopupfile ) )
-                       $home = home_url();
-               else
-                       $home = get_option('siteurl');
-               echo $home . '/' . $wpcommentspopupfile . '?comments_popup=' . $id;
-               echo '" onclick="wpopen(this.href); return false"';
+       if ( 0 == $number ) {
+               $respond_link = get_permalink() . '#respond';
+               /**
+                * Filters the respond link when a post has no comments.
+                *
+                * @since 4.4.0
+                *
+                * @param string $respond_link The default response link.
+                * @param integer $id The post ID.
+                */
+               echo apply_filters( 'respond_link', $respond_link, $id );
        } else {
-               // if comments_popup_script() is not in the template, display simple comment link
-               if ( 0 == $number ) {
-                       $respond_link = get_permalink() . '#respond';
-                       /**
-                        * Filter the respond link when a post has no comments.
-                        *
-                        * @since 4.4.0
-                        *
-                        * @param string $respond_link The default response link.
-                        * @param integer $id The post ID.
-                        */
-                       echo apply_filters( 'respond_link', $respond_link, $id );
-               } else {
-                       comments_link();
-               }
-               echo '"';
+               comments_link();
        }
+       echo '"';
 
        if ( !empty( $css_class ) ) {
                echo ' class="'.$css_class.'" ';
@@ -1534,11 +1546,11 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c
 
        $attributes = '';
        /**
-        * Filter the comments popup link attributes for display.
+        * Filters the comments link attributes for display.
         *
         * @since 2.5.0
         *
-        * @param string $attributes The comments popup link attributes. Default empty.
+        * @param string $attributes The comments link attributes. Default empty.
         */
        echo apply_filters( 'comments_popup_link_attributes', $attributes );
 
@@ -1605,7 +1617,7 @@ function get_comment_reply_link( $args = array(), $comment = null, $post = null
        }
 
        /**
-        * Filter the comment reply link arguments.
+        * Filters the comment reply link arguments.
         *
         * @since 4.1.0
         *
@@ -1635,7 +1647,7 @@ function get_comment_reply_link( $args = array(), $comment = null, $post = null
        }
 
        /**
-        * Filter the comment reply link.
+        * Filters the comment reply link.
         *
         * @since 2.7.0
         *
@@ -1724,7 +1736,7 @@ function get_post_reply_link($args = array(), $post = null) {
        $formatted_link = $args['before'] . $link . $args['after'];
 
        /**
-        * Filter the formatted post comments link HTML.
+        * Filters the formatted post comments link HTML.
         *
         * @since 2.7.0
         *
@@ -1768,7 +1780,7 @@ function get_cancel_comment_reply_link( $text = '' ) {
        $formatted_link = '<a rel="nofollow" id="cancel-comment-reply-link" href="' . $link . '"' . $style . '>' . $text . '</a>';
 
        /**
-        * Filter the cancel comment reply link HTML.
+        * Filters the cancel comment reply link HTML.
         *
         * @since 2.7.0
         *
@@ -1807,7 +1819,7 @@ function get_comment_id_fields( $id = 0 ) {
        $result .= "<input type='hidden' name='comment_parent' id='comment_parent' value='$replytoid' />\n";
 
        /**
-        * Filter the returned comment id fields.
+        * Filters the returned comment id fields.
         *
         * @since 3.0.0
         *
@@ -1834,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.
@@ -1845,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' );
@@ -1855,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 ) ? '<a href="#comment-' . get_comment_ID() . '">' . get_comment_author( $comment ) . '</a>' : get_comment_author( $comment );
                printf( $replytext, $author );
@@ -1927,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
         *
@@ -1963,13 +1981,23 @@ function wp_list_comments( $args = array(), $comments = null ) {
 
                        $current_per_page = get_query_var( 'comments_per_page' );
                        if ( $r['page'] != $current_cpage || $r['per_page'] != $current_per_page ) {
-
-                               $comments = get_comments( array(
+                               $comment_args = array(
                                        'post_id' => get_the_ID(),
                                        'orderby' => 'comment_date_gmt',
                                        'order' => 'ASC',
-                                       'status' => 'all',
-                               ) );
+                                       '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 );
 
                                if ( 'all' != $r['type'] ) {
                                        $comments_by_type = separate_comments( $comments );
@@ -2052,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 {
@@ -2070,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
@@ -2084,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.
@@ -2102,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'.
@@ -2145,17 +2179,17 @@ function comment_form( $args = array(), $post_id = null ) {
        $html5    = 'html5' === $args['format'];
        $fields   =  array(
                'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
-                           '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . $html_req . ' /></p>',
+                           '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30" maxlength="245"' . $aria_req . $html_req . ' /></p>',
                'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
-                           '<input id="email" name="email" ' . ( $html5 ? 'type="email"' : 'type="text"' ) . ' value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30" aria-describedby="email-notes"' . $aria_req . $html_req  . ' /></p>',
+                           '<input id="email" name="email" ' . ( $html5 ? 'type="email"' : 'type="text"' ) . ' value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30" maxlength="100" aria-describedby="email-notes"' . $aria_req . $html_req  . ' /></p>',
                'url'    => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label> ' .
-                           '<input id="url" name="url" ' . ( $html5 ? 'type="url"' : 'type="text"' ) . ' value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
+                           '<input id="url" name="url" ' . ( $html5 ? 'type="url"' : 'type="text"' ) . ' value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" maxlength="200" /></p>',
        );
 
        $required_text = sprintf( ' ' . __('Required fields are marked %s'), '<span class="required">*</span>' );
 
        /**
-        * Filter the default comment form fields.
+        * Filters the default comment form fields.
         *
         * @since 3.0.0
         *
@@ -2164,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'        => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label> <textarea id="comment" name="comment" cols="45" rows="8"  aria-required="true" required="required"></textarea></p>',
+               'comment_field'        => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" aria-required="true" required="required"></textarea></p>',
                /** This filter is documented in wp-includes/link-template.php */
-               'must_log_in'          => '<p class="must-log-in">' . sprintf( __( 'You must be <a href="%s">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
+               'must_log_in'          => '<p class="must-log-in">' . sprintf(
+                                             /* translators: %s: login URL */
+                                             __( 'You must be <a href="%s">logged in</a> to post a comment.' ),
+                                             wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) )
+                                         ) . '</p>',
                /** This filter is documented in wp-includes/link-template.php */
-               'logged_in_as'         => '<p class="logged-in-as">' . sprintf( __( '<a href="%1$s" aria-label="Logged in as %2$s. Edit your profile.">Logged in as %2$s</a>. <a href="%3$s">Log out?</a>' ), get_edit_user_link(), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
+               'logged_in_as'         => '<p class="logged-in-as">' . sprintf(
+                                             /* translators: 1: edit user link, 2: accessibility text, 3: user name, 4: logout URL */
+                                             __( '<a href="%1$s" aria-label="%2$s">Logged in as %3$s</a>. <a href="%4$s">Log out?</a>' ),
+                                             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 ) ) )
+                                         ) . '</p>',
                'comment_notes_before' => '<p class="comment-notes"><span id="email-notes">' . __( 'Your email address will not be published.' ) . '</span>'. ( $req ? $required_text : '' ) . '</p>',
                'comment_notes_after'  => '',
+               'action'               => site_url( '/wp-comments-post.php' ),
                'id_form'              => 'commentform',
                'id_submit'            => 'submit',
                'class_form'           => 'comment-form',
@@ -2190,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
         *
@@ -2235,7 +2282,7 @@ function comment_form( $args = array(), $post_id = null ) {
                                 */
                                do_action( 'comment_form_must_log_in_after' );
                        else : ?>
-                               <form action="<?php echo site_url( '/wp-comments-post.php' ); ?>" method="post" id="<?php echo esc_attr( $args['id_form'] ); ?>" class="<?php echo esc_attr( $args['class_form'] ); ?>"<?php echo $html5 ? ' novalidate' : ''; ?>>
+                               <form action="<?php echo esc_url( $args['action'] ); ?>" method="post" id="<?php echo esc_attr( $args['id_form'] ); ?>" class="<?php echo esc_attr( $args['class_form'] ); ?>"<?php echo $html5 ? ' novalidate' : ''; ?>>
                                        <?php
                                        /**
                                         * Fires at the top of the comment form, inside the form tag.
@@ -2246,7 +2293,7 @@ function comment_form( $args = array(), $post_id = null ) {
 
                                        if ( is_user_logged_in() ) :
                                                /**
-                                                * Filter the 'logged in' message for the comment form for display.
+                                                * Filters the 'logged in' message for the comment form for display.
                                                 *
                                                 * @since 3.0.0
                                                 *
@@ -2280,7 +2327,7 @@ function comment_form( $args = array(), $post_id = null ) {
                                        $comment_fields = array( 'comment' => $args['comment_field'] ) + (array) $args['fields'];
 
                                        /**
-                                        * Filter the comment form fields.
+                                        * Filters the comment form fields, including the textarea.
                                         *
                                         * @since 4.4.0
                                         *
@@ -2300,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
                                                         *
@@ -2322,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'.
@@ -2353,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
                                         *
@@ -2369,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.