PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 7.2.1
Jetpack – WP Security, Backup, Speed, & Growth v7.2.1
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-update-comment-endpoint.php
jetpack / json-endpoints Last commit date
jetpack 7 years ago class.wpcom-json-api-add-widget-endpoint.php 8 years ago class.wpcom-json-api-autosave-post-v1-1-endpoint.php 8 years ago class.wpcom-json-api-bulk-delete-post-endpoint.php 8 years ago class.wpcom-json-api-bulk-restore-post-endpoint.php 8 years ago class.wpcom-json-api-bulk-update-comments-endpoint.php 7 years ago class.wpcom-json-api-comment-endpoint.php 7 years ago class.wpcom-json-api-delete-media-endpoint.php 8 years ago class.wpcom-json-api-delete-media-v1-1-endpoint.php 8 years ago class.wpcom-json-api-edit-media-v1-2-endpoint.php 7 years ago class.wpcom-json-api-get-autosave-v1-1-endpoint.php 8 years ago class.wpcom-json-api-get-comment-counts-endpoint.php 7 years ago class.wpcom-json-api-get-comment-endpoint.php 8 years ago class.wpcom-json-api-get-comment-history-endpoint.php 8 years ago class.wpcom-json-api-get-comments-tree-endpoint.php 8 years ago class.wpcom-json-api-get-comments-tree-v1-1-endpoint.php 8 years ago class.wpcom-json-api-get-comments-tree-v1-2-endpoint.php 8 years ago class.wpcom-json-api-get-customcss.php 8 years ago class.wpcom-json-api-get-media-endpoint.php 8 years ago class.wpcom-json-api-get-media-v1-1-endpoint.php 8 years ago class.wpcom-json-api-get-media-v1-2-endpoint.php 8 years ago class.wpcom-json-api-get-post-counts-v1-1-endpoint.php 8 years ago class.wpcom-json-api-get-post-endpoint.php 8 years ago class.wpcom-json-api-get-post-v1-1-endpoint.php 8 years ago class.wpcom-json-api-get-site-endpoint.php 7 years ago class.wpcom-json-api-get-site-v1-2-endpoint.php 8 years ago class.wpcom-json-api-get-taxonomies-endpoint.php 8 years ago class.wpcom-json-api-get-taxonomy-endpoint.php 8 years ago class.wpcom-json-api-get-term-endpoint.php 8 years ago class.wpcom-json-api-list-comments-endpoint.php 7 years ago class.wpcom-json-api-list-embeds-endpoint.php 8 years ago class.wpcom-json-api-list-media-endpoint.php 8 years ago class.wpcom-json-api-list-media-v1-1-endpoint.php 8 years ago class.wpcom-json-api-list-media-v1-2-endpoint.php 8 years ago class.wpcom-json-api-list-post-type-taxonomies-endpoint.php 8 years ago class.wpcom-json-api-list-post-types-endpoint.php 8 years ago class.wpcom-json-api-list-posts-endpoint.php 8 years ago class.wpcom-json-api-list-posts-v1-1-endpoint.php 8 years ago class.wpcom-json-api-list-posts-v1-2-endpoint.php 8 years ago class.wpcom-json-api-list-roles-endpoint.php 8 years ago class.wpcom-json-api-list-shortcodes-endpoint.php 8 years ago class.wpcom-json-api-list-terms-endpoint.php 8 years ago class.wpcom-json-api-list-users-endpoint.php 8 years ago class.wpcom-json-api-menus-v1-1-endpoint.php 8 years ago class.wpcom-json-api-post-endpoint.php 7 years ago class.wpcom-json-api-post-v1-1-endpoint.php 8 years ago class.wpcom-json-api-render-embed-endpoint.php 8 years ago class.wpcom-json-api-render-embed-reversal-endpoint.php 8 years ago class.wpcom-json-api-render-endpoint.php 9 years ago class.wpcom-json-api-render-shortcode-endpoint.php 8 years ago class.wpcom-json-api-sharing-buttons-endpoint.php 8 years ago class.wpcom-json-api-site-settings-endpoint.php 7 years ago class.wpcom-json-api-site-settings-v1-2-endpoint.php 7 years ago class.wpcom-json-api-site-settings-v1-3-endpoint.php 7 years ago class.wpcom-json-api-site-settings-v1-4-endpoint.php 7 years ago class.wpcom-json-api-site-user-endpoint.php 8 years ago class.wpcom-json-api-taxonomy-endpoint.php 7 years ago class.wpcom-json-api-update-comment-endpoint.php 8 years ago class.wpcom-json-api-update-customcss.php 8 years ago class.wpcom-json-api-update-media-endpoint.php 8 years ago class.wpcom-json-api-update-media-v1-1-endpoint.php 8 years ago class.wpcom-json-api-update-post-endpoint.php 7 years ago class.wpcom-json-api-update-post-v1-1-endpoint.php 7 years ago class.wpcom-json-api-update-post-v1-2-endpoint.php 7 years ago class.wpcom-json-api-update-site-homepage-endpoint.php 8 years ago class.wpcom-json-api-update-site-logo-endpoint.php 8 years ago class.wpcom-json-api-update-taxonomy-endpoint.php 8 years ago class.wpcom-json-api-update-term-endpoint.php 7 years ago class.wpcom-json-api-update-user-endpoint.php 7 years ago class.wpcom-json-api-upload-media-endpoint.php 8 years ago class.wpcom-json-api-upload-media-v1-1-endpoint.php 8 years ago
class.wpcom-json-api-update-comment-endpoint.php
394 lines
1 <?php
2
3 new WPCOM_JSON_API_Update_Comment_Endpoint( array(
4 'description' => 'Create a comment on a post.',
5 'group' => 'comments',
6 'stat' => 'posts:1:replies:new',
7
8 'method' => 'POST',
9 'path' => '/sites/%s/posts/%d/replies/new',
10 'path_labels' => array(
11 '$site' => '(int|string) Site ID or domain',
12 '$post_ID' => '(int) The post ID'
13 ),
14
15 'request_format' => array(
16 // explicitly document all input
17 'content' => '(HTML) The comment text.',
18 // @todo Should we open this up to unauthenticated requests too?
19 // 'author' => '(author object) The author of the comment.',
20 ),
21
22 'pass_wpcom_user_details' => true,
23
24 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/posts/843/replies/new/',
25 'example_request_data' => array(
26 'headers' => array(
27 'authorization' => 'Bearer YOUR_API_TOKEN'
28 ),
29 'body' => array(
30 'content' => 'Your reply is very interesting. This is a reply.'
31 )
32 )
33 ) );
34
35 new WPCOM_JSON_API_Update_Comment_Endpoint( array(
36 'description' => 'Create a comment as a reply to another comment.',
37 'group' => 'comments',
38 'stat' => 'comments:1:replies:new',
39
40 'method' => 'POST',
41 'path' => '/sites/%s/comments/%d/replies/new',
42 'path_labels' => array(
43 '$site' => '(int|string) Site ID or domain',
44 '$comment_ID' => '(int) The comment ID'
45 ),
46
47 'request_format' => array(
48 'content' => '(HTML) The comment text.',
49 // @todo Should we open this up to unauthenticated requests too?
50 // 'author' => '(author object) The author of the comment.',
51 ),
52
53 'pass_wpcom_user_details' => true,
54
55 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/comments/29/replies/new',
56 'example_request_data' => array(
57 'headers' => array(
58 'authorization' => 'Bearer YOUR_API_TOKEN'
59 ),
60 'body' => array(
61 'content' => 'This reply is very interesting. This is editing a comment reply via the API.',
62 )
63 )
64 ) );
65
66 new WPCOM_JSON_API_Update_Comment_Endpoint( array(
67 'description' => 'Edit a comment.',
68 'group' => 'comments',
69 'stat' => 'comments:1:POST',
70
71 'method' => 'POST',
72 'path' => '/sites/%s/comments/%d',
73 'path_labels' => array(
74 '$site' => '(int|string) Site ID or domain',
75 '$comment_ID' => '(int) The comment ID'
76 ),
77
78 'request_format' => array(
79 'author' => "(string) The comment author's name.",
80 'author_email' => "(string) The comment author's email.",
81 'author_url' => "(string) The comment author's URL.",
82 'content' => '(HTML) The comment text.',
83 'date' => "(ISO 8601 datetime) The comment's creation time.",
84 'status' => array(
85 'approved' => 'Approve the comment.',
86 'unapproved' => 'Remove the comment from public view and send it to the moderation queue.',
87 'spam' => 'Mark the comment as spam.',
88 'unspam' => 'Unmark the comment as spam. Will attempt to set it to the previous status.',
89 'trash' => 'Send a comment to the trash if trashing is enabled (see constant: EMPTY_TRASH_DAYS).',
90 'untrash' => 'Untrash a comment. Only works when the comment is in the trash.',
91 ),
92 ),
93
94 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/comments/29',
95 'example_request_data' => array(
96 'headers' => array(
97 'authorization' => 'Bearer YOUR_API_TOKEN'
98 ),
99 'body' => array(
100 'content' => 'This reply is now edited via the API.',
101 'status' => 'approved',
102 )
103 )
104 ) );
105
106 new WPCOM_JSON_API_Update_Comment_Endpoint( array(
107 'description' => 'Delete a comment.',
108 'group' => 'comments',
109 'stat' => 'comments:1:delete',
110
111 'method' => 'POST',
112 'path' => '/sites/%s/comments/%d/delete',
113 'path_labels' => array(
114 '$site' => '(int|string) Site ID or domain',
115 '$comment_ID' => '(int) The comment ID'
116 ),
117
118 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/comments/$comment_ID/delete',
119 'example_request_data' => array(
120 'headers' => array(
121 'authorization' => 'Bearer YOUR_API_TOKEN'
122 )
123 )
124 ) );
125
126 class WPCOM_JSON_API_Update_Comment_Endpoint extends WPCOM_JSON_API_Comment_Endpoint {
127 function __construct( $args ) {
128 parent::__construct( $args );
129 if ( $this->api->ends_with( $this->path, '/delete' ) ) {
130 $this->comment_object_format['status']['deleted'] = 'The comment has been deleted permanently.';
131 }
132 }
133
134 // /sites/%s/posts/%d/replies/new -> $blog_id, $post_id
135 // /sites/%s/comments/%d/replies/new -> $blog_id, $comment_id
136 // /sites/%s/comments/%d -> $blog_id, $comment_id
137 // /sites/%s/comments/%d/delete -> $blog_id, $comment_id
138 function callback( $path = '', $blog_id = 0, $object_id = 0 ) {
139 if ( $this->api->ends_with( $path, '/new' ) )
140 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ), false );
141 else
142 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
143 if ( is_wp_error( $blog_id ) ) {
144 return $blog_id;
145 }
146
147 if ( $this->api->ends_with( $path, '/delete' ) ) {
148 return $this->delete_comment( $path, $blog_id, $object_id );
149 } elseif ( $this->api->ends_with( $path, '/new' ) ) {
150 if ( false !== strpos( $path, '/posts/' ) ) {
151 return $this->new_comment( $path, $blog_id, $object_id, 0 );
152 } else {
153 return $this->new_comment( $path, $blog_id, 0, $object_id );
154 }
155 }
156
157 return $this->update_comment( $path, $blog_id, $object_id );
158 }
159
160 // /sites/%s/posts/%d/replies/new -> $blog_id, $post_id
161 // /sites/%s/comments/%d/replies/new -> $blog_id, $comment_id
162 function new_comment( $path, $blog_id, $post_id, $comment_parent_id ) {
163 if ( !$post_id ) {
164 $comment_parent = get_comment( $comment_parent_id );
165 if ( !$comment_parent_id || !$comment_parent || is_wp_error( $comment_parent ) ) {
166 return new WP_Error( 'unknown_comment', 'Unknown comment', 404 );
167 }
168
169 $post_id = $comment_parent->comment_post_ID;
170 }
171
172 $post = get_post( $post_id );
173 if ( !$post || is_wp_error( $post ) ) {
174 return new WP_Error( 'unknown_post', 'Unknown post', 404 );
175 }
176
177 if (
178 -1 == get_option( 'blog_public' ) &&
179 /**
180 * Filter allowing non-registered users on the site to comment.
181 *
182 * @module json-api
183 *
184 * @since 3.4.0
185 *
186 * @param bool is_user_member_of_blog() Is the user member of the site.
187 */
188 ! apply_filters( 'wpcom_json_api_user_is_member_of_blog', is_user_member_of_blog() ) &&
189 ! is_super_admin()
190 ) {
191 return new WP_Error( 'unauthorized', 'User cannot create comments', 403 );
192 }
193
194 if ( ! comments_open( $post->ID ) && ! current_user_can( 'edit_post', $post->ID ) ) {
195 return new WP_Error( 'unauthorized', 'Comments on this post are closed', 403 );
196 }
197
198 $can_view = $this->user_can_view_post( $post->ID );
199 if ( !$can_view || is_wp_error( $can_view ) ) {
200 return $can_view;
201 }
202
203 $post_status = get_post_status_object( get_post_status( $post ) );
204 if ( !$post_status->public && !$post_status->private ) {
205 return new WP_Error( 'unauthorized', 'Comments on drafts are not allowed', 403 );
206 }
207
208 $args = $this->query_args();
209 $input = $this->input();
210 if ( !is_array( $input ) || !$input || !strlen( $input['content'] ) ) {
211 return new WP_Error( 'invalid_input', 'Invalid request input', 400 );
212 }
213
214 $user = wp_get_current_user();
215 if ( !$user || is_wp_error( $user ) || !$user->ID ) {
216 $auth_required = false;
217 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
218 $auth_required = true;
219 } elseif ( isset( $this->api->token_details['user'] ) ) {
220 $user = (object) $this->api->token_details['user'];
221 foreach ( array( 'display_name', 'user_email', 'user_url' ) as $user_datum ) {
222 if ( !isset( $user->$user_datum ) ) {
223 $auth_required = true;
224 }
225 }
226 if ( !isset( $user->ID ) ) {
227 $user->ID = 0;
228 }
229
230 // If we have a user with an external ID saved, we can use it.
231 if (
232 ! $auth_required
233 && $user->ID
234 && (
235 $author = get_user_by( 'id', intval( $user->ID ) )
236 )
237 ) {
238 $user = $author;
239 }
240 } else {
241 $auth_required = true;
242 }
243
244 if ( $auth_required ) {
245 return new WP_Error( 'authorization_required', 'An active access token must be used to comment.', 403 );
246 }
247 }
248
249 $insert = array(
250 'comment_post_ID' => $post->ID,
251 'user_ID' => $user->ID,
252 'comment_author' => $user->display_name,
253 'comment_author_email' => $user->user_email,
254 'comment_author_url' => $user->user_url,
255 'comment_content' => $input['content'],
256 'comment_parent' => $comment_parent_id,
257 'comment_type' => '',
258 );
259
260 if ( $comment_parent_id ) {
261 if ( $comment_parent->comment_approved === '0' && current_user_can( 'edit_comment', $comment_parent->comment_ID ) ) {
262 wp_set_comment_status( $comment_parent->comment_ID, 'approve' );
263 }
264 }
265
266 $this->api->trap_wp_die( 'comment_failure' );
267 $comment_id = wp_new_comment( add_magic_quotes( $insert ) );
268 $this->api->trap_wp_die( null );
269
270 $return = $this->get_comment( $comment_id, $args['context'] );
271 if ( !$return ) {
272 return new WP_Error( 400, __( 'Comment cache problem?', 'jetpack' ) );
273 }
274 if ( is_wp_error( $return ) ) {
275 return $return;
276 }
277
278 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
279 do_action( 'wpcom_json_api_objects', 'comments' );
280 return $return;
281 }
282
283 // /sites/%s/comments/%d -> $blog_id, $comment_id
284 function update_comment( $path, $blog_id, $comment_id ) {
285 $comment = get_comment( $comment_id );
286 if ( !$comment || is_wp_error( $comment ) ) {
287 return new WP_Error( 'unknown_comment', 'Unknown comment', 404 );
288 }
289
290 if ( !current_user_can( 'edit_comment', $comment->comment_ID ) ) {
291 return new WP_Error( 'unauthorized', 'User cannot edit comment', 403 );
292 }
293
294 $args = $this->query_args();
295 $input = $this->input( false );
296 if ( !is_array( $input ) || !$input ) {
297 return new WP_Error( 'invalid_input', 'Invalid request input', 400 );
298 }
299
300 $update = array();
301 foreach ( $input as $key => $value ) {
302 $update["comment_$key"] = $value;
303 }
304
305 $comment_status = wp_get_comment_status( $comment->comment_ID );
306 if ( isset( $update['comment_status'] ) ) {
307 switch ( $update['comment_status'] ) {
308 case 'approved' :
309 if ( 'approve' !== $comment_status ) {
310 wp_set_comment_status( $comment->comment_ID, 'approve' );
311 }
312 break;
313 case 'unapproved' :
314 if ( 'hold' !== $comment_status ) {
315 wp_set_comment_status( $comment->comment_ID, 'hold' );
316 }
317 break;
318 case 'spam' :
319 if ( 'spam' !== $comment_status ) {
320 wp_spam_comment( $comment->comment_ID );
321 }
322 break;
323 case 'unspam' :
324 if ( 'spam' === $comment_status ) {
325 wp_unspam_comment( $comment->comment_ID );
326 }
327 break;
328 case 'trash' :
329 if ( ! EMPTY_TRASH_DAYS ) {
330 return new WP_Error( 'trash_disabled', 'Cannot trash comment', 403 );
331 }
332
333 if ( 'trash' !== $comment_status ) {
334 wp_trash_comment( $comment_id );
335 }
336 break;
337 case 'untrash' :
338 if ( 'trash' === $comment_status ) {
339 wp_untrash_comment( $comment->comment_ID );
340 }
341 break;
342 default:
343 $update['comment_approved'] = 1;
344 break;
345 }
346 unset( $update['comment_status'] );
347 }
348
349 if ( ! empty( $update ) ) {
350 $update['comment_ID'] = $comment->comment_ID;
351 wp_update_comment( add_magic_quotes( $update ) );
352 }
353
354 $return = $this->get_comment( $comment->comment_ID, $args['context'] );
355 if ( !$return || is_wp_error( $return ) ) {
356 return $return;
357 }
358
359 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
360 do_action( 'wpcom_json_api_objects', 'comments' );
361 return $return;
362 }
363
364 // /sites/%s/comments/%d/delete -> $blog_id, $comment_id
365 function delete_comment( $path, $blog_id, $comment_id ) {
366 $comment = get_comment( $comment_id );
367 if ( !$comment || is_wp_error( $comment ) ) {
368 return new WP_Error( 'unknown_comment', 'Unknown comment', 404 );
369 }
370
371 if ( !current_user_can( 'edit_comment', $comment->comment_ID ) ) { // [sic] There is no delete_comment cap
372 return new WP_Error( 'unauthorized', 'User cannot delete comment', 403 );
373 }
374
375 $args = $this->query_args();
376 $return = $this->get_comment( $comment->comment_ID, $args['context'] );
377 if ( !$return || is_wp_error( $return ) ) {
378 return $return;
379 }
380
381 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
382 do_action( 'wpcom_json_api_objects', 'comments' );
383
384 wp_delete_comment( $comment->comment_ID );
385 $status = wp_get_comment_status( $comment->comment_ID );
386 if ( false === $status ) {
387 $return['status'] = 'deleted';
388 return $return;
389 }
390
391 return $this->get_comment( $comment->comment_ID, $args['context'] );
392 }
393 }
394