PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 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 All 508 releases
← All changes | json-endpoints/class.wpcom-json-api-update-term-endpoint.php +301 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,301 @@
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 +}