From fa90b77ba44de8091f565a22303d56ac9ca53918 Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Sat, 26 Sep 2015 02:25:26 +0000 Subject: [PATCH] Comments: in `WP_Comment::get_children()`, accept an array so that the values for `format`, `status`, `hierarchical`, and `orderby` can be passed, instead of just `format`. The defaults for `get_comments()` include `status = 'all'` and `orderby = ''` - which is no bueno. For threaded comments, we need comments to be retrieved within bounds, so logged-out users don't see unmoderated comments on the front end, etc. Updates unit tests. See #8071. Built from https://develop.svn.wordpress.org/trunk@34569 git-svn-id: http://core.svn.wordpress.org/trunk@34533 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/class-wp-comment.php | 57 +++++++++++++++++++++++++++----- wp-includes/comment-template.php | 6 +++- wp-includes/version.php | 2 +- 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/wp-includes/class-wp-comment.php b/wp-includes/class-wp-comment.php index 7225539d10..ab6bf14b55 100644 --- a/wp-includes/class-wp-comment.php +++ b/wp-includes/class-wp-comment.php @@ -227,22 +227,61 @@ final class WP_Comment { * @since 4.4.0 * @access public * - * @param string $format Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array. - * Default 'tree'. + * @param array $args { + * Array of arguments used to pass to get_comments() and determine format. + * + * @type string $format Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array. + * Default 'tree'. + * @type string $status Comment status to limit results by. Accepts 'hold' (`comment_status=0`), + * 'approve' (`comment_status=1`), 'all', or a custom comment status. + * Default 'all'. + * @type string $hierarchical Whether to include comment descendants in the results. + * 'threaded' returns a tree, with each comment's children + * stored in a `children` property on the `WP_Comment` object. + * 'flat' returns a flat array of found comments plus their children. + * Pass `false` to leave out descendants. + * The parameter is ignored (forced to `false`) when `$fields` is 'ids' or 'counts'. + * Accepts 'threaded', 'flat', or false. Default: 'threaded'. + * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' + * or 'meta_value_num', `$meta_key` must also be defined. + * To sort by a specific `$meta_query` clause, use that + * clause's array key. Accepts 'comment_agent', + * 'comment_approved', 'comment_author', + * 'comment_author_email', 'comment_author_IP', + * 'comment_author_url', 'comment_content', 'comment_date', + * 'comment_date_gmt', 'comment_ID', 'comment_karma', + * 'comment_parent', 'comment_post_ID', 'comment_type', + * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', + * the value of $meta_key, and the array keys of + * `$meta_query`. Also accepts false, an empty array, or + * 'none' to disable `ORDER BY` clause. + * } * @return array Array of `WP_Comment` objects. */ - public function get_children( $format = 'tree' ) { + public function get_children( $args = array() ) { + $defaults = array( + 'format' => 'tree', + 'status' => 'all', + 'hierarchical' => 'threaded', + 'orderby' => '', + ); + + $_args = wp_parse_args( $args, $defaults ); + $_args['parent'] = $this->comment_ID; + if ( is_null( $this->children ) ) { - $this->children = get_comments( array( - 'parent' => $this->comment_ID, - 'hierarchical' => 'threaded', - ) ); + $this->children = get_comments( $_args ); } - if ( 'flat' === $format ) { + if ( 'flat' === $_args['format'] ) { $children = array(); foreach ( $this->children as $child ) { - $children = array_merge( $children, array( $child ), $child->get_children( 'flat' ) ); + $child_args = $_args; + $child_args['format'] = 'flat'; + // get_children() resets this value automatically. + unset( $child_args['parent'] ); + + $children = array_merge( $children, array( $child ), $child->get_children( $child_args ) ); } } else { $children = $this->children; diff --git a/wp-includes/comment-template.php b/wp-includes/comment-template.php index b3ba1aea48..5146c9f908 100644 --- a/wp-includes/comment-template.php +++ b/wp-includes/comment-template.php @@ -1307,7 +1307,11 @@ function comments_template( $file = '/comments.php', $separate_comments = false // 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( 'flat' ) ); + $comments_flat = array_merge( $comments_flat, array( $_comment ), $_comment->get_children( array( + 'format' => 'flat', + 'status' => $comment_args['status'], + 'orderby' => $comment_args['orderby'] + ) ) ); } /** diff --git a/wp-includes/version.php b/wp-includes/version.php index 3c15eaf798..13d3b5ef57 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.4-alpha-34568'; +$wp_version = '4.4-alpha-34569'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.