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
← All changes | json-endpoints/class.wpcom-json-api-get-site-endpoint.php +212 -43 13.3.3 → 16.3-a.7 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.
@@ -82,8 +91,20 @@
82 91 'was_upgraded_from_trial' => '(bool) If the site ever upgraded to a paid plan from a trial.',
83 92 'was_migration_trial' => '(bool) If the site ever used a migration trial.',
84 93 'was_hosting_trial' => '(bool) If the site ever used a hosting trial.',
85 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.',
86 107 );
87 108
88 109 /**
89 110 * No member fields.
@@ -115,8 +136,15 @@
115 136 'is_fse_eligible',
116 137 'is_core_site_editor_enabled',
117 138 'is_wpcom_atomic',
118 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',
119 147 );
120 148
121 149 /**
122 150 * Site options.
@@ -135,8 +163,9 @@
135 163 'is_redirect',
136 164 'unmapped_url',
137 165 'featured_images_enabled',
138 166 'theme_slug',
167 + 'theme_errors',
139 168 'header_image',
140 169 'background_color',
141 170 'image_default_link_type',
142 171 'image_thumbnail_width',
@@ -196,13 +225,18 @@
196 225 'was_created_with_blank_canvas_design',
197 226 'videopress_storage_used',
198 227 'is_difm_lite_in_progress',
199 228 'difm_lite_site_options',
229 + 'is_gating_business_q1',
230 + 'is_legacy_gating_site',
200 231 'site_intent',
232 + 'site_partner_bundle',
233 + 'onboarding_segment',
201 234 'site_vertical_id',
202 235 'blogging_prompts_settings',
203 236 'launchpad_screen',
204 237 'launchpad_checklist_tasks_statuses',
238 + 'migration_source_site_domain',
205 239 'wpcom_production_blog_id',
206 240 'wpcom_staging_blog_ids',
207 241 'can_blaze',
208 242 'wpcom_site_setup',
@@ -209,27 +243,23 @@
209 243 'is_commercial',
210 244 'is_commercial_reasons',
211 245 'wpcom_admin_interface',
212 246 'wpcom_classic_early_release',
247 + 'jetpack_recovery_mode_status',
248 + 'jetpack_sso_require_two_step',
249 + 'apm_enabled',
250 + 'wpcom_ai_launchpad_enabled',
251 + 'wpcom_ai_launchpad_dismissed',
252 + 'wpcom_ai_launchpad_completed',
213 253 );
214 254
215 255 /**
216 - * List of DIFM Lite options to be displayed
217 - *
218 - * @var array $displayed_difm_lite_site_options
219 - */
220 - protected static $displayed_difm_lite_site_options = array(
221 - 'site_category',
222 - 'is_website_content_submitted',
223 - 'selected_page_titles',
224 - );
225 -
226 - /**
227 256 * Jetpack response fields.
228 257 *
229 258 * @var array $jetpack_response_field_additions
230 259 */
231 260 protected static $jetpack_response_field_additions = array(
261 + 'slug',
232 262 'subscribers_count',
233 263 'site_migration',
234 264 'site_owner',
235 265 'is_wpcom_staging_site',
@@ -236,8 +266,16 @@
236 266 'was_ecommerce_trial',
237 267 'was_migration_trial',
238 268 'was_hosting_trial',
239 269 'was_upgraded_from_trial',
270 + 'is_a4a_dev_site',
271 + 'is_garden',
272 + 'garden_name',
273 + 'garden_partner',
274 + 'garden_is_provisioned',
275 + 'is_wpcom_flex',
276 + 'big_sky_enabled',
277 + 'atomic_email_block',
240 278 );
241 279
242 280 /**
243 281 * Jetpack response field member additions.
@@ -253,9 +291,9 @@
253 291
254 292 /**
255 293 * Jetpack response option additions.
256 294 *
257 - * @var array $jetpack_response_field_member_additions
295 + * @var array $jetpack_response_option_additions
258 296 */
259 297 protected static $jetpack_response_option_additions = array(
260 298 'publicize_permanently_disabled',
261 299 'ak_vp_bundle_enabled',
@@ -282,8 +320,11 @@
282 320 'is_commercial',
283 321 'is_commercial_reasons',
284 322 'wpcom_admin_interface',
285 323 'wpcom_classic_early_release',
324 + 'jetpack_recovery_mode_status',
325 + 'jetpack_sso_require_two_step',
326 + 'apm_enabled',
286 327 );
287 328
288 329 /**
289 330 * Current enabled trials.
@@ -296,11 +337,11 @@
296 337 'was_hosting_trial' => 'hosting',
297 338 );
298 339
299 340 /**
300 - * Site
341 + * Site.
301 342 *
302 - * @var $site.
343 + * @var SAL_Site $site.
303 344 */
304 345 private $site;
305 346
306 347 /**
@@ -323,10 +364,12 @@
323 364 *
324 365 * /sites/mine
325 366 * /sites/%s -> $blog_id\
326 367 *
327 - * @param string $path - the path.
328 - * @param int $blog_id - the blog ID.
368 + * @param string $path - the path.
369 + * @param int|string $blog_id - the blog ID or the string 'mine'.
370 + *
371 + * @return array|\WP_Error Site response array on success, or WP_Error on failure.
329 372 */
330 373 public function callback( $path = '', $blog_id = 0 ) {
331 374 if ( 'mine' === $blog_id ) {
332 375 $api = WPCOM_JSON_API::init();
@@ -462,8 +505,11 @@
462 505 switch ( $key ) {
463 506 case 'ID':
464 507 $response[ $key ] = $this->site->blog_id;
465 508 break;
509 + case 'slug':
510 + $response[ $key ] = $this->site->get_slug();
511 + break;
466 512 case 'name':
467 513 $response[ $key ] = $this->site->get_name();
468 514 break;
469 515 case 'description':
@@ -569,13 +615,9 @@
569 615 case 'products':
570 616 $response[ $key ] = $this->site->get_products();
571 617 break;
572 618 case 'zendesk_site_meta':
573 - // D59613-code only added this function to the wpcom SAL subclasses. Absent any better idea,
574 - // we'll just omit the key entirely in Jetpack.
575 - if ( is_callable( array( $this->site, 'get_zendesk_site_meta' ) ) ) {
576 - $response[ $key ] = $this->site->get_zendesk_site_meta();
577 - }
619 + $response[ $key ] = $this->site->get_zendesk_site_meta();
578 620 break;
579 621 case 'quota':
580 622 $response[ $key ] = $this->site->get_quota();
581 623 break;
@@ -614,8 +656,54 @@
614 656 break;
615 657 case 'was_upgraded_from_trial':
616 658 $response[ $key ] = $this->site->was_upgraded_from_trial();
617 659 break;
660 + case 'is_deleted':
661 + $response[ $key ] = $this->site->is_deleted();
662 + break;
663 + case 'is_a4a_client':
664 + $response[ $key ] = $this->site->is_a4a_client();
665 + break;
666 + case 'is_a4a_dev_site':
667 + $response[ $key ] = $this->site->is_a4a_dev_site();
668 + break;
669 + case 'is_garden':
670 + $response[ $key ] = $this->site->is_garden();
671 + break;
672 + case 'garden_name':
673 + $response[ $key ] = $this->site->garden_name();
674 + break;
675 + case 'garden_partner':
676 + $response[ $key ] = $this->site->garden_partner();
677 + break;
678 + case 'garden_is_provisioned':
679 + $response[ $key ] = $this->site->garden_is_provisioned();
680 + break;
681 + case 'is_wpcom_flex':
682 + $response[ $key ] = $this->site->is_wpcom_flex();
683 + break;
684 + case 'big_sky_enabled':
685 + $response[ $key ] = $this->site->is_big_sky_enabled();
686 + break;
687 + case 'atomic_email_block':
688 + $response[ $key ] = $this->site->get_atomic_email_block();
689 + break;
690 + case 'hosting_provider_guess':
691 + // WordPress.com platform decoration, computed only when explicitly requested
692 + // via `fields` so default `_all` responses are unchanged.
693 + if ( $this->is_wpcom()
694 + && function_exists( 'get_jetpack_hosting_provider' )
695 + && is_array( $this->fields_to_include ) ) {
696 + $response[ $key ] = get_jetpack_hosting_provider( get_current_blog_id() );
697 + }
698 + break;
699 + case 'environment_type':
700 + // WordPress.com platform decoration, computed only when explicitly requested
701 + // via `fields` so default `_all` responses are unchanged.
702 + if ( $this->is_wpcom() && is_array( $this->fields_to_include ) ) {
703 + $response[ $key ] = $this->get_site_environment_type();
704 + }
705 + break;
618 706 }
619 707
620 708 do_action( 'post_render_site_response_key', $key );
621 709 }
@@ -665,8 +753,11 @@
665 753 break;
666 754 case 'theme_slug':
667 755 $options[ $key ] = $site->get_theme_slug();
668 756 break;
757 + case 'theme_errors':
758 + $options[ $key ] = $site->get_theme_errors();
759 + break;
669 760 case 'header_image':
670 761 $options[ $key ] = $site->get_header_image();
671 762 break;
672 763 case 'background_color':
@@ -825,13 +916,9 @@
825 916 case 'import_engine':
826 917 $options[ $key ] = $site->get_import_engine();
827 918 break;
828 919 case 'is_pending_plan':
829 - // D40032-code only added this function to the wpcom SAL subclasses. Absent any better idea,
830 - // we'll just omit the key entirely in Jetpack.
831 - if ( is_callable( array( $site, 'is_pending_plan' ) ) ) {
832 - $options[ $key ] = $site->is_pending_plan();
833 - }
920 + $options[ $key ] = $site->is_pending_plan();
834 921 break;
835 922
836 923 case 'is_wpforteams_site':
837 924 $options[ $key ] = $site->is_wpforteams_site();
@@ -873,25 +960,31 @@
873 960 case 'is_difm_lite_in_progress':
874 961 $options[ $key ] = $site->is_difm_lite_in_progress();
875 962 break;
876 963 case 'difm_lite_site_options':
877 - $difm_lite_options = $site->get_difm_lite_site_options();
878 - $visible_options = self::$displayed_difm_lite_site_options;
879 - $filtered_difm_lite_options = new stdClass();
880 - if ( $difm_lite_options ) {
881 - $filtered_difm_lite_options = array_filter(
882 - $difm_lite_options,
883 - function ( $key ) use ( $visible_options ) {
884 - return in_array( $key, $visible_options, true );
885 - },
886 - ARRAY_FILTER_USE_KEY
887 - );
964 + $difm_lite_site_options = $site->get_difm_lite_site_options();
965 + if ( null !== $difm_lite_site_options ) {
966 + $options[ $key ] = (object) $difm_lite_site_options;
888 967 }
889 - $options[ $key ] = $filtered_difm_lite_options;
890 968 break;
969 + case 'is_gating_business_q1':
970 + $options[ $key ] = $site->is_gating_business_q1();
971 + break;
972 + case 'is_legacy_gating_site':
973 + $options[ $key ] = $site->is_legacy_gating_site();
974 + break;
891 975 case 'site_intent':
892 976 $options[ $key ] = $site->get_site_intent();
893 977 break;
978 + case 'site_partner_bundle':
979 + $options[ $key ] = $site->get_site_partner_bundle();
980 + break;
981 + case 'site_goals':
982 + $options[ $key ] = $site->get_site_goals();
983 + break;
984 + case 'onboarding_segment':
985 + $options[ $key ] = $site->get_onboarding_segment();
986 + break;
894 987 case 'site_vertical_id':
895 988 $options[ $key ] = $site->get_site_vertical_id();
896 989 break;
897 990 case 'blogging_prompts_settings':
@@ -904,8 +997,11 @@
904 997 break;
905 998 case 'launchpad_checklist_tasks_statuses':
906 999 $options[ $key ] = $site->get_launchpad_checklist_tasks_statuses();
907 1000 break;
1001 + case 'migration_source_site_domain':
1002 + $options[ $key ] = $site->get_migration_source_site_domain();
1003 + break;
908 1004 case 'wpcom_production_blog_id':
909 1005 $options[ $key ] = $site->get_wpcom_production_blog_id();
910 1006 break;
911 1007 case 'wpcom_staging_blog_ids':
@@ -928,8 +1024,26 @@
928 1024 break;
929 1025 case 'wpcom_classic_early_release':
930 1026 $options[ $key ] = $site->get_wpcom_classic_early_release();
931 1027 break;
1028 + case 'jetpack_recovery_mode_status':
1029 + $options[ $key ] = $site->get_jetpack_recovery_mode_status();
1030 + break;
1031 + case 'jetpack_sso_require_two_step':
1032 + $options[ $key ] = $site->get_jetpack_sso_require_two_step();
1033 + break;
1034 + case 'apm_enabled':
1035 + $options[ $key ] = $site->get_apm_enabled();
1036 + break;
1037 + case 'wpcom_ai_launchpad_enabled':
1038 + $options[ $key ] = $site->is_ai_launchpad_enabled();
1039 + break;
1040 + case 'wpcom_ai_launchpad_dismissed':
1041 + $options[ $key ] = $site->is_ai_launchpad_dismissed();
1042 + break;
1043 + case 'wpcom_ai_launchpad_completed':
1044 + $options[ $key ] = $site->is_ai_launchpad_completed();
1045 + break;
932 1046 }
933 1047 }
934 1048
935 1049 return $options;
@@ -961,14 +1075,20 @@
961 1075
962 1076 /**
963 1077 * Apply any WPCOM-only response components to a Jetpack site response.
964 1078 *
965 - * @param array $response - the response.
1079 + * @param object $response - the response.
966 1080 */
967 1081 public function decorate_jetpack_response( &$response ) {
1082 + $this->filter_fields_and_options();
968 1083 $this->site = $this->get_platform()->get_site( $response->ID );
969 1084 switch_to_blog( $this->site->get_id() );
970 1085
1086 + // Allow the SAL site to apply its own overrides to the proxied response.
1087 + if ( method_exists( $this->site, 'decorate_jetpack_response' ) ) {
1088 + $this->site->decorate_jetpack_response( $response ); // @phan-suppress-current-line PhanUndeclaredMethod -- checked via method_exists().
1089 + }
1090 +
971 1091 $wpcom_response = $this->render_response_keys( self::$jetpack_response_field_additions );
972 1092
973 1093 foreach ( $wpcom_response as $key => $value ) {
974 1094 $response->{ $key } = $value;
@@ -973,9 +1093,11 @@
973 1093 foreach ( $wpcom_response as $key => $value ) {
974 1094 $response->{ $key } = $value;
975 1095 }
976 1096
977 - if ( $this->has_user_access() || $this->has_blog_access( $this->api->token_details ) ) {
1097 + $has_site_access = $this->has_user_access() || $this->has_blog_access( $this->api->token_details );
1098 +
1099 + if ( $has_site_access ) {
978 1100 $wpcom_member_response = $this->render_response_keys( self::$jetpack_response_field_member_additions );
979 1101
980 1102 foreach ( $wpcom_member_response as $key => $value ) {
981 1103 $response->{ $key } = $value;
@@ -994,8 +1116,9 @@
994 1116 unset( $response->site_owner );
995 1117 unset( $response->plan );
996 1118 unset( $response->products );
997 1119 unset( $response->zendesk_site_meta );
1120 + unset( $response->atomic_email_block );
998 1121 }
999 1122
1000 1123 // render additional options.
1001 1124 if ( isset( $response->options ) && $response->options ) {
@@ -1003,13 +1126,18 @@
1003 1126
1004 1127 // Remove heic from jetpack (and atomic) sites so that the iOS app know to convert the file format into a JPEG.
1005 1128 // heic fromat is currently not supported by for uploading.
1006 1129 // See https://jetpackp2.wordpress.com/2020/08/19/image-uploads-in-the-wp-ios-app-broken
1007 - if ( $this->site->is_jetpack() && isset( $response->options['allowed_file_types'] ) ) {
1130 + if (
1131 + $this->site->is_jetpack()
1132 + && isset( $response->options['allowed_file_types'] )
1133 + && is_array( $response->options['allowed_file_types'] )
1134 + ) {
1135 + $allowed_file_types = (array) $response->options['allowed_file_types'];
1008 1136 $remove_file_types = array(
1009 1137 'heic',
1010 1138 );
1011 - $response->options['allowed_file_types'] = array_values( array_diff( $response->options['allowed_file_types'], $remove_file_types ) );
1139 + $response->options['allowed_file_types'] = array_values( array_diff( $allowed_file_types, $remove_file_types ) );
1012 1140 }
1013 1141
1014 1142 foreach ( $wpcom_options_response as $key => $value ) {
1015 1143 $response->options[ $key ] = $value;
@@ -1015,11 +1143,44 @@
1015 1143 $response->options[ $key ] = $value;
1016 1144 }
1017 1145 }
1018 1146
1147 + // WordPress.com platform fields are not part of proxied Jetpack responses;
1148 + // add them only when explicitly requested.
1149 + if ( $this->is_wpcom() && $has_site_access && is_array( $this->fields_to_include ) ) {
1150 + if ( function_exists( 'get_jetpack_hosting_provider' ) && in_array( 'hosting_provider_guess', $this->fields_to_include, true ) ) {
1151 + $response->hosting_provider_guess = get_jetpack_hosting_provider( get_current_blog_id() );
1152 + }
1153 + if ( in_array( 'environment_type', $this->fields_to_include, true ) ) {
1154 + $response->environment_type = $this->get_site_environment_type();
1155 + }
1156 + }
1157 +
1019 1158 restore_current_blog();
1020 1159 return $response; // possibly no need since it's modified in place.
1021 1160 }
1161 +
1162 + /**
1163 + * Whether this request is running on the WordPress.com platform.
1164 + *
1165 + * @return bool
1166 + */
1167 + protected function is_wpcom() {
1168 + return ( new \Automattic\Jetpack\Status\Host() )->is_wpcom_platform();
1169 + }
1170 +
1171 + /**
1172 + * Get the site's synced WP_ENVIRONMENT_TYPE.
1173 + *
1174 + * @return string|null
1175 + */
1176 + protected function get_site_environment_type() {
1177 + if ( function_exists( 'get_blog_option' ) ) {
1178 + return get_blog_option( get_current_blog_id(), 'jetpack_callable_wp_get_environment_type', null );
1179 + }
1180 +
1181 + return get_option( 'jetpack_callable_wp_get_environment_type', null );
1182 + }
1022 1183 }
1023 1184
1024 1185 new WPCOM_JSON_API_List_Post_Formats_Endpoint(
1025 1186 array(
@@ -1045,9 +1206,11 @@
1045 1206 )
1046 1207 );
1047 1208
1048 1209 /**
1049 - * List Post Formates endpoint class.
1210 + * List Post Formats endpoint class.
1211 + *
1212 + * @phan-constructor-used-for-side-effects
1050 1213 */
1051 1214 class WPCOM_JSON_API_List_Post_Formats_Endpoint extends WPCOM_JSON_API_Endpoint { // phpcs:ignore
1052 1215 /**
1053 1216 *
@@ -1056,8 +1219,10 @@
1056 1219 * /sites/%s/post-formats -> $blog_id
1057 1220 *
1058 1221 * @param string $path - the path.
1059 1222 * @param int $blog_id - the blog ID.
1223 + *
1224 + * @return array|\WP_Error Array with 'formats' on success, or WP_Error on failure.
1060 1225 */
1061 1226 public function callback( $path = '', $blog_id = 0 ) {
1062 1227 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
1063 1228 if ( is_wp_error( $blog_id ) ) {
@@ -1111,8 +1276,10 @@
1111 1276 );
1112 1277
1113 1278 /**
1114 1279 * List page templates endpoint class.
1280 + *
1281 + * @phan-constructor-used-for-side-effects
1115 1282 */
1116 1283 class WPCOM_JSON_API_List_Page_Templates_Endpoint extends WPCOM_JSON_API_Endpoint { // phpcs:ignore
1117 1284 /**
1118 1285 *
@@ -1120,8 +1287,10 @@
1120 1287 * /sites/%s/page-templates -> $blog_id
1121 1288 *
1122 1289 * @param string $path - the path.
1123 1290 * @param int $blog_id - the blog ID.
1291 + *
1292 + * @return array|\WP_Error Array with 'templates' on success, or WP_Error on failure.
1124 1293 */
1125 1294 public function callback( $path = '', $blog_id = 0 ) {
1126 1295 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
1127 1296 if ( is_wp_error( $blog_id ) ) {