PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.9-a.3
Jetpack – WP Security, Backup, Speed, & Growth v15.9-a.3
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / json-endpoints / class.wpcom-json-api-list-comments-endpoint.php
jetpack / json-endpoints Last commit date
jetpack 2 weeks ago class.wpcom-json-api-add-widget-endpoint.php 6 months ago class.wpcom-json-api-autosave-post-v1-1-endpoint.php 6 months ago class.wpcom-json-api-bulk-delete-post-endpoint.php 6 months ago class.wpcom-json-api-bulk-restore-post-endpoint.php 6 months ago class.wpcom-json-api-bulk-update-comments-endpoint.php 6 months ago class.wpcom-json-api-comment-endpoint.php 6 months ago class.wpcom-json-api-delete-media-endpoint.php 6 months ago class.wpcom-json-api-delete-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-edit-media-v1-2-endpoint.php 6 months ago class.wpcom-json-api-get-autosave-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-comment-counts-endpoint.php 6 months ago class.wpcom-json-api-get-comment-endpoint.php 6 months ago class.wpcom-json-api-get-comment-history-endpoint.php 6 months ago class.wpcom-json-api-get-comments-tree-endpoint.php 6 months ago class.wpcom-json-api-get-comments-tree-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-comments-tree-v1-2-endpoint.php 6 months ago class.wpcom-json-api-get-customcss.php 6 months ago class.wpcom-json-api-get-media-endpoint.php 6 months ago class.wpcom-json-api-get-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-media-v1-2-endpoint.php 6 months ago class.wpcom-json-api-get-post-counts-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-post-endpoint.php 6 months ago class.wpcom-json-api-get-post-v1-1-endpoint.php 6 months ago class.wpcom-json-api-get-site-endpoint.php 4 weeks ago class.wpcom-json-api-get-site-v1-2-endpoint.php 3 months ago class.wpcom-json-api-get-taxonomies-endpoint.php 1 month ago class.wpcom-json-api-get-taxonomy-endpoint.php 6 months ago class.wpcom-json-api-get-term-endpoint.php 6 months ago class.wpcom-json-api-list-comments-endpoint.php 6 months ago class.wpcom-json-api-list-dropdown-pages-endpoint.php 6 months ago class.wpcom-json-api-list-embeds-endpoint.php 6 months ago class.wpcom-json-api-list-media-endpoint.php 6 months ago class.wpcom-json-api-list-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-list-media-v1-2-endpoint.php 6 months ago class.wpcom-json-api-list-post-type-taxonomies-endpoint.php 6 months ago class.wpcom-json-api-list-post-types-endpoint.php 6 months ago class.wpcom-json-api-list-posts-endpoint.php 6 months ago class.wpcom-json-api-list-posts-v1-1-endpoint.php 6 months ago class.wpcom-json-api-list-posts-v1-2-endpoint.php 6 months ago class.wpcom-json-api-list-roles-endpoint.php 6 months ago class.wpcom-json-api-list-shortcodes-endpoint.php 6 months ago class.wpcom-json-api-list-terms-endpoint.php 6 months ago class.wpcom-json-api-list-users-endpoint.php 6 months ago class.wpcom-json-api-menus-v1-1-endpoint.php 6 months ago class.wpcom-json-api-post-endpoint.php 6 months ago class.wpcom-json-api-post-v1-1-endpoint.php 1 month ago class.wpcom-json-api-render-embed-endpoint.php 6 months ago class.wpcom-json-api-render-embed-reversal-endpoint.php 6 months ago class.wpcom-json-api-render-endpoint.php 2 weeks ago class.wpcom-json-api-render-shortcode-endpoint.php 6 months ago class.wpcom-json-api-sharing-buttons-endpoint.php 6 months ago class.wpcom-json-api-site-settings-endpoint.php 2 months ago class.wpcom-json-api-site-settings-v1-2-endpoint.php 6 months ago class.wpcom-json-api-site-settings-v1-3-endpoint.php 6 months ago class.wpcom-json-api-site-settings-v1-4-endpoint.php 2 months ago class.wpcom-json-api-site-user-endpoint.php 6 months ago class.wpcom-json-api-taxonomy-endpoint.php 6 months ago class.wpcom-json-api-update-comment-endpoint.php 4 months ago class.wpcom-json-api-update-customcss.php 6 months ago class.wpcom-json-api-update-media-endpoint.php 6 months ago class.wpcom-json-api-update-media-v1-1-endpoint.php 6 months ago class.wpcom-json-api-update-post-endpoint.php 2 weeks ago class.wpcom-json-api-update-post-v1-1-endpoint.php 2 weeks ago class.wpcom-json-api-update-post-v1-2-endpoint.php 2 weeks ago class.wpcom-json-api-update-site-homepage-endpoint.php 6 months ago class.wpcom-json-api-update-site-logo-endpoint.php 6 months ago class.wpcom-json-api-update-taxonomy-endpoint.php 5 months ago class.wpcom-json-api-update-term-endpoint.php 6 months ago class.wpcom-json-api-update-user-endpoint.php 6 months ago class.wpcom-json-api-upload-media-endpoint.php 6 months ago class.wpcom-json-api-upload-media-v1-1-endpoint.php 6 months ago
class.wpcom-json-api-list-comments-endpoint.php
387 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit( 0 );
5 }
6
7 /**
8 * Comments Walker Class.
9 */
10 class WPCOM_JSON_API_List_Comments_Walker extends Walker {
11
12 /**
13 * Tree type.
14 *
15 * @var string
16 */
17 public $tree_type = 'comment';
18
19 /**
20 * Database fields.
21 *
22 * @var array
23 */
24 public $db_fields = array(
25 'parent' => 'comment_parent',
26 'id' => 'comment_ID',
27 );
28
29 /**
30 * Start the element output.
31 *
32 * @param array $output - the output.
33 * @param object $object - the object.
34 * @param int $depth - depth.
35 * @param array $args - the arguments.
36 * @param int $current_object_id - the object ID.
37 */
38 public function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
39 if ( ! is_array( $output ) ) {
40 $output = array();
41 }
42
43 $output[] = $object->comment_ID;
44 }
45
46 /**
47 * Taken from WordPress's Walker_Comment::display_element()
48 *
49 * This function is designed to enhance Walker::display_element() to
50 * display children of higher nesting levels than selected inline on
51 * the highest depth level displayed. This prevents them being orphaned
52 * at the end of the comment list.
53 *
54 * Example: max_depth = 2, with 5 levels of nested content.
55 * 1
56 * 1.1
57 * 1.1.1
58 * 1.1.1.1
59 * 1.1.1.1.1
60 * 1.1.2
61 * 1.1.2.1
62 * 2
63 * 2.2
64 *
65 * @see Walker_Comment::display_element()
66 * @see Walker::display_element()
67 * @see wp_list_comments()
68 *
69 * @param object $element — Data object.
70 * @param array $children_elements - List of elements to continue traversing (passed by reference).
71 * @param int $max_depth — Max depth to traverse.
72 * @param int $depth — Depth of current element.
73 * @param array $args — An array of arguments.
74 * @param string $output — Used to append additional content (passed by reference).
75 */
76 public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
77
78 if ( ! $element ) {
79 return;
80 }
81
82 $id_field = $this->db_fields['id'];
83 $id = $element->$id_field;
84
85 parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
86
87 // If we're at the max depth, and the current element still has children, loop over those and display them at this level
88 // This is to prevent them being orphaned to the end of the list.
89 if ( $max_depth <= $depth + 1 && isset( $children_elements[ $id ] ) ) {
90 foreach ( $children_elements[ $id ] as $child ) {
91 $this->display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
92 }
93
94 unset( $children_elements[ $id ] );
95 }
96 }
97 }
98
99 new WPCOM_JSON_API_List_Comments_Endpoint(
100 array(
101 'description' => 'Get a list of recent comments.',
102 'group' => 'comments',
103 'stat' => 'comments',
104
105 'method' => 'GET',
106 'path' => '/sites/%s/comments/',
107 'path_labels' => array(
108 '$site' => '(int|string) Site ID or domain',
109 ),
110
111 'allow_fallback_to_jetpack_blog_token' => true,
112
113 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/en.blog.wordpress.com/comments/?number=2',
114 )
115 );
116
117 new WPCOM_JSON_API_List_Comments_Endpoint(
118 array(
119 'description' => 'Get a list of recent comments on a post.',
120 'group' => 'comments',
121 'stat' => 'posts:1:replies',
122
123 'method' => 'GET',
124 'path' => '/sites/%s/posts/%d/replies/',
125 'path_labels' => array(
126 '$site' => '(int|string) Site ID or domain',
127 '$post_ID' => '(int) The post ID',
128 ),
129
130 'allow_fallback_to_jetpack_blog_token' => true,
131
132 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/en.blog.wordpress.com/posts/7/replies/?number=2',
133 )
134 );
135
136 /**
137 * List comment endpoint.
138 *
139 * /sites/%s/comments/ -> $blog_id
140 * /sites/%s/posts/%d/replies/ -> $blog_id, $post_id
141 * /sites/%s/comments/%d/replies/ -> $blog_id, $comment_id
142 *
143 * @todo permissions
144 *
145 * @phan-constructor-used-for-side-effects
146 */
147 class WPCOM_JSON_API_List_Comments_Endpoint extends WPCOM_JSON_API_Comment_Endpoint { // phpcs:ignore
148
149 /**
150 * The response format.
151 *
152 * @var array
153 */
154 public $response_format = array(
155 'found' => '(int) The total number of comments found that match the request (ignoring limits, offsets, and pagination).',
156 'site_ID' => '(int) The site ID',
157 'comments' => '(array:comment) An array of comment objects.',
158 );
159
160 /**
161 * Constructor function.
162 *
163 * @param array $args - the arguments.
164 */
165 public function __construct( $args ) {
166 parent::__construct( $args );
167 $this->query = array_merge(
168 $this->query,
169 array(
170 'number' => '(int=20) The number of comments to return. Limit: 100. When using hierarchical=1, number refers to the number of top-level comments returned.',
171 'offset' => '(int=0) 0-indexed offset. Not available if using hierarchical=1.',
172 'page' => '(int) Return the Nth 1-indexed page of comments. Takes precedence over the <code>offset</code> parameter. When using hierarchical=1, pagination is a bit different. See the note on the number parameter.',
173 'order' => array(
174 'DESC' => 'Return comments in descending order from newest to oldest.',
175 'ASC' => 'Return comments in ascending order from oldest to newest.',
176 ),
177 'hierarchical' => array(
178 'false' => '',
179 'true' => '(BETA) Order the comment list hierarchically.',
180 ),
181 'after' => '(ISO 8601 datetime) Return comments dated on or after the specified datetime. Not available if using hierarchical=1.',
182 'before' => '(ISO 8601 datetime) Return comments dated on or before the specified datetime. Not available if using hierarchical=1.',
183 'type' => array(
184 'any' => 'Return all comments regardless of type.',
185 'comment' => 'Return only regular comments.',
186 'trackback' => 'Return only trackbacks.',
187 'pingback' => 'Return only pingbacks.',
188 'pings' => 'Return both trackbacks and pingbacks.',
189 ),
190 'status' => array(
191 'approved' => 'Return only approved comments.',
192 'unapproved' => 'Return only comments in the moderation queue.',
193 'spam' => 'Return only comments marked as spam.',
194 'trash' => 'Return only comments in the trash.',
195 'all' => 'Return comments of all statuses.',
196 ),
197 'author_wpcom_data' => array(
198 'false' => 'Do not add wpcom_id and wpcom_login fields to comment author responses (default)',
199 'true' => 'Add wpcom_id and wpcom_login fields to comment author responses',
200 ),
201 )
202 );
203 }
204
205 /**
206 * The callback.
207 *
208 * @param string $path - the path.
209 * @param int $blog_id - the blog ID.
210 * @param int $object_id - the object ID.
211 */
212 public function callback( $path = '', $blog_id = 0, $object_id = 0 ) {
213 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
214 if ( is_wp_error( $blog_id ) ) {
215 return $blog_id;
216 }
217
218 $args = $this->query_args();
219
220 if ( $args['number'] < 1 ) {
221 $args['number'] = 20;
222 } elseif ( 100 < $args['number'] ) {
223 return new WP_Error( 'invalid_number', 'The NUMBER parameter must be less than or equal to 100.', 400 );
224 }
225
226 if ( str_contains( $path, '/posts/' ) ) {
227 // We're looking for comments of a particular post.
228 $post_id = $object_id;
229 $comment_id = 0;
230 } else {
231 // We're looking for comments for the whole blog, or replies to a single comment.
232 $comment_id = $object_id;
233 $post_id = 0;
234 }
235
236 // We can't efficiently get the number of replies to a single comment.
237 $count = false;
238 $found = -1;
239
240 if ( ! $comment_id ) {
241 // We can get comment counts for the whole site or for a single post, but only for certain queries.
242 if ( 'any' === $args['type'] && ! isset( $args['after'] ) && ! isset( $args['before'] ) ) {
243 $count = $this->api->wp_count_comments( $post_id );
244 }
245 }
246
247 switch ( $args['status'] ) {
248 case 'approved':
249 $status = 'approve';
250 if ( $count ) {
251 $found = $count->approved;
252 }
253 break;
254 default:
255 if ( ! current_user_can( 'edit_posts' ) ) {
256 return new WP_Error( 'unauthorized', 'User cannot read non-approved comments', 403 );
257 }
258 if ( 'unapproved' === $args['status'] ) {
259 $status = 'hold';
260 $count_status = 'moderated';
261 } elseif ( 'all' === $args['status'] ) {
262 $status = 'all';
263 $count_status = 'total_comments';
264 } else {
265 $status = $args['status'];
266 $count_status = $args['status'];
267 }
268 if ( $count ) {
269 $found = $count->$count_status;
270 }
271 }
272
273 /** This filter is documented in class.json-api.php */
274 $exclude = apply_filters(
275 'jetpack_api_exclude_comment_types',
276 array( 'order_note', 'webhook_delivery', 'review', 'action_log' )
277 );
278
279 $query = array(
280 'order' => $args['order'],
281 'type' => 'any' === $args['type'] ? false : $args['type'],
282 'status' => $status,
283 'type__not_in' => $exclude,
284 );
285
286 if ( isset( $args['page'] ) ) {
287 if ( $args['page'] < 1 ) {
288 $args['page'] = 1;
289 }
290 } elseif ( $args['offset'] < 0 ) {
291 $args['offset'] = 0;
292 }
293
294 if ( ! $args['hierarchical'] ) {
295 $query['number'] = $args['number'];
296
297 if ( isset( $args['page'] ) ) {
298 $query['offset'] = ( $args['page'] - 1 ) * $args['number'];
299 } else {
300 $query['offset'] = $args['offset'];
301 }
302
303 $is_before = isset( $args['before_gmt'] );
304 $is_after = isset( $args['after_gmt'] );
305
306 if ( $is_before || $is_after ) {
307 $query['date_query'] = array(
308 'column' => 'comment_date_gmt',
309 'inclusive' => true,
310 );
311
312 if ( $is_before ) {
313 $query['date_query']['before'] = $args['before_gmt'];
314 }
315
316 if ( $is_after ) {
317 $query['date_query']['after'] = $args['after_gmt'];
318 }
319 }
320 }
321 if ( $args['hierarchical'] && $found > 5000 ) {
322 // Massive comment thread found; don't pre-load comment metadata to reduce memory used.
323 $query['update_comment_meta_cache'] = false;
324 }
325
326 if ( $post_id ) {
327 $post = get_post( $post_id );
328 if ( ! $post || is_wp_error( $post ) ) {
329 return new WP_Error( 'unknown_post', 'Unknown post', 404 );
330 }
331 $query['post_id'] = $post->ID;
332 if ( $this->api->ends_with( $this->path, '/replies' ) ) {
333 $query['parent'] = 0;
334 }
335 } elseif ( $comment_id ) {
336 $comment = get_comment( $comment_id );
337 if ( ! $comment || is_wp_error( $comment ) ) {
338 return new WP_Error( 'unknown_comment', 'Unknown comment', 404 );
339 }
340 $query['parent'] = $comment_id;
341 }
342
343 $comments = get_comments( $query );
344
345 if ( $args['hierarchical'] ) {
346 $walker = new WPCOM_JSON_API_List_Comments_Walker();
347 $comment_ids = $walker->paged_walk( $comments, get_option( 'thread_comments_depth', -1 ), isset( $args['page'] ) ? $args['page'] : 1, $args['number'] );
348 if ( ! empty( $comment_ids ) ) {
349 $comments = array_map( 'get_comment', $comment_ids );
350 }
351 }
352
353 $return = array();
354
355 foreach ( array_keys( $this->response_format ) as $key ) {
356 switch ( $key ) {
357 case 'found':
358 $return[ $key ] = (int) $found;
359 break;
360 case 'site_ID':
361 $return[ $key ] = (int) $blog_id;
362 break;
363 case 'comments':
364 $return_comments = array();
365 if ( ! empty( $comments ) ) {
366 foreach ( $comments as $comment ) {
367 $the_comment = $this->get_comment( $comment->comment_ID, $args['context'] );
368 if ( $the_comment && ! is_wp_error( $the_comment ) ) {
369 $return_comments[] = $the_comment;
370 }
371 }
372 }
373
374 if ( $return_comments ) {
375 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
376 do_action( 'wpcom_json_api_objects', 'comments', count( $return_comments ) );
377 }
378
379 $return[ $key ] = $return_comments;
380 break;
381 }
382 }
383
384 return $return;
385 }
386 }
387