PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.7
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.7
16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 All 506 releases
jetpack / json-endpoints / class.wpcom-json-api-update-term-endpoint.php

class.wpcom-json-api-update-term-endpoint.php in Jetpack – WP Security, Backup, Speed, & Growth 16.3-a.7, at json-endpoints/class.wpcom-json-api-update-term-endpoint.php

302 lines 9.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Update site terms API endpoints.
4 *
5 * Endpoints:
6 * Create a new term: /sites/%s/taxonomies/%s/terms/new
7 * Edit a term: /sites/%s/taxonomies/%s/terms/slug:%s
8 * Delete a term: /sites/%s/taxonomies/%s/terms/slug:%s/delete
9 */
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit( 0 );
13 }
14
15 new WPCOM_JSON_API_Update_Term_Endpoint(
16 array(
17 'description' => 'Create a new term.',
18 'group' => 'taxonomy',
19 'stat' => 'terms:new',
20 'method' => 'POST',
21 'path' => '/sites/%s/taxonomies/%s/terms/new',
22 'path_labels' => array(
23 '$site' => '(int|string) Site ID or domain',
24 '$taxonomy' => '(string) Taxonomy',
25 ),
26 'request_format' => array(
27 'name' => '(string) Name of the term',
28 'description' => '(string) A description of the term',
29 'parent' => '(int) The parent ID for the term, if hierarchical',
30 ),
31 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/taxonomies/post_tag/terms/new',
32 'example_request_data' => array(
33 'headers' => array(
34 'authorization' => 'Bearer YOUR_API_TOKEN',
35 ),
36 'body' => array(
37 'name' => 'Ribs & Chicken',
38 ),
39 ),
40 )
41 );
42
43 new WPCOM_JSON_API_Update_Term_Endpoint(
44 array(
45 'description' => 'Edit a term.',
46 'group' => 'taxonomy',
47 'stat' => 'terms:1:POST',
48 'method' => 'POST',
49 'path' => '/sites/%s/taxonomies/%s/terms/slug:%s',
50 'path_labels' => array(
51 '$site' => '(int|string) Site ID or domain',
52 '$taxonomy' => '(string) Taxonomy',
53 '$slug' => '(string) The term slug',
54 ),
55 'request_format' => array(
56 'name' => '(string) Name of the term',
57 'description' => '(string) A description of the term',
58 'parent' => '(int) The parent ID for the term, if hierarchical',
59 ),
60 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/taxonomies/post_tag/terms/slug:testing-term',
61 'example_request_data' => array(
62 'headers' => array(
63 'authorization' => 'Bearer YOUR_API_TOKEN',
64 ),
65 'body' => array(
66 'description' => 'The most delicious',
67 ),
68 ),
69 )
70 );
71
72 new WPCOM_JSON_API_Update_Term_Endpoint(
73 array(
74 'description' => 'Delete a term.',
75 'group' => 'taxonomy',
76 'stat' => 'terms:1:delete',
77 'method' => 'POST',
78 'path' => '/sites/%s/taxonomies/%s/terms/slug:%s/delete',
79 'path_labels' => array(
80 '$site' => '(int|string) Site ID or domain',
81 '$taxonomy' => '(string) Taxonomy',
82 '$slug' => '(string) The term slug',
83 ),
84 'response_format' => array(
85 'slug' => '(string) The slug of the deleted term',
86 'success' => '(bool) Whether the operation was successful',
87 ),
88 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/82974409/taxonomies/post_tag/terms/slug:$term/delete',
89 'example_request_data' => array(
90 'headers' => array(
91 'authorization' => 'Bearer YOUR_API_TOKEN',
92 ),
93 ),
94 )
95 );
96
97 /**
98 * Update site terms API endpoint class.
99 *
100 * @phan-constructor-used-for-side-effects
101 */
102 class WPCOM_JSON_API_Update_Term_Endpoint extends WPCOM_JSON_API_Taxonomy_Endpoint {
103 /**
104 * Update site terms API callback.
105 *
106 * - /sites/%s/taxonomies/%s/terms/new -> $blog_id, $taxonomy
107 * - /sites/%s/taxonomies/%s/terms/slug:%s -> $blog_id, $taxonomy, $slug
108 * - /sites/%s/taxonomies/%s/terms/slug:%s/delete -> $blog_id, $taxonomy, $slug
109 *
110 * @param string $path API path.
111 * @param int $blog_id Blog ID.
112 * @param string $taxonomy Taxonomy.
113 * @param int|string $slug Slug, term name.
114 */
115 public function callback( $path = '', $blog_id = 0, $taxonomy = 'category', $slug = 0 ) {
116 $slug = urldecode( $slug );
117 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
118 if ( is_wp_error( $blog_id ) ) {
119 return $blog_id;
120 }
121
122 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
123 $this->load_theme_functions();
124 }
125
126 $user = wp_get_current_user();
127 if ( ! $user || is_wp_error( $user ) || ! $user->ID ) {
128 return new WP_Error( 'authorization_required', 'An active access token must be used to manage taxonomies.', 403 );
129 }
130
131 $taxonomy_meta = get_taxonomy( $taxonomy );
132 if ( false === $taxonomy_meta || (
133 ! $taxonomy_meta->public &&
134 ! current_user_can( $taxonomy_meta->cap->manage_terms ) &&
135 ! current_user_can( $taxonomy_meta->cap->edit_terms ) &&
136 ! current_user_can( $taxonomy_meta->cap->delete_terms ) ) ) {
137 return new WP_Error( 'invalid_taxonomy', 'The taxonomy does not exist', 400 );
138 }
139
140 if ( $this->api->ends_with( $path, '/delete' ) ) {
141 return $this->delete_term( $path, $blog_id, $slug, $taxonomy );
142 } elseif ( $this->api->ends_with( $path, '/new' ) ) {
143 return $this->new_term( $path, $blog_id, $taxonomy );
144 }
145
146 return $this->update_term( $path, $blog_id, $slug, $taxonomy );
147 }
148
149 /**
150 * Create a new term.
151 *
152 * - /sites/%s/taxonomies/%s/terms/new -> $blog_id, $taxonomy
153 *
154 * @param string $path API path.
155 * @param int $blog_id Blog ID.
156 * @param string $taxonomy Taxonomy.
157 */
158 public function new_term( $path, $blog_id, $taxonomy ) {
159 $args = $this->query_args();
160 $input = $this->input();
161 if ( ! is_array( $input ) || ! $input || ! strlen( $input['name'] ) ) {
162 return new WP_Error( 'invalid_input', 'Unknown data passed', 400 );
163 }
164
165 $tax = get_taxonomy( $taxonomy );
166 if ( ! current_user_can( $tax->cap->manage_terms ) ) {
167 return new WP_Error( 'unauthorized', 'User cannot edit taxonomy', 403 );
168 }
169
170 if ( ! isset( $input['parent'] ) || ! is_taxonomy_hierarchical( $taxonomy ) ) {
171 $input['parent'] = 0;
172 }
173
174 $term = get_term_by( 'name', $input['name'], $taxonomy );
175 if ( $term ) {
176 // the same name is allowed as long as the parents are different.
177 if ( $input['parent'] === $term->parent ) {
178 return new WP_Error( 'duplicate', 'A taxonomy with that name already exists', 409 );
179 }
180 }
181
182 $data = wp_insert_term(
183 addslashes( $input['name'] ),
184 $taxonomy,
185 array(
186 'description' => isset( $input['description'] ) ? addslashes( $input['description'] ) : '',
187 'parent' => $input['parent'],
188 )
189 );
190
191 if ( is_wp_error( $data ) ) {
192 return $data;
193 }
194
195 $term = get_term_by( 'id', $data['term_id'], $taxonomy );
196
197 $return = $this->get_taxonomy( $term->slug, $taxonomy, $args['context'] );
198 if ( ! $return || is_wp_error( $return ) ) {
199 return $return;
200 }
201
202 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
203 do_action( 'wpcom_json_api_objects', 'terms' );
204 return $return;
205 }
206
207 /**
208 * Update a term.
209 *
210 * - /sites/%s/taxonomies/%s/terms/slug:%s -> $blog_id, $taxonomy, $slug
211 *
212 * @param string $path API path.
213 * @param int $blog_id Blog ID.
214 * @param int|string $slug Slug, term name.
215 * @param string $taxonomy Taxonomy.
216 */
217 public function update_term( $path, $blog_id, $slug, $taxonomy ) {
218 $tax = get_taxonomy( $taxonomy );
219 if ( ! current_user_can( $tax->cap->edit_terms ) ) {
220 return new WP_Error( 'unauthorized', 'User cannot edit taxonomy', 403 );
221 }
222
223 $term = get_term_by( 'slug', $slug, $taxonomy );
224 if ( ! $term || is_wp_error( $term ) ) {
225 return new WP_Error( 'unknown_taxonomy', 'Unknown taxonomy', 404 );
226 }
227
228 $args = $this->query_args();
229 $input = $this->input( false );
230 if ( ! is_array( $input ) || ! $input ) {
231 return new WP_Error( 'invalid_input', 'Invalid request input', 400 );
232 }
233
234 $update = array();
235 if ( ! empty( $input['parent'] ) || is_taxonomy_hierarchical( $taxonomy ) ) {
236 $update['parent'] = $input['parent'];
237 }
238
239 if ( isset( $input['description'] ) ) {
240 $update['description'] = addslashes( $input['description'] );
241 }
242
243 if ( ! empty( $input['name'] ) ) {
244 $update['name'] = addslashes( $input['name'] );
245 }
246
247 $data = wp_update_term( $term->term_id, $taxonomy, $update );
248 if ( is_wp_error( $data ) ) {
249 return $data;
250 }
251
252 $term = get_term_by( 'id', $data['term_id'], $taxonomy );
253
254 $return = $this->get_taxonomy( $term->slug, $taxonomy, $args['context'] );
255 if ( ! $return || is_wp_error( $return ) ) {
256 return $return;
257 }
258
259 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
260 do_action( 'wpcom_json_api_objects', 'terms' );
261 return $return;
262 }
263
264 /**
265 * Delete a term.
266 *
267 * - /sites/%s/taxonomies/%s/terms/slug:%s/delete -> $blog_id, $taxonomy, $slug
268 *
269 * @param string $path API path.
270 * @param int $blog_id Blog ID.
271 * @param int|string $slug Slug, term name.
272 * @param string $taxonomy Taxonomy.
273 */
274 public function delete_term( $path, $blog_id, $slug, $taxonomy ) {
275 $term = get_term_by( 'slug', $slug, $taxonomy );
276 $tax = get_taxonomy( $taxonomy );
277 if ( ! current_user_can( $tax->cap->delete_terms ) ) {
278 return new WP_Error( 'unauthorized', 'User cannot edit taxonomy', 403 );
279 }
280
281 if ( ! $term || is_wp_error( $term ) ) {
282 return new WP_Error( 'unknown_taxonomy', 'Unknown taxonomy', 404 );
283 }
284
285 $args = $this->query_args();
286 $return = $this->get_taxonomy( $term->slug, $taxonomy, $args['context'] );
287 if ( ! $return || is_wp_error( $return ) ) {
288 return $return;
289 }
290
291 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
292 do_action( 'wpcom_json_api_objects', 'terms' );
293
294 wp_delete_term( $term->term_id, $taxonomy );
295
296 return array(
297 'slug' => (string) $term->slug,
298 'success' => true,
299 );
300 }
301 }
302