PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 8.2.1
Jetpack – WP Security, Backup, Speed, & Growth v8.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 / sal / class.json-api-post-base.php
jetpack / sal Last commit date
class.json-api-date.php 9 years ago class.json-api-links.php 6 years ago class.json-api-metadata.php 9 years ago class.json-api-platform-jetpack.php 9 years ago class.json-api-platform.php 9 years ago class.json-api-post-base.php 6 years ago class.json-api-post-jetpack.php 9 years ago class.json-api-site-base.php 6 years ago class.json-api-site-jetpack-base.php 7 years ago class.json-api-site-jetpack.php 6 years ago class.json-api-token.php 9 years ago
class.json-api-post-base.php
683 lines
1 <?php
2 /**
3 * This class wraps a WP_Post and proxies any undefined attributes
4 * and methods to the wrapped class. We need to do this because at present
5 * the WP_Post class is marked as final (in 4.5 this will change, though it's
6 * not clear if there will be a mechanism to retrieve from the DB into the over-
7 * ridden class dynamically).
8 **/
9
10 require_once dirname( __FILE__ ) . '/class.json-api-metadata.php';
11 require_once dirname( __FILE__ ) . '/class.json-api-date.php';
12 require_once ( ABSPATH . "wp-includes/post.php" );
13
14 abstract class SAL_Post {
15 public $post;
16 public $context;
17 public $site;
18
19 function __construct( $site, $post, $context ) {
20 $this->post = $post;
21 $this->context = $context;
22 $this->site = $site;
23 }
24
25 public function __set( $key, $value ) {
26 $this->post->{ $key } = $value;
27 }
28
29 public function __get( $key ) {
30 if ( $key === 'links' ) {
31 require_once dirname( __FILE__ ) . '/class.json-api-links.php';
32 return WPCOM_JSON_API_Links::getInstance();
33 }
34 return $this->post->{ $key };
35 }
36
37 public function __call( $name, $arguments ) {
38 if ( is_callable( array( $this->post, $name ) ) ) {
39 return call_user_func_array( array( $this->post, $name ), $arguments );
40 } else {
41 trigger_error("Call to undefined method '{$name}'");
42 }
43 }
44
45 public function __isset ( $name ) {
46 return isset( $this->post->{ $name } );
47 }
48
49 abstract public function get_like_count();
50 abstract public function is_liked();
51 abstract public function is_reblogged();
52 abstract public function is_following();
53 abstract public function get_global_id();
54 abstract public function get_geo();
55
56 public function get_menu_order() {
57 return (int) $this->post->menu_order;
58 }
59
60 public function get_guid() {
61 return (string) $this->post->guid;
62 }
63
64 public function get_type() {
65 return (string) $this->post->post_type;
66 }
67
68 public function get_terms() {
69 $taxonomies = get_object_taxonomies( $this->post, 'objects' );
70 $terms = array();
71 foreach ( $taxonomies as $taxonomy ) {
72 if ( ! $taxonomy->public && ! current_user_can( $taxonomy->cap->assign_terms ) ) {
73 continue;
74 }
75
76 $terms[ $taxonomy->name ] = array();
77
78 $taxonomy_terms = wp_get_object_terms( $this->post->ID, $taxonomy->name, array( 'fields' => 'all' ) );
79 foreach ( $taxonomy_terms as $term ) {
80 $formatted_term = $this->format_taxonomy( $term, $taxonomy->name, 'display' );
81 $terms[ $taxonomy->name ][ $term->name ] = $formatted_term;
82 }
83
84 $terms[ $taxonomy->name ] = (object) $terms[ $taxonomy->name ];
85 }
86
87 return (object) $terms;
88 }
89
90 public function get_tags() {
91 $tags = array();
92 $terms = wp_get_post_tags( $this->post->ID );
93 foreach ( $terms as $term ) {
94 if ( !empty( $term->name ) ) {
95 $tags[$term->name] = $this->format_taxonomy( $term, 'post_tag', 'display' );
96 }
97 }
98 return (object) $tags;
99 }
100
101 public function get_categories() {
102 $categories = array();
103 $terms = wp_get_object_terms( $this->post->ID, 'category', array( 'fields' => 'all' ) );
104 foreach ( $terms as $term ) {
105 if ( !empty( $term->name ) ) {
106 $categories[$term->name] = $this->format_taxonomy( $term, 'category', 'display' );
107 }
108 }
109 return (object) $categories;
110 }
111
112 public function get_attachments_and_count() {
113 $attachments = array();
114 $_attachments = new WP_Query( array( 'post_parent' => $this->post->ID, 'post_status' => 'inherit', 'post_type' => 'attachment', 'posts_per_page' => '20' ) );
115 foreach ( $_attachments->posts as $attachment ) {
116 $attachments[$attachment->ID] = $this->get_media_item_v1_1( $attachment->ID );
117 }
118 return array( (object) $attachments, (int) $_attachments->found_posts );
119 }
120
121 public function get_metadata() {
122 $metadata = array();
123 foreach ( (array) has_meta( $this->post->ID ) as $meta ) {
124 // Don't expose protected fields.
125 $meta_key = $meta['meta_key'];
126
127 $show = !( WPCOM_JSON_API_Metadata::is_internal_only( $meta_key ) )
128 &&
129 (
130 WPCOM_JSON_API_Metadata::is_public( $meta_key )
131 ||
132 current_user_can( 'edit_post_meta', $this->post->ID , $meta_key )
133 );
134
135 // Only business plan subscribers can view custom meta description
136 if ( Jetpack_SEO_Posts::DESCRIPTION_META_KEY == $meta_key && ! Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) {
137 $show = false;
138 }
139
140 if ( $show ) {
141 $metadata[] = array(
142 'id' => $meta['meta_id'],
143 'key' => $meta['meta_key'],
144 'value' => maybe_unserialize( $meta['meta_value'] ),
145 );
146 }
147 }
148
149 if ( ! empty( $metadata ) ) {
150 return $metadata;
151 } else {
152 return false;
153 }
154 }
155
156 public function get_meta() {
157 $meta = (object) array(
158 'links' => (object) array(
159 'self' => (string) $this->get_post_link(),
160 'help' => (string) $this->get_post_link( 'help' ),
161 'site' => (string) $this->get_site_link(),
162 'replies' => (string) $this->get_post_link( 'replies/' ),
163 'likes' => (string) $this->get_post_link( 'likes/' ),
164 ),
165 );
166
167 $amp_permalink = get_post_meta( $this->post->ID, '_jetpack_amp_permalink', true );
168
169 if ( ! empty( $amp_permalink ) ) {
170 $meta->links->amp = (string) $amp_permalink;
171 }
172
173 // add autosave link if a more recent autosave exists
174 if ( 'edit' === $this->context ) {
175 $autosave = wp_get_post_autosave( $this->post->ID );
176 if ( $autosave && $autosave->post_modified > $this->post->post_modified )
177 $meta->links->autosave = (string) $this->get_post_link() . '/autosave';
178 }
179
180 return $meta;
181 }
182
183 public function get_current_user_capabilities() {
184 return array(
185 'publish_post' => current_user_can( 'publish_post', $this->post->ID ),
186 'delete_post' => current_user_can( 'delete_post', $this->post->ID ),
187 'edit_post' => current_user_can( 'edit_post', $this->post->ID )
188 );
189 }
190
191 public function get_revisions() {
192 if ( 'edit' !== $this->context ) {
193 return false;
194 }
195
196 $revisions = array();
197 $post_revisions = wp_get_post_revisions( $this->post->ID );
198
199 foreach ( $post_revisions as $_post ) {
200 $revisions[] = $_post->ID;
201 }
202
203 return $revisions;
204 }
205
206 public function get_other_urls() {
207 $other_urls = array();
208
209 if ( 'publish' !== $this->post->post_status ) {
210 $other_urls = $this->get_permalink_suggestions( $this->post->post_title );
211 }
212
213 return (object) $other_urls;
214 }
215
216 protected function get_site_link() {
217 return $this->links->get_site_link( $this->site->get_id() );
218 }
219
220 protected function get_post_link( $path = null ) {
221 return $this->links->get_post_link( $this->site->get_id(), $this->post->ID, $path );
222 }
223
224 public function get_publicize_urls() {
225 $publicize_URLs = array();
226 $publicize = get_post_meta( $this->post->ID, 'publicize_results', true );
227 if ( $publicize ) {
228 foreach ( $publicize as $service => $data ) {
229 switch ( $service ) {
230 case 'twitter' :
231 foreach ( $data as $datum ) {
232 $publicize_URLs[] = esc_url_raw( "https://twitter.com/{$datum['user_id']}/status/{$datum['post_id']}" );
233 }
234 break;
235 case 'fb' :
236 foreach ( $data as $datum ) {
237 $publicize_URLs[] = esc_url_raw( "https://www.facebook.com/permalink.php?story_fbid={$datum['post_id']}&id={$datum['user_id']}" );
238 }
239 break;
240 }
241 }
242 }
243 return (array) $publicize_URLs;
244 }
245
246 public function get_page_template() {
247 return (string) get_post_meta( $this->post->ID, '_wp_page_template', true );
248 }
249
250 // note this is overridden in jetpack-shadow
251 public function get_featured_image() {
252 $image_attributes = wp_get_attachment_image_src( get_post_thumbnail_id( $this->post->ID ), 'full' );
253 if ( is_array( $image_attributes ) && isset( $image_attributes[0] ) ) {
254 return (string) $image_attributes[0];
255 } else {
256 return '';
257 }
258 }
259
260 public function get_post_thumbnail() {
261 $thumb = null;
262
263 $thumb_id = get_post_thumbnail_id( $this->post->ID );
264
265 if ( ! empty( $thumb_id ) ) {
266 $attachment = get_post( $thumb_id );
267 if ( ! empty( $attachment ) )
268 $featured_image_object = $this->get_attachment( $attachment );
269
270 if ( ! empty( $featured_image_object ) ) {
271 $thumb = (object) $featured_image_object;
272 }
273 }
274
275 return $thumb;
276 }
277
278 public function get_format() {
279 $format = (string) get_post_format( $this->post->ID );
280 if ( !$format ) {
281 $format = 'standard';
282 }
283
284 return $format;
285 }
286
287 private function get_attachment( $attachment ) {
288 $metadata = wp_get_attachment_metadata( $attachment->ID );
289
290 $result = array(
291 'ID' => (int) $attachment->ID,
292 'URL' => (string) wp_get_attachment_url( $attachment->ID ),
293 'guid' => (string) $attachment->guid,
294 'mime_type' => (string) $attachment->post_mime_type,
295 'width' => (int) isset( $metadata['width'] ) ? $metadata['width'] : 0,
296 'height' => (int) isset( $metadata['height'] ) ? $metadata['height'] : 0,
297 );
298
299 if ( isset( $metadata['duration'] ) ) {
300 $result['duration'] = (int) $metadata['duration'];
301 }
302
303 /** This filter is documented in class.jetpack-sync.php */
304 return (object) apply_filters( 'get_attachment', $result );
305 }
306
307 public function get_date() {
308 return (string) WPCOM_JSON_API_Date::format_date( $this->post->post_date_gmt, $this->post->post_date );
309 }
310
311 public function get_modified_date() {
312 return (string) WPCOM_JSON_API_Date::format_date( $this->post->post_modified_gmt, $this->post->post_modified );
313 }
314
315 public function get_title() {
316 if ( 'display' === $this->context ) {
317 return (string) get_the_title( $this->post->ID );
318 } else {
319 return (string) htmlspecialchars_decode( $this->post->post_title, ENT_QUOTES );
320 }
321 }
322
323 public function get_url() {
324 if ( 'revision' === $this->post->post_type ) {
325 return (string) esc_url_raw( get_permalink( $this->post->post_parent ) );
326 } else {
327 return (string) esc_url_raw( get_permalink( $this->post->ID ) );
328 }
329 }
330
331 public function get_shortlink() {
332 return (string) esc_url_raw( wp_get_shortlink( $this->post->ID ) );
333 }
334
335 public function get_content() {
336 if ( 'display' === $this->context ) {
337 // TODO: move this WPCOM-specific hack
338 add_filter( 'the_password_form', array( $this, 'the_password_form' ) );
339 $content = (string) $this->get_the_post_content_for_display();
340 remove_filter( 'the_password_form', array( $this, 'the_password_form' ) );
341 return $content;
342 } else {
343 return (string) $this->post->post_content;
344 }
345 }
346
347 public function get_excerpt() {
348 if ( 'display' === $this->context ) {
349 add_filter( 'the_password_form', array( $this, 'the_password_form' ) );
350 ob_start();
351 the_excerpt();
352 $response = (string) ob_get_clean();
353 remove_filter( 'the_password_form', array( $this, 'the_password_form' ) );
354 } else {
355 $response = htmlspecialchars_decode( (string) $this->post->post_excerpt, ENT_QUOTES );
356 }
357 return $response;
358 }
359
360 public function get_status() {
361 return (string) get_post_status( $this->post->ID );
362 }
363
364 public function is_sticky() {
365 return (bool) is_sticky( $this->post->ID );
366 }
367
368 public function get_slug() {
369 return (string) $this->post->post_name;
370 }
371
372 public function get_password() {
373 $password = (string) $this->post->post_password;
374 if ( 'edit' === $this->context ) {
375 $password = htmlspecialchars_decode( (string) $password, ENT_QUOTES );
376 }
377 return $password;
378 }
379
380 public function get_parent() {
381 if ( $this->post->post_parent ) {
382 $parent = get_post( $this->post->post_parent );
383 if ( 'display' === $this->context ) {
384 $parent_title = (string) get_the_title( $parent->ID );
385 } else {
386 $parent_title = (string) htmlspecialchars_decode( $this->post->post_title, ENT_QUOTES );
387 }
388 return (object) array(
389 'ID' => (int) $parent->ID,
390 'type' => (string) $parent->post_type,
391 'link' => (string) $this->links->get_post_link( $this->site->get_id(), $parent->ID ),
392 'title' => $parent_title,
393 );
394 } else {
395 return false;
396 }
397 }
398
399 function the_password_form() {
400 return __( 'This post is password protected.', 'jetpack' );
401 }
402
403 public function get_discussion() {
404 return array(
405 'comments_open' => (bool) comments_open( $this->post->ID ),
406 'comment_status' => (string) $this->post->comment_status,
407 'pings_open' => (bool) pings_open( $this->post->ID ),
408 'ping_status' => (string) $this->post->ping_status,
409 'comment_count' => (int) $this->post->comment_count,
410 );
411 }
412
413 public function is_likes_enabled() {
414 /** This filter is documented in modules/likes.php */
415 $sitewide_likes_enabled = (bool) apply_filters( 'wpl_is_enabled_sitewide', ! get_option( 'disabled_likes' ) );
416 $post_likes_switched = get_post_meta( $this->post->ID, 'switch_like_status', true );
417
418 return $post_likes_switched || ( $sitewide_likes_enabled && $post_likes_switched !== '0' );
419 }
420
421 public function is_sharing_enabled() {
422 $show = true;
423 /** This filter is documented in modules/sharedaddy/sharing-service.php */
424 $show = apply_filters( 'sharing_show', $show, $this->post );
425
426 $switched_status = get_post_meta( $this->post->ID, 'sharing_disabled', false );
427
428 if ( !empty( $switched_status ) )
429 $show = false;
430
431 return (bool) $show;
432 }
433
434 // No Blog ID parameter. No Post ID parameter. Depends on globals.
435 // Expects setup_postdata() to already have been run
436 function get_the_post_content_for_display() {
437 global $pages, $page;
438
439 $old_pages = $pages;
440 $old_page = $page;
441
442 $content = join( "\n\n", $pages );
443 $content = preg_replace( '/<!--more(.*?)?-->/', '', $content );
444 $pages = array( $content );
445 $page = 1;
446
447 ob_start();
448 the_content();
449 $return = ob_get_clean();
450
451 $pages = $old_pages;
452 $page = $old_page;
453
454 return $return;
455 }
456
457 public function get_author() {
458 if ( 0 == $this->post->post_author )
459 return null;
460
461 $show_email = $this->context === 'edit' && current_user_can( 'edit_post', $this->post->ID );
462
463 $user = get_user_by( 'id', $this->post->post_author );
464
465 if ( ! $user || is_wp_error( $user ) ) {
466 trigger_error( 'Unknown user', E_USER_WARNING );
467
468 return null;
469 }
470
471 // TODO factor this out
472 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
473 $active_blog = get_active_blog_for_user( $user->ID );
474 $site_id = $active_blog->blog_id;
475 $profile_URL = "https://en.gravatar.com/{$user->user_login}";
476 } else {
477 $profile_URL = 'https://en.gravatar.com/' . md5( strtolower( trim( $user->user_email ) ) );
478 $site_id = -1;
479 }
480
481 $author = array(
482 'ID' => (int) $user->ID,
483 'login' => (string) $user->user_login,
484 'email' => $show_email ? (string) $user->user_email : false, // (string|bool)
485 'name' => (string) $user->display_name,
486 'first_name' => (string) $user->first_name,
487 'last_name' => (string) $user->last_name,
488 'nice_name' => (string) $user->user_nicename,
489 'URL' => (string) esc_url_raw( $user->user_url ),
490 'avatar_URL' => (string) esc_url_raw( $this->get_avatar_url( $user->user_email ) ),
491 'profile_URL' => (string) esc_url_raw( $profile_URL )
492 );
493
494 if ($site_id > -1) {
495 $author['site_ID'] = (int) $site_id;
496 }
497
498 return (object) $author;
499 }
500
501 protected function get_avatar_url( $email, $avatar_size = 96 ) {
502 $avatar_url = wpcom_get_avatar_url( $email, $avatar_size, '', true );
503 if ( ! $avatar_url || is_wp_error( $avatar_url ) ) {
504 return '';
505 }
506
507 return esc_url_raw( htmlspecialchars_decode( $avatar_url[0] ) );
508 }
509
510 /**
511 * Get extra post permalink suggestions
512 * @return array array of permalink suggestions: 'permalink_URL', 'suggested_slug'
513 */
514 public function get_permalink_suggestions( $title ) {
515 $suggestions = array();
516 list( $suggestions['permalink_URL'], $suggestions['suggested_slug'] ) = get_sample_permalink( $this->post->ID, $title );
517 return $suggestions;
518 }
519
520 private function format_taxonomy( $taxonomy, $taxonomy_type, $context ) {
521 // Permissions
522 switch ( $context ) {
523 case 'edit' :
524 $tax = get_taxonomy( $taxonomy_type );
525 if ( !current_user_can( $tax->cap->edit_terms ) )
526 return new WP_Error( 'unauthorized', 'User cannot edit taxonomy', 403 );
527 break;
528 case 'display' :
529 if ( -1 == get_option( 'blog_public' ) && ! current_user_can( 'read' ) ) {
530 return new WP_Error( 'unauthorized', 'User cannot view taxonomy', 403 );
531 }
532 break;
533 default :
534 return new WP_Error( 'invalid_context', 'Invalid API CONTEXT', 400 );
535 }
536
537 $response = array();
538 $response['ID'] = (int) $taxonomy->term_id;
539 $response['name'] = (string) $taxonomy->name;
540 $response['slug'] = (string) $taxonomy->slug;
541 $response['description'] = (string) $taxonomy->description;
542 $response['post_count'] = (int) $taxonomy->count;
543
544 if ( is_taxonomy_hierarchical( $taxonomy_type ) ) {
545 $response['parent'] = (int) $taxonomy->parent;
546 }
547
548 $response['meta'] = (object) array(
549 'links' => (object) array(
550 'self' => (string) $this->links->get_taxonomy_link( $this->site->get_id(), $taxonomy->slug, $taxonomy_type ),
551 'help' => (string) $this->links->get_taxonomy_link( $this->site->get_id(), $taxonomy->slug, $taxonomy_type, 'help' ),
552 'site' => (string) $this->links->get_site_link( $this->site->get_id() ),
553 ),
554 );
555
556 return (object) $response;
557 }
558
559 // TODO: factor this out into site
560 private function get_media_item_v1_1( $media_id ) {
561 $media_item = get_post( $media_id );
562
563 if ( ! $media_item || is_wp_error( $media_item ) )
564 return new WP_Error( 'unknown_media', 'Unknown Media', 404 );
565
566 $file = basename( wp_get_attachment_url( $media_item->ID ) );
567 $file_info = pathinfo( $file );
568 $ext = $file_info['extension'];
569
570 $response = array(
571 'ID' => $media_item->ID,
572 'URL' => wp_get_attachment_url( $media_item->ID ),
573 'guid' => $media_item->guid,
574 'date' => (string) WPCOM_JSON_API_Date::format_date( $media_item->post_date_gmt, $media_item->post_date ),
575 'post_ID' => $media_item->post_parent,
576 'author_ID' => (int) $media_item->post_author,
577 'file' => $file,
578 'mime_type' => $media_item->post_mime_type,
579 'extension' => $ext,
580 'title' => $media_item->post_title,
581 'caption' => $media_item->post_excerpt,
582 'description' => $media_item->post_content,
583 'alt' => get_post_meta( $media_item->ID, '_wp_attachment_image_alt', true ),
584 'thumbnails' => array()
585 );
586
587 if ( in_array( $ext, array( 'jpg', 'jpeg', 'png', 'gif' ) ) ) {
588 $metadata = wp_get_attachment_metadata( $media_item->ID );
589 if ( isset( $metadata['height'], $metadata['width'] ) ) {
590 $response['height'] = $metadata['height'];
591 $response['width'] = $metadata['width'];
592 }
593
594 if ( isset( $metadata['sizes'] ) ) {
595 /**
596 * Filter the thumbnail sizes available for each attachment ID.
597 *
598 * @module json-api
599 *
600 * @since 3.9.0
601 *
602 * @param array $metadata['sizes'] Array of thumbnail sizes available for a given attachment ID.
603 * @param string $media_id Attachment ID.
604 */
605 $sizes = apply_filters( 'rest_api_thumbnail_sizes', $metadata['sizes'], $media_id );
606 if ( is_array( $sizes ) ) {
607 foreach ( $sizes as $size => $size_details ) {
608 $response['thumbnails'][ $size ] = dirname( $response['URL'] ) . '/' . $size_details['file'];
609 }
610 }
611 }
612
613 if ( isset( $metadata['image_meta'] ) ) {
614 $response['exif'] = $metadata['image_meta'];
615 }
616 }
617
618 if ( in_array( $ext, array( 'mp3', 'm4a', 'wav', 'ogg' ) ) ) {
619 $metadata = wp_get_attachment_metadata( $media_item->ID );
620 $response['length'] = $metadata['length'];
621 $response['exif'] = $metadata;
622 }
623
624 if ( in_array( $ext, array( 'ogv', 'mp4', 'mov', 'wmv', 'avi', 'mpg', '3gp', '3g2', 'm4v' ) ) ) {
625 $metadata = wp_get_attachment_metadata( $media_item->ID );
626 if ( isset( $metadata['height'], $metadata['width'] ) ) {
627 $response['height'] = $metadata['height'];
628 $response['width'] = $metadata['width'];
629 }
630
631 if ( isset( $metadata['length'] ) ) {
632 $response['length'] = $metadata['length'];
633 }
634
635 // add VideoPress info
636 if ( function_exists( 'video_get_info_by_blogpostid' ) ) {
637 $info = video_get_info_by_blogpostid( $this->site->get_id(), $media_id );
638
639 // Thumbnails
640 if ( function_exists( 'video_format_done' ) && function_exists( 'video_image_url_by_guid' ) ) {
641 $response['thumbnails'] = array( 'fmt_hd' => '', 'fmt_dvd' => '', 'fmt_std' => '' );
642 foreach ( $response['thumbnails'] as $size => $thumbnail_url ) {
643 if ( video_format_done( $info, $size ) ) {
644 $response['thumbnails'][ $size ] = video_image_url_by_guid( $info->guid, $size );
645 } else {
646 unset( $response['thumbnails'][ $size ] );
647 }
648 }
649 }
650
651 $response['videopress_guid'] = $info->guid;
652 $response['videopress_processing_done'] = true;
653 if ( '0000-00-00 00:00:00' == $info->finish_date_gmt ) {
654 $response['videopress_processing_done'] = false;
655 }
656 }
657 }
658
659 $response['thumbnails'] = (object) $response['thumbnails'];
660
661 $response['meta'] = (object) array(
662 'links' => (object) array(
663 'self' => (string) $this->links->get_media_link( $this->site->get_id(), $media_id ),
664 'help' => (string) $this->links->get_media_link( $this->site->get_id(), $media_id, 'help' ),
665 'site' => (string) $this->links->get_site_link( $this->site->get_id() ),
666 ),
667 );
668
669 // add VideoPress link to the meta
670 if ( in_array( $ext, array( 'ogv', 'mp4', 'mov', 'wmv', 'avi', 'mpg', '3gp', '3g2', 'm4v' ) ) ) {
671 if ( function_exists( 'video_get_info_by_blogpostid' ) ) {
672 $response['meta']->links->videopress = (string) $this->links->get_link( '/videos/%s', $response['videopress_guid'], '' );
673 }
674 }
675
676 if ( $media_item->post_parent > 0 ) {
677 $response['meta']->links->parent = (string) $this->links->get_post_link( $this->site->get_id(), $media_item->post_parent );
678 }
679
680 return (object) $response;
681 }
682 }
683