diff -r be944660c56a -r 3d72ae0968f4 wp/wp-includes/class-wp-comment-query.php --- a/wp/wp-includes/class-wp-comment-query.php Wed Sep 21 18:19:35 2022 +0200 +++ b/wp/wp-includes/class-wp-comment-query.php Tue Sep 27 16:37:53 2022 +0200 @@ -93,7 +93,7 @@ * List of comments located by the query. * * @since 4.0.0 - * @var array + * @var int[]|WP_Comment[] */ public $comments; @@ -141,114 +141,134 @@ * @since 4.5.0 Introduced the `$author_url` argument. * @since 4.6.0 Introduced the `$cache_domain` argument. * @since 4.9.0 Introduced the `$paged` argument. + * @since 5.1.0 Introduced the `$meta_compare_key` argument. + * @since 5.3.0 Introduced the `$meta_type_key` argument. * * @param string|array $query { * Optional. Array or query string of comment query parameters. Default empty. * - * @type string $author_email Comment author email address. Default empty. - * @type string $author_url Comment author URL. Default empty. - * @type int[] $author__in Array of author IDs to include comments for. Default empty. - * @type int[] $author__not_in Array of author IDs to exclude comments for. Default empty. - * @type int[] $comment__in Array of comment IDs to include. Default empty. - * @type int[] $comment__not_in Array of comment IDs to exclude. Default empty. - * @type bool $count Whether to return a comment count (true) or array of - * comment objects (false). Default false. - * @type array $date_query Date query clauses to limit comments by. See WP_Date_Query. - * Default null. - * @type string $fields Comment fields to return. Accepts 'ids' for comment IDs - * only or empty for all fields. Default empty. - * @type int $ID Currently unused. - * @type array $include_unapproved Array of IDs or email addresses of users whose unapproved - * comments will be returned by the query regardless of - * `$status`. Default empty. - * @type int $karma Karma score to retrieve matching comments for. - * Default empty. - * @type string $meta_key Include comments with a matching comment meta key. - * Default empty. - * @type string $meta_value Include comments with a matching comment meta value. - * Requires `$meta_key` to be set. Default empty. - * @type array $meta_query Meta query clauses to limit retrieved comments by. - * See WP_Meta_Query. Default empty. - * @type int $number Maximum number of comments to retrieve. - * Default empty (no limit). - * @type int $paged When used with $number, defines the page of results to return. - * When used with $offset, $offset takes precedence. Default 1. - * @type int $offset Number of comments to offset the query. Used to build - * LIMIT clause. Default 0. - * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. - * Default: true. - * @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. - * Default: 'comment_date_gmt'. - * @type string $order How to order retrieved comments. Accepts 'ASC', 'DESC'. - * Default: 'DESC'. - * @type int $parent Parent ID of comment to retrieve children of. - * Default empty. - * @type int[] $parent__in Array of parent IDs of comments to retrieve children for. - * Default empty. - * @type int[] $parent__not_in Array of parent IDs of comments *not* to retrieve - * children for. Default empty. - * @type int[] $post_author__in Array of author IDs to retrieve comments for. - * Default empty. - * @type int[] $post_author__not_in Array of author IDs *not* to retrieve comments for. - * Default empty. - * @type int $post_ID Currently unused. - * @type int $post_id Limit results to those affiliated with a given post ID. - * Default 0. - * @type int[] $post__in Array of post IDs to include affiliated comments for. - * Default empty. - * @type int[] $post__not_in Array of post IDs to exclude affiliated comments for. - * Default empty. - * @type int $post_author Post author ID to limit results by. Default empty. - * @type string|array $post_status Post status or array of post statuses to retrieve - * affiliated comments for. Pass 'any' to match any value. - * Default empty. - * @type string $post_type Post type or array of post types to retrieve affiliated - * comments for. Pass 'any' to match any value. Default empty. - * @type string $post_name Post name to retrieve affiliated comments for. - * Default empty. - * @type int $post_parent Post parent ID to retrieve affiliated comments for. - * Default empty. - * @type string $search Search term(s) to retrieve matching comments for. - * Default empty. - * @type string|array $status Comment statuses to limit results by. Accepts an array - * or space/comma-separated list of 'hold' (`comment_status=0`), - * 'approve' (`comment_status=1`), 'all', or a custom - * comment status. Default 'all'. - * @type string|array $type Include comments of a given type, or array of types. - * Accepts 'comment', 'pings' (includes 'pingback' and - * 'trackback'), or any custom type string. Default empty. - * @type string[] $type__in Include comments from a given array of comment types. - * Default empty. - * @type string[] $type__not_in Exclude comments from a given array of comment types. - * Default empty. - * @type int $user_id Include comments for a specific user ID. Default empty. - * @type bool|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. - * - Boolean `false` leaves out descendants. - * The parameter is ignored (forced to `false`) when - * `$fields` is 'ids' or 'counts'. Accepts 'threaded', - * 'flat', or false. Default: false. - * @type string $cache_domain Unique cache key to be produced when this query is stored in - * an object cache. Default is 'core'. - * @type bool $update_comment_meta_cache Whether to prime the metadata cache for found comments. - * Default true. - * @type bool $update_comment_post_cache Whether to prime the cache for comment posts. - * Default false. + * @type string $author_email Comment author email address. Default empty. + * @type string $author_url Comment author URL. Default empty. + * @type int[] $author__in Array of author IDs to include comments for. Default empty. + * @type int[] $author__not_in Array of author IDs to exclude comments for. Default empty. + * @type int[] $comment__in Array of comment IDs to include. Default empty. + * @type int[] $comment__not_in Array of comment IDs to exclude. Default empty. + * @type bool $count Whether to return a comment count (true) or array of + * comment objects (false). Default false. + * @type array $date_query Date query clauses to limit comments by. See WP_Date_Query. + * Default null. + * @type string $fields Comment fields to return. Accepts 'ids' for comment IDs + * only or empty for all fields. Default empty. + * @type int $ID Currently unused. + * @type array $include_unapproved Array of IDs or email addresses of users whose unapproved + * comments will be returned by the query regardless of + * `$status`. Default empty. + * @type int $karma Karma score to retrieve matching comments for. + * Default empty. + * @type string|string[] $meta_key Meta key or keys to filter by. + * @type string|string[] $meta_value Meta value or values to filter by. + * @type string $meta_compare MySQL operator used for comparing the meta value. + * See WP_Meta_Query::__construct for accepted values and default value. + * @type string $meta_compare_key MySQL operator used for comparing the meta key. + * See WP_Meta_Query::__construct for accepted values and default value. + * @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons. + * See WP_Meta_Query::__construct for accepted values and default value. + * @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons. + * See WP_Meta_Query::__construct for accepted values and default value. + * @type array $meta_query An associative array of WP_Meta_Query arguments. + * See WP_Meta_Query::__construct for accepted values. + * @type int $number Maximum number of comments to retrieve. + * Default empty (no limit). + * @type int $paged When used with `$number`, defines the page of results to return. + * When used with `$offset`, `$offset` takes precedence. Default 1. + * @type int $offset Number of comments to offset the query. Used to build + * LIMIT clause. Default 0. + * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. + * Default: true. + * @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` + * - The array keys of `$meta_query` + * - false, an empty array, or 'none' to disable `ORDER BY` clause. + * Default: 'comment_date_gmt'. + * @type string $order How to order retrieved comments. Accepts 'ASC', 'DESC'. + * Default: 'DESC'. + * @type int $parent Parent ID of comment to retrieve children of. + * Default empty. + * @type int[] $parent__in Array of parent IDs of comments to retrieve children for. + * Default empty. + * @type int[] $parent__not_in Array of parent IDs of comments *not* to retrieve + * children for. Default empty. + * @type int[] $post_author__in Array of author IDs to retrieve comments for. + * Default empty. + * @type int[] $post_author__not_in Array of author IDs *not* to retrieve comments for. + * Default empty. + * @type int $post_ID Currently unused. + * @type int $post_id Limit results to those affiliated with a given post ID. + * Default 0. + * @type int[] $post__in Array of post IDs to include affiliated comments for. + * Default empty. + * @type int[] $post__not_in Array of post IDs to exclude affiliated comments for. + * Default empty. + * @type int $post_author Post author ID to limit results by. Default empty. + * @type string|string[] $post_status Post status or array of post statuses to retrieve + * affiliated comments for. Pass 'any' to match any value. + * Default empty. + * @type string|string[] $post_type Post type or array of post types to retrieve affiliated + * comments for. Pass 'any' to match any value. Default empty. + * @type string $post_name Post name to retrieve affiliated comments for. + * Default empty. + * @type int $post_parent Post parent ID to retrieve affiliated comments for. + * Default empty. + * @type string $search Search term(s) to retrieve matching comments for. + * Default empty. + * @type string|array $status Comment statuses to limit results by. Accepts an array + * or space/comma-separated list of 'hold' (`comment_status=0`), + * 'approve' (`comment_status=1`), 'all', or a custom + * comment status. Default 'all'. + * @type string|string[] $type Include comments of a given type, or array of types. + * Accepts 'comment', 'pings' (includes 'pingback' and + * 'trackback'), or any custom type string. Default empty. + * @type string[] $type__in Include comments from a given array of comment types. + * Default empty. + * @type string[] $type__not_in Exclude comments from a given array of comment types. + * Default empty. + * @type int $user_id Include comments for a specific user ID. Default empty. + * @type bool|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. + * - Boolean `false` leaves out descendants. + * The parameter is ignored (forced to `false`) when + * `$fields` is 'ids' or 'counts'. Accepts 'threaded', + * 'flat', or false. Default: false. + * @type string $cache_domain Unique cache key to be produced when this query is stored in + * an object cache. Default is 'core'. + * @type bool $update_comment_meta_cache Whether to prime the metadata cache for found comments. + * Default true. + * @type bool $update_comment_post_cache Whether to prime the cache for comment posts. + * Default false. * } */ public function __construct( $query = '' ) { @@ -324,7 +344,7 @@ * * @since 4.2.0 * - * @param WP_Comment_Query $this The WP_Comment_Query instance (passed by reference). + * @param WP_Comment_Query $query The WP_Comment_Query instance (passed by reference). */ do_action_ref_array( 'parse_comment_query', array( &$this ) ); } @@ -354,7 +374,7 @@ * * @global wpdb $wpdb WordPress database abstraction object. * - * @return int|array List of comments or number of found comments if `$count` argument is true. + * @return int|int[]|WP_Comment[] List of comments or number of found comments if `$count` argument is true. */ public function get_comments() { global $wpdb; @@ -370,7 +390,7 @@ * * @since 3.1.0 * - * @param WP_Comment_Query $this Current instance of WP_Comment_Query (passed by reference). + * @param WP_Comment_Query $query Current instance of WP_Comment_Query (passed by reference). */ do_action_ref_array( 'pre_get_comments', array( &$this ) ); @@ -424,10 +444,10 @@ /* * Only use the args defined in the query_var_defaults to compute the key, - * but ignore 'fields', which does not affect query results. + * but ignore 'fields', 'update_comment_meta_cache', 'update_comment_post_cache' which does not affect query results. */ $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); - unset( $_args['fields'] ); + unset( $_args['fields'], $_args['update_comment_meta_cache'], $_args['update_comment_post_cache'] ); $key = md5( serialize( $_args ) ); $last_changed = wp_cache_get_last_changed( 'comment' ); @@ -575,7 +595,7 @@ // Otherwise we match against email addresses. if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { // Only include requested comment. - $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] ); + $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND {$wpdb->comments}.comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] ); } else { // Include all of the author's unapproved comments. $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier ); @@ -801,7 +821,7 @@ } // Falsey search strings are ignored. - if ( strlen( $this->query_vars['search'] ) ) { + if ( isset( $this->query_vars['search'] ) && strlen( $this->query_vars['search'] ) ) { $search_sql = $this->get_search_sql( $this->query_vars['search'], array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ) @@ -897,16 +917,17 @@ $where = implode( ' AND ', $this->sql_clauses['where'] ); - $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); + $clauses = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); + /** * Filters the comment query clauses. * * @since 3.1.0 * - * @param string[] $pieces An associative array of comment query clauses. - * @param WP_Comment_Query $query Current instance of WP_Comment_Query (passed by reference). + * @param string[] $clauses An associative array of comment query clauses. + * @param WP_Comment_Query $query Current instance of WP_Comment_Query (passed by reference). */ - $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) ); + $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $clauses ), &$this ) ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; @@ -940,7 +961,14 @@ $this->sql_clauses['orderby'] = $orderby; $this->sql_clauses['limits'] = $limits; - $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; + $this->request = " + {$this->sql_clauses['select']} + {$this->sql_clauses['from']} + {$where} + {$this->sql_clauses['groupby']} + {$this->sql_clauses['orderby']} + {$this->sql_clauses['limits']} + "; if ( $this->query_vars['count'] ) { return (int) $wpdb->get_var( $this->request ); @@ -1038,10 +1066,12 @@ $child_ids[] = $level_comment->comment_ID; } + $data = array(); foreach ( $parent_map as $parent_id => $children ) { - $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; - wp_cache_set( $cache_key, $children, 'comment' ); + $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; + $data[ $cache_key ] = $children; } + wp_cache_set_multiple( $data, 'comment' ); } $level++; @@ -1096,24 +1126,24 @@ } /** - * Used internally to generate an SQL string for searching across multiple columns + * Used internally to generate an SQL string for searching across multiple columns. * * @since 3.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * - * @param string $string - * @param array $cols - * @return string + * @param string $search Search string. + * @param string[] $columns Array of columns to search. + * @return string Search SQL. */ - protected function get_search_sql( $string, $cols ) { + protected function get_search_sql( $search, $columns ) { global $wpdb; - $like = '%' . $wpdb->esc_like( $string ) . '%'; + $like = '%' . $wpdb->esc_like( $search ) . '%'; $searches = array(); - foreach ( $cols as $col ) { - $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); + foreach ( $columns as $column ) { + $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); } return ' AND (' . implode( ' OR ', $searches ) . ')';