PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
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 13.9.2 14.0.1 All 504 releases
← All changes | json-endpoints/class.wpcom-json-api-get-site-endpoint.php +259 -46 12.0.3 → 16.3-a.1 View file →
@@ -1,6 +1,10 @@
1 1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 2
3 +if ( ! defined( 'ABSPATH' ) ) {
4 + exit( 0 );
5 +}
6 +
3 7 new WPCOM_JSON_API_GET_Site_Endpoint(
4 8 array(
5 9 'description' => 'Get information about a site.',
6 10 'group' => 'sites',
@@ -12,8 +16,10 @@
12 16 'path' => '/sites/%s',
13 17 'path_labels' => array(
14 18 '$site' => '(int|string) Site ID or domain',
15 19 ),
20 + 'rest_route' => '/site',
21 + 'rest_min_jp_version' => '15.9',
16 22 'allow_jetpack_site_auth' => true,
17 23
18 24 'allow_fallback_to_jetpack_blog_token' => true,
19 25
@@ -29,8 +35,10 @@
29 35 );
30 36
31 37 /**
32 38 * GET Site endpoint class.
39 + *
40 + * @phan-constructor-used-for-side-effects
33 41 */
34 42 class WPCOM_JSON_API_GET_Site_Endpoint extends WPCOM_JSON_API_Endpoint {
35 43
36 44 /**
@@ -39,8 +47,9 @@
39 47 * @var array $site_format
40 48 */
41 49 public static $site_format = array(
42 50 'ID' => '(int) Site ID',
51 + 'slug' => '(string) Slug of site',
43 52 'name' => '(string) Title of site',
44 53 'description' => '(string) Tagline or description of site',
45 54 'URL' => '(string) Full URL to the site',
46 55 'user_can_manage' => '(bool) The current user can manage this site', // deprecated.
@@ -78,8 +87,24 @@
78 87 'is_wpcom_atomic' => '(bool) If the site is a WP.com Atomic one.',
79 88 'is_wpcom_staging_site' => '(bool) If the site is a WP.com staging site.',
80 89 'user_interactions' => '(array) An array of user interactions with a site.',
81 90 'was_ecommerce_trial' => '(bool) If the site ever used an eCommerce trial.',
91 + 'was_upgraded_from_trial' => '(bool) If the site ever upgraded to a paid plan from a trial.',
92 + 'was_migration_trial' => '(bool) If the site ever used a migration trial.',
93 + 'was_hosting_trial' => '(bool) If the site ever used a hosting trial.',
94 + 'wpcom_site_setup' => '(string) The WP.com site setup identifier.',
95 + 'is_deleted' => '(bool) If the site flagged as deleted.',
96 + 'is_a4a_client' => '(bool) If the site is an A4A client site.',
97 + 'is_a4a_dev_site' => '(bool) If the site is an A4A dev site.',
98 + 'is_garden' => '(bool) If the site is a Garden site.',
99 + 'garden_name' => '(string) The name of the Garden site.',
100 + 'garden_partner' => '(string) The partner of the Garden site.',
101 + 'garden_is_provisioned' => '(bool) If the Garden site is provisioned.',
102 + 'is_wpcom_flex' => '(bool) If the site is a Flex site',
103 + 'big_sky_enabled' => '(bool) Whether the Big Sky AI assistant is enabled for this site.',
104 + 'atomic_email_block' => '(object) State of the block on the site\'s outgoing email, with `status` (`blocked` while a block is active, `at_risk` once it has expired), `reason` and `expires_on` keys, or null when the site has no block history. WordPress.com platform only.',
105 + 'hosting_provider_guess' => '(string) Guess of the hosting provider. WordPress.com platform only; only returned when explicitly requested via the fields parameter.',
106 + 'environment_type' => '(string) The WP_ENVIRONMENT_TYPE of the site as synced by Jetpack. WordPress.com platform only; only returned when explicitly requested via the fields parameter.',
82 107 );
83 108
84 109 /**
85 110 * No member fields.
@@ -111,8 +136,15 @@
111 136 'is_fse_eligible',
112 137 'is_core_site_editor_enabled',
113 138 'is_wpcom_atomic',
114 139 'is_wpcom_staging_site',
140 + 'is_deleted',
141 + 'is_wpcom_flex',
142 + 'is_a4a_client',
143 + 'is_a4a_dev_site',
144 + 'is_garden',
145 + 'big_sky_enabled',
146 + 'garden_name',
115 147 );
116 148
117 149 /**
118 150 * Site options.
@@ -131,8 +163,9 @@
131 163 'is_redirect',
132 164 'unmapped_url',
133 165 'featured_images_enabled',
134 166 'theme_slug',
167 + 'theme_errors',
135 168 'header_image',
136 169 'background_color',
137 170 'image_default_link_type',
138 171 'image_thumbnail_width',
@@ -192,40 +225,55 @@
192 225 'was_created_with_blank_canvas_design',
193 226 'videopress_storage_used',
194 227 'is_difm_lite_in_progress',
195 228 'difm_lite_site_options',
229 + 'is_gating_business_q1',
196 230 'site_intent',
231 + 'site_partner_bundle',
232 + 'onboarding_segment',
197 233 'site_vertical_id',
198 234 'blogging_prompts_settings',
199 235 'launchpad_screen',
200 236 'launchpad_checklist_tasks_statuses',
237 + 'migration_source_site_domain',
201 238 'wpcom_production_blog_id',
202 239 'wpcom_staging_blog_ids',
203 240 'can_blaze',
241 + 'wpcom_site_setup',
242 + 'is_commercial',
243 + 'is_commercial_reasons',
244 + 'wpcom_admin_interface',
245 + 'wpcom_classic_early_release',
246 + 'jetpack_recovery_mode_status',
247 + 'apm_enabled',
248 + 'wpcom_ai_launchpad_enabled',
249 + 'wpcom_ai_launchpad_dismissed',
250 + 'wpcom_ai_launchpad_completed',
204 251 );
205 252
206 253 /**
207 - * List of DIFM Lite options to be displayed
208 - *
209 - * @var array $displayed_difm_lite_site_options
210 - */
211 - protected static $displayed_difm_lite_site_options = array(
212 - 'site_category',
213 - 'is_website_content_submitted',
214 - 'selected_page_titles',
215 - );
216 -
217 - /**
218 254 * Jetpack response fields.
219 255 *
220 256 * @var array $jetpack_response_field_additions
221 257 */
222 258 protected static $jetpack_response_field_additions = array(
259 + 'slug',
223 260 'subscribers_count',
224 261 'site_migration',
225 262 'site_owner',
226 263 'is_wpcom_staging_site',
227 264 'was_ecommerce_trial',
265 + 'was_migration_trial',
266 + 'was_hosting_trial',
267 + 'was_upgraded_from_trial',
268 + 'is_a4a_dev_site',
269 + 'is_garden',
270 + 'garden_name',
271 + 'garden_partner',
272 + 'garden_is_provisioned',
273 + 'is_wpcom_flex',
274 + 'big_sky_enabled',
275 + 'atomic_email_block',
228 276 );
229 277
230 278 /**
231 279 * Jetpack response field member additions.
@@ -241,9 +289,9 @@
241 289
242 290 /**
243 291 * Jetpack response option additions.
244 292 *
245 - * @var array $jetpack_response_field_member_additions
293 + * @var array $jetpack_response_option_additions
246 294 */
247 295 protected static $jetpack_response_option_additions = array(
248 296 'publicize_permanently_disabled',
249 297 'ak_vp_bundle_enabled',
@@ -264,15 +312,34 @@
264 312 'is_pending_plan',
265 313 'is_cloud_eligible',
266 314 'videopress_storage_used',
267 315 'blogging_prompts_settings',
316 + 'wpcom_production_blog_id',
317 + 'wpcom_staging_blog_ids',
318 + 'is_commercial',
319 + 'is_commercial_reasons',
320 + 'wpcom_admin_interface',
321 + 'wpcom_classic_early_release',
322 + 'jetpack_recovery_mode_status',
323 + 'apm_enabled',
268 324 );
269 325
270 326 /**
271 - * Site
327 + * Current enabled trials.
272 328 *
273 - * @var $site.
329 + * @var array $jetpack_enabled_trials
274 330 */
331 + public static $jetpack_enabled_trials = array(
332 + 'was_ecommerce_trial' => 'ecommerce',
333 + 'was_migration_trial' => 'migration',
334 + 'was_hosting_trial' => 'hosting',
335 + );
336 +
337 + /**
338 + * Site.
339 + *
340 + * @var SAL_Site $site.
341 + */
275 342 private $site;
276 343
277 344 /**
278 345 * Fields to include.
@@ -294,10 +361,12 @@
294 361 *
295 362 * /sites/mine
296 363 * /sites/%s -> $blog_id\
297 364 *
298 - * @param string $path - the path.
299 - * @param int $blog_id - the blog ID.
365 + * @param string $path - the path.
366 + * @param int|string $blog_id - the blog ID or the string 'mine'.
367 + *
368 + * @return array|\WP_Error Site response array on success, or WP_Error on failure.
300 369 */
301 370 public function callback( $path = '', $blog_id = 0 ) {
302 371 if ( 'mine' === $blog_id ) {
303 372 $api = WPCOM_JSON_API::init();
@@ -389,9 +458,9 @@
389 458 * @return bool
390 459 */
391 460 private function has_blog_access( $token_details ) {
392 461 $token_details = (array) $token_details;
393 - if ( ! isset( $token_details['access'], $token_details['auth'], $token_details['blog_id'] ) ) {
462 + if ( ! isset( $token_details['access'] ) || ! isset( $token_details['auth'] ) || ! isset( $token_details['blog_id'] ) ) {
394 463 return false;
395 464 }
396 465
397 466 return 'jetpack' === $token_details['auth'] &&
@@ -433,8 +502,11 @@
433 502 switch ( $key ) {
434 503 case 'ID':
435 504 $response[ $key ] = $this->site->blog_id;
436 505 break;
506 + case 'slug':
507 + $response[ $key ] = $this->site->get_slug();
508 + break;
437 509 case 'name':
438 510 $response[ $key ] = $this->site->get_name();
439 511 break;
440 512 case 'description':
@@ -540,13 +612,9 @@
540 612 case 'products':
541 613 $response[ $key ] = $this->site->get_products();
542 614 break;
543 615 case 'zendesk_site_meta':
544 - // D59613-code only added this function to the wpcom SAL subclasses. Absent any better idea,
545 - // we'll just omit the key entirely in Jetpack.
546 - if ( is_callable( array( $this->site, 'get_zendesk_site_meta' ) ) ) {
547 - $response[ $key ] = $this->site->get_zendesk_site_meta();
548 - }
616 + $response[ $key ] = $this->site->get_zendesk_site_meta();
549 617 break;
550 618 case 'quota':
551 619 $response[ $key ] = $this->site->get_quota();
552 620 break;
@@ -574,10 +642,65 @@
574 642 case 'p2_thumbnail_elements':
575 643 $response[ $key ] = $this->site->get_p2_thumbnail_elements();
576 644 break;
577 645 case 'was_ecommerce_trial':
578 - $response[ $key ] = $this->site->was_ecommerce_trial();
646 + $response[ $key ] = $this->site->was_trial( self::$jetpack_enabled_trials['was_ecommerce_trial'] );
579 647 break;
648 + case 'was_migration_trial':
649 + $response[ $key ] = $this->site->was_trial( self::$jetpack_enabled_trials['was_migration_trial'] );
650 + break;
651 + case 'was_hosting_trial':
652 + $response[ $key ] = $this->site->was_trial( self::$jetpack_enabled_trials['was_hosting_trial'] );
653 + break;
654 + case 'was_upgraded_from_trial':
655 + $response[ $key ] = $this->site->was_upgraded_from_trial();
656 + break;
657 + case 'is_deleted':
658 + $response[ $key ] = $this->site->is_deleted();
659 + break;
660 + case 'is_a4a_client':
661 + $response[ $key ] = $this->site->is_a4a_client();
662 + break;
663 + case 'is_a4a_dev_site':
664 + $response[ $key ] = $this->site->is_a4a_dev_site();
665 + break;
666 + case 'is_garden':
667 + $response[ $key ] = $this->site->is_garden();
668 + break;
669 + case 'garden_name':
670 + $response[ $key ] = $this->site->garden_name();
671 + break;
672 + case 'garden_partner':
673 + $response[ $key ] = $this->site->garden_partner();
674 + break;
675 + case 'garden_is_provisioned':
676 + $response[ $key ] = $this->site->garden_is_provisioned();
677 + break;
678 + case 'is_wpcom_flex':
679 + $response[ $key ] = $this->site->is_wpcom_flex();
680 + break;
681 + case 'big_sky_enabled':
682 + $response[ $key ] = $this->site->is_big_sky_enabled();
683 + break;
684 + case 'atomic_email_block':
685 + $response[ $key ] = $this->site->get_atomic_email_block();
686 + break;
687 + case 'hosting_provider_guess':
688 + // WordPress.com platform decoration, computed only when explicitly requested
689 + // via `fields` so default `_all` responses are unchanged.
690 + if ( $this->is_wpcom()
691 + && function_exists( 'get_jetpack_hosting_provider' )
692 + && is_array( $this->fields_to_include ) ) {
693 + $response[ $key ] = get_jetpack_hosting_provider( get_current_blog_id() );
694 + }
695 + break;
696 + case 'environment_type':
697 + // WordPress.com platform decoration, computed only when explicitly requested
698 + // via `fields` so default `_all` responses are unchanged.
699 + if ( $this->is_wpcom() && is_array( $this->fields_to_include ) ) {
700 + $response[ $key ] = $this->get_site_environment_type();
701 + }
702 + break;
580 703 }
581 704
582 705 do_action( 'post_render_site_response_key', $key );
583 706 }
@@ -627,8 +750,11 @@
627 750 break;
628 751 case 'theme_slug':
629 752 $options[ $key ] = $site->get_theme_slug();
630 753 break;
754 + case 'theme_errors':
755 + $options[ $key ] = $site->get_theme_errors();
756 + break;
631 757 case 'header_image':
632 758 $options[ $key ] = $site->get_header_image();
633 759 break;
634 760 case 'background_color':
@@ -787,13 +913,9 @@
787 913 case 'import_engine':
788 914 $options[ $key ] = $site->get_import_engine();
789 915 break;
790 916 case 'is_pending_plan':
791 - // D40032-code only added this function to the wpcom SAL subclasses. Absent any better idea,
792 - // we'll just omit the key entirely in Jetpack.
793 - if ( is_callable( array( $site, 'is_pending_plan' ) ) ) {
794 - $options[ $key ] = $site->is_pending_plan();
795 - }
917 + $options[ $key ] = $site->is_pending_plan();
796 918 break;
797 919
798 920 case 'is_wpforteams_site':
799 921 $options[ $key ] = $site->is_wpforteams_site();
@@ -835,25 +957,28 @@
835 957 case 'is_difm_lite_in_progress':
836 958 $options[ $key ] = $site->is_difm_lite_in_progress();
837 959 break;
838 960 case 'difm_lite_site_options':
839 - $difm_lite_options = $site->get_difm_lite_site_options();
840 - $visible_options = self::$displayed_difm_lite_site_options;
841 - $filtered_difm_lite_options = new stdClass();
842 - if ( $difm_lite_options ) {
843 - $filtered_difm_lite_options = array_filter(
844 - $difm_lite_options,
845 - function ( $key ) use ( $visible_options ) {
846 - return in_array( $key, $visible_options, true );
847 - },
848 - ARRAY_FILTER_USE_KEY
849 - );
961 + $difm_lite_site_options = $site->get_difm_lite_site_options();
962 + if ( null !== $difm_lite_site_options ) {
963 + $options[ $key ] = (object) $difm_lite_site_options;
850 964 }
851 - $options[ $key ] = $filtered_difm_lite_options;
852 965 break;
966 + case 'is_gating_business_q1':
967 + $options[ $key ] = $site->is_gating_business_q1();
968 + break;
853 969 case 'site_intent':
854 970 $options[ $key ] = $site->get_site_intent();
855 971 break;
972 + case 'site_partner_bundle':
973 + $options[ $key ] = $site->get_site_partner_bundle();
974 + break;
975 + case 'site_goals':
976 + $options[ $key ] = $site->get_site_goals();
977 + break;
978 + case 'onboarding_segment':
979 + $options[ $key ] = $site->get_onboarding_segment();
980 + break;
856 981 case 'site_vertical_id':
857 982 $options[ $key ] = $site->get_site_vertical_id();
858 983 break;
859 984 case 'blogging_prompts_settings':
@@ -866,8 +991,11 @@
866 991 break;
867 992 case 'launchpad_checklist_tasks_statuses':
868 993 $options[ $key ] = $site->get_launchpad_checklist_tasks_statuses();
869 994 break;
995 + case 'migration_source_site_domain':
996 + $options[ $key ] = $site->get_migration_source_site_domain();
997 + break;
870 998 case 'wpcom_production_blog_id':
871 999 $options[ $key ] = $site->get_wpcom_production_blog_id();
872 1000 break;
873 1001 case 'wpcom_staging_blog_ids':
@@ -875,8 +1003,38 @@
875 1003 break;
876 1004 case 'can_blaze':
877 1005 $options[ $key ] = $site->can_blaze();
878 1006 break;
1007 + case 'wpcom_site_setup':
1008 + $options[ $key ] = $site->get_wpcom_site_setup();
1009 + break;
1010 + case 'is_commercial':
1011 + $options[ $key ] = $site->is_commercial();
1012 + break;
1013 + case 'is_commercial_reasons':
1014 + $options[ $key ] = $site->get_is_commercial_reasons();
1015 + break;
1016 + case 'wpcom_admin_interface':
1017 + $options[ $key ] = $site->get_wpcom_admin_interface();
1018 + break;
1019 + case 'wpcom_classic_early_release':
1020 + $options[ $key ] = $site->get_wpcom_classic_early_release();
1021 + break;
1022 + case 'jetpack_recovery_mode_status':
1023 + $options[ $key ] = $site->get_jetpack_recovery_mode_status();
1024 + break;
1025 + case 'apm_enabled':
1026 + $options[ $key ] = $site->get_apm_enabled();
1027 + break;
1028 + case 'wpcom_ai_launchpad_enabled':
1029 + $options[ $key ] = $site->is_ai_launchpad_enabled();
1030 + break;
1031 + case 'wpcom_ai_launchpad_dismissed':
1032 + $options[ $key ] = $site->is_ai_launchpad_dismissed();
1033 + break;
1034 + case 'wpcom_ai_launchpad_completed':
1035 + $options[ $key ] = $site->is_ai_launchpad_completed();
1036 + break;
879 1037 }
880 1038 }
881 1039
882 1040 return $options;
@@ -908,14 +1066,20 @@
908 1066
909 1067 /**
910 1068 * Apply any WPCOM-only response components to a Jetpack site response.
911 1069 *
912 - * @param array $response - the response.
1070 + * @param object $response - the response.
913 1071 */
914 1072 public function decorate_jetpack_response( &$response ) {
1073 + $this->filter_fields_and_options();
915 1074 $this->site = $this->get_platform()->get_site( $response->ID );
916 1075 switch_to_blog( $this->site->get_id() );
917 1076
1077 + // Allow the SAL site to apply its own overrides to the proxied response.
1078 + if ( method_exists( $this->site, 'decorate_jetpack_response' ) ) {
1079 + $this->site->decorate_jetpack_response( $response ); // @phan-suppress-current-line PhanUndeclaredMethod -- checked via method_exists().
1080 + }
1081 +
918 1082 $wpcom_response = $this->render_response_keys( self::$jetpack_response_field_additions );
919 1083
920 1084 foreach ( $wpcom_response as $key => $value ) {
921 1085 $response->{ $key } = $value;
@@ -920,9 +1084,11 @@
920 1084 foreach ( $wpcom_response as $key => $value ) {
921 1085 $response->{ $key } = $value;
922 1086 }
923 1087
924 - if ( $this->has_user_access() || $this->has_blog_access( $this->api->token_details ) ) {
1088 + $has_site_access = $this->has_user_access() || $this->has_blog_access( $this->api->token_details );
1089 +
1090 + if ( $has_site_access ) {
925 1091 $wpcom_member_response = $this->render_response_keys( self::$jetpack_response_field_member_additions );
926 1092
927 1093 foreach ( $wpcom_member_response as $key => $value ) {
928 1094 $response->{ $key } = $value;
@@ -941,22 +1107,28 @@
941 1107 unset( $response->site_owner );
942 1108 unset( $response->plan );
943 1109 unset( $response->products );
944 1110 unset( $response->zendesk_site_meta );
1111 + unset( $response->atomic_email_block );
945 1112 }
946 1113
947 1114 // render additional options.
948 - if ( $response->options ) {
1115 + if ( isset( $response->options ) && $response->options ) {
949 1116 $wpcom_options_response = $this->render_option_keys( self::$jetpack_response_option_additions );
950 1117
951 1118 // Remove heic from jetpack (and atomic) sites so that the iOS app know to convert the file format into a JPEG.
952 1119 // heic fromat is currently not supported by for uploading.
953 1120 // See https://jetpackp2.wordpress.com/2020/08/19/image-uploads-in-the-wp-ios-app-broken
954 - if ( $this->site->is_jetpack() && isset( $response->options['allowed_file_types'] ) ) {
1121 + if (
1122 + $this->site->is_jetpack()
1123 + && isset( $response->options['allowed_file_types'] )
1124 + && is_array( $response->options['allowed_file_types'] )
1125 + ) {
1126 + $allowed_file_types = (array) $response->options['allowed_file_types'];
955 1127 $remove_file_types = array(
956 1128 'heic',
957 1129 );
958 - $response->options['allowed_file_types'] = array_values( array_diff( $response->options['allowed_file_types'], $remove_file_types ) );
1130 + $response->options['allowed_file_types'] = array_values( array_diff( $allowed_file_types, $remove_file_types ) );
959 1131 }
960 1132
961 1133 foreach ( $wpcom_options_response as $key => $value ) {
962 1134 $response->options[ $key ] = $value;
@@ -962,11 +1134,44 @@
962 1134 $response->options[ $key ] = $value;
963 1135 }
964 1136 }
965 1137
1138 + // WordPress.com platform fields are not part of proxied Jetpack responses;
1139 + // add them only when explicitly requested.
1140 + if ( $this->is_wpcom() && $has_site_access && is_array( $this->fields_to_include ) ) {
1141 + if ( function_exists( 'get_jetpack_hosting_provider' ) && in_array( 'hosting_provider_guess', $this->fields_to_include, true ) ) {
1142 + $response->hosting_provider_guess = get_jetpack_hosting_provider( get_current_blog_id() );
1143 + }
1144 + if ( in_array( 'environment_type', $this->fields_to_include, true ) ) {
1145 + $response->environment_type = $this->get_site_environment_type();
1146 + }
1147 + }
1148 +
966 1149 restore_current_blog();
967 1150 return $response; // possibly no need since it's modified in place.
968 1151 }
1152 +
1153 + /**
1154 + * Whether this request is running on the WordPress.com platform.
1155 + *
1156 + * @return bool
1157 + */
1158 + protected function is_wpcom() {
1159 + return ( new \Automattic\Jetpack\Status\Host() )->is_wpcom_platform();
1160 + }
1161 +
1162 + /**
1163 + * Get the site's synced WP_ENVIRONMENT_TYPE.
1164 + *
1165 + * @return string|null
1166 + */
1167 + protected function get_site_environment_type() {
1168 + if ( function_exists( 'get_blog_option' ) ) {
1169 + return get_blog_option( get_current_blog_id(), 'jetpack_callable_wp_get_environment_type', null );
1170 + }
1171 +
1172 + return get_option( 'jetpack_callable_wp_get_environment_type', null );
1173 + }
969 1174 }
970 1175
971 1176 new WPCOM_JSON_API_List_Post_Formats_Endpoint(
972 1177 array(
@@ -992,9 +1197,11 @@
992 1197 )
993 1198 );
994 1199
995 1200 /**
996 - * List Post Formates endpoint class.
1201 + * List Post Formats endpoint class.
1202 + *
1203 + * @phan-constructor-used-for-side-effects
997 1204 */
998 1205 class WPCOM_JSON_API_List_Post_Formats_Endpoint extends WPCOM_JSON_API_Endpoint { // phpcs:ignore
999 1206 /**
1000 1207 *
@@ -1003,8 +1210,10 @@
1003 1210 * /sites/%s/post-formats -> $blog_id
1004 1211 *
1005 1212 * @param string $path - the path.
1006 1213 * @param int $blog_id - the blog ID.
1214 + *
1215 + * @return array|\WP_Error Array with 'formats' on success, or WP_Error on failure.
1007 1216 */
1008 1217 public function callback( $path = '', $blog_id = 0 ) {
1009 1218 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
1010 1219 if ( is_wp_error( $blog_id ) ) {
@@ -1058,8 +1267,10 @@
1058 1267 );
1059 1268
1060 1269 /**
1061 1270 * List page templates endpoint class.
1271 + *
1272 + * @phan-constructor-used-for-side-effects
1062 1273 */
1063 1274 class WPCOM_JSON_API_List_Page_Templates_Endpoint extends WPCOM_JSON_API_Endpoint { // phpcs:ignore
1064 1275 /**
1065 1276 *
@@ -1067,8 +1278,10 @@
1067 1278 * /sites/%s/page-templates -> $blog_id
1068 1279 *
1069 1280 * @param string $path - the path.
1070 1281 * @param int $blog_id - the blog ID.
1282 + *
1283 + * @return array|\WP_Error Array with 'templates' on success, or WP_Error on failure.
1071 1284 */
1072 1285 public function callback( $path = '', $blog_id = 0 ) {
1073 1286 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
1074 1287 if ( is_wp_error( $blog_id ) ) {