PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.2.4
Jetpack – WP Security, Backup, Speed, & Growth v13.2.4
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 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 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 / json-endpoints / class.wpcom-json-api-get-site-endpoint.php
jetpack / json-endpoints Last commit date
jetpack 2 years ago class.wpcom-json-api-add-widget-endpoint.php 2 years ago class.wpcom-json-api-autosave-post-v1-1-endpoint.php 5 years ago class.wpcom-json-api-bulk-delete-post-endpoint.php 4 years ago class.wpcom-json-api-bulk-restore-post-endpoint.php 4 years ago class.wpcom-json-api-bulk-update-comments-endpoint.php 3 years ago class.wpcom-json-api-comment-endpoint.php 2 years ago class.wpcom-json-api-delete-media-endpoint.php 4 years ago class.wpcom-json-api-delete-media-v1-1-endpoint.php 4 years ago class.wpcom-json-api-edit-media-v1-2-endpoint.php 2 years ago class.wpcom-json-api-get-autosave-v1-1-endpoint.php 5 years ago class.wpcom-json-api-get-comment-counts-endpoint.php 4 years ago class.wpcom-json-api-get-comment-endpoint.php 4 years ago class.wpcom-json-api-get-comment-history-endpoint.php 4 years ago class.wpcom-json-api-get-comments-tree-endpoint.php 4 years ago class.wpcom-json-api-get-comments-tree-v1-1-endpoint.php 4 years ago class.wpcom-json-api-get-comments-tree-v1-2-endpoint.php 4 years ago class.wpcom-json-api-get-customcss.php 2 years ago class.wpcom-json-api-get-media-endpoint.php 4 years ago class.wpcom-json-api-get-media-v1-1-endpoint.php 4 years ago class.wpcom-json-api-get-media-v1-2-endpoint.php 2 years ago class.wpcom-json-api-get-post-counts-v1-1-endpoint.php 4 years ago class.wpcom-json-api-get-post-endpoint.php 2 years ago class.wpcom-json-api-get-post-v1-1-endpoint.php 2 years ago class.wpcom-json-api-get-site-endpoint.php 2 years ago class.wpcom-json-api-get-site-v1-2-endpoint.php 2 years ago class.wpcom-json-api-get-taxonomies-endpoint.php 2 years ago class.wpcom-json-api-get-taxonomy-endpoint.php 4 years ago class.wpcom-json-api-get-term-endpoint.php 4 years ago class.wpcom-json-api-list-comments-endpoint.php 2 years ago class.wpcom-json-api-list-dropdown-pages-endpoint.php 3 years ago class.wpcom-json-api-list-embeds-endpoint.php 4 years ago class.wpcom-json-api-list-media-endpoint.php 2 years ago class.wpcom-json-api-list-media-v1-1-endpoint.php 2 years ago class.wpcom-json-api-list-media-v1-2-endpoint.php 2 years ago class.wpcom-json-api-list-post-type-taxonomies-endpoint.php 4 years ago class.wpcom-json-api-list-post-types-endpoint.php 3 years ago class.wpcom-json-api-list-posts-endpoint.php 3 years ago class.wpcom-json-api-list-posts-v1-1-endpoint.php 3 years ago class.wpcom-json-api-list-posts-v1-2-endpoint.php 3 years ago class.wpcom-json-api-list-roles-endpoint.php 2 years ago class.wpcom-json-api-list-shortcodes-endpoint.php 4 years ago class.wpcom-json-api-list-terms-endpoint.php 2 years ago class.wpcom-json-api-list-users-endpoint.php 2 years ago class.wpcom-json-api-menus-v1-1-endpoint.php 2 years ago class.wpcom-json-api-post-endpoint.php 3 years ago class.wpcom-json-api-post-v1-1-endpoint.php 2 years ago class.wpcom-json-api-render-embed-endpoint.php 2 years ago class.wpcom-json-api-render-embed-reversal-endpoint.php 2 years ago class.wpcom-json-api-render-endpoint.php 3 years ago class.wpcom-json-api-render-shortcode-endpoint.php 3 years ago class.wpcom-json-api-sharing-buttons-endpoint.php 2 years ago class.wpcom-json-api-site-settings-endpoint.php 2 years ago class.wpcom-json-api-site-settings-v1-2-endpoint.php 2 years ago class.wpcom-json-api-site-settings-v1-3-endpoint.php 2 years ago class.wpcom-json-api-site-settings-v1-4-endpoint.php 2 years ago class.wpcom-json-api-site-user-endpoint.php 2 years ago class.wpcom-json-api-taxonomy-endpoint.php 4 years ago class.wpcom-json-api-update-comment-endpoint.php 2 years ago class.wpcom-json-api-update-customcss.php 2 years ago class.wpcom-json-api-update-media-endpoint.php 4 years ago class.wpcom-json-api-update-media-v1-1-endpoint.php 2 years ago class.wpcom-json-api-update-post-endpoint.php 3 years ago class.wpcom-json-api-update-post-v1-1-endpoint.php 3 years ago class.wpcom-json-api-update-post-v1-2-endpoint.php 2 years ago class.wpcom-json-api-update-site-homepage-endpoint.php 4 years ago class.wpcom-json-api-update-site-logo-endpoint.php 2 years ago class.wpcom-json-api-update-taxonomy-endpoint.php 4 years ago class.wpcom-json-api-update-term-endpoint.php 4 years ago class.wpcom-json-api-update-user-endpoint.php 3 years ago class.wpcom-json-api-upload-media-endpoint.php 3 years ago class.wpcom-json-api-upload-media-v1-1-endpoint.php 2 years ago
class.wpcom-json-api-get-site-endpoint.php
1153 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 new WPCOM_JSON_API_GET_Site_Endpoint(
4 array(
5 'description' => 'Get information about a site.',
6 'group' => 'sites',
7 'stat' => 'sites:X',
8 'allowed_if_flagged' => true,
9 'method' => 'GET',
10 'max_version' => '1.1',
11 'new_version' => '1.2',
12 'path' => '/sites/%s',
13 'path_labels' => array(
14 '$site' => '(int|string) Site ID or domain',
15 ),
16 'allow_jetpack_site_auth' => true,
17
18 'allow_fallback_to_jetpack_blog_token' => true,
19
20 'query_parameters' => array(
21 'context' => false,
22 'options' => '(string) Optional. Returns specified options only. Comma-separated list. Example: options=login_url,timezone',
23 ),
24
25 'response_format' => WPCOM_JSON_API_GET_Site_Endpoint::$site_format,
26
27 'example_request' => 'https://public-api.wordpress.com/rest/v1/sites/en.blog.wordpress.com/',
28 )
29 );
30
31 /**
32 * GET Site endpoint class.
33 */
34 class WPCOM_JSON_API_GET_Site_Endpoint extends WPCOM_JSON_API_Endpoint {
35
36 /**
37 * Site meta data.
38 *
39 * @var array $site_format
40 */
41 public static $site_format = array(
42 'ID' => '(int) Site ID',
43 'name' => '(string) Title of site',
44 'description' => '(string) Tagline or description of site',
45 'URL' => '(string) Full URL to the site',
46 'user_can_manage' => '(bool) The current user can manage this site', // deprecated.
47 'capabilities' => '(array) Array of capabilities for the current user on this site.',
48 'jetpack' => '(bool) Whether the site is a Jetpack site or not',
49 'jetpack_connection' => '(bool) Whether the site is connected to WP.com via `jetpack-connection`',
50 'is_multisite' => '(bool) Whether the site is a Multisite site or not. Always true for WP.com sites.',
51 'site_owner' => '(int) User ID of the site owner',
52 'post_count' => '(int) The number of posts the site has',
53 'subscribers_count' => '(int) The number of subscribers the site has',
54 'lang' => '(string) Primary language code of the site',
55 'icon' => '(array) An array of icon formats for the site',
56 'logo' => '(array) The site logo, set in the Customizer',
57 'visible' => '(bool) If this site is visible in the user\'s site list',
58 'is_private' => '(bool) If the site is a private site or not',
59 'is_coming_soon' => '(bool) If the site is marked as "coming soon" or not',
60 'single_user_site' => '(bool) Whether the site is single user. Only returned for WP.com sites and for Jetpack sites with version 3.4 or higher.',
61 'is_vip' => '(bool) If the site is a VIP site or not.',
62 'is_following' => '(bool) If the current user is subscribed to this site in the reader',
63 'organization_id' => '(int) P2 Organization identifier.',
64 'options' => '(array) An array of options/settings for the blog. Only viewable by users with post editing rights to the site. Note: Post formats is deprecated, please see /sites/$id/post-formats/',
65 'p2_thumbnail_elements' => '(array) Details used to render a thumbnail of the site. P2020 themed sites only.',
66 'plan' => '(array) Details of the current plan for this site.',
67 'products' => '(array) Details of the current products for this site.',
68 'zendesk_site_meta' => '(array) Site meta data for Zendesk.',
69 'updates' => '(array) An array of available updates for plugins, themes, wordpress, and languages.',
70 'jetpack_modules' => '(array) A list of active Jetpack modules.',
71 'meta' => '(object) Meta data',
72 'quota' => '(array) An array describing how much space a user has left for uploads',
73 'launch_status' => '(string) A string describing the launch status of a site',
74 'site_migration' => '(array) Data about any migration into the site.',
75 'is_fse_active' => '(bool) If the site has Full Site Editing active or not.',
76 'is_fse_eligible' => '(bool) If the site is capable of Full Site Editing or not',
77 'is_core_site_editor_enabled' => '(bool) If the site has the core site editor enabled.',
78 'is_wpcom_atomic' => '(bool) If the site is a WP.com Atomic one.',
79 'is_wpcom_staging_site' => '(bool) If the site is a WP.com staging site.',
80 'user_interactions' => '(array) An array of user interactions with a site.',
81 'was_ecommerce_trial' => '(bool) If the site ever used an eCommerce trial.',
82 'was_upgraded_from_trial' => '(bool) If the site ever upgraded to a paid plan from a trial.',
83 'was_migration_trial' => '(bool) If the site ever used a migration trial.',
84 'was_hosting_trial' => '(bool) If the site ever used a hosting trial.',
85 'wpcom_site_setup' => '(string) The WP.com site setup identifier.',
86 );
87
88 /**
89 * No member fields.
90 *
91 * @var array $no_member_fields
92 */
93 protected static $no_member_fields = array(
94 'ID',
95 'name',
96 'description',
97 'URL',
98 'jetpack',
99 'jetpack_connection',
100 'post_count',
101 'subscribers_count',
102 'lang',
103 'locale',
104 'icon',
105 'logo',
106 'visible',
107 'is_private',
108 'is_coming_soon',
109 'is_following',
110 'organization_id',
111 'meta',
112 'launch_status',
113 'site_migration',
114 'is_fse_active',
115 'is_fse_eligible',
116 'is_core_site_editor_enabled',
117 'is_wpcom_atomic',
118 'is_wpcom_staging_site',
119 );
120
121 /**
122 * Site options.
123 *
124 * @var array $site_options_format
125 */
126 protected static $site_options_format = array(
127 'timezone',
128 'gmt_offset',
129 'blog_public',
130 'videopress_enabled',
131 'upgraded_filetypes_enabled',
132 'login_url',
133 'admin_url',
134 'is_mapped_domain',
135 'is_redirect',
136 'unmapped_url',
137 'featured_images_enabled',
138 'theme_slug',
139 'header_image',
140 'background_color',
141 'image_default_link_type',
142 'image_thumbnail_width',
143 'image_thumbnail_height',
144 'image_thumbnail_crop',
145 'image_medium_width',
146 'image_medium_height',
147 'image_large_width',
148 'image_large_height',
149 'permalink_structure',
150 'post_formats',
151 'default_post_format',
152 'default_category',
153 'allowed_file_types',
154 'show_on_front',
155 /** This filter is documented in modules/likes.php */
156 'default_likes_enabled',
157 'default_sharing_status',
158 'default_comment_status',
159 'default_ping_status',
160 'software_version',
161 'created_at',
162 'updated_at',
163 'wordads',
164 'publicize_permanently_disabled',
165 'frame_nonce',
166 'jetpack_frame_nonce',
167 'page_on_front',
168 'page_for_posts',
169 'headstart',
170 'headstart_is_fresh',
171 'ak_vp_bundle_enabled',
172 Jetpack_SEO_Utils::FRONT_PAGE_META_OPTION,
173 Jetpack_SEO_Titles::TITLE_FORMATS_OPTION,
174 'verification_services_codes',
175 'podcasting_archive',
176 'is_domain_only',
177 'is_automated_transfer',
178 'is_wpcom_atomic',
179 'is_wpcom_store',
180 'signup_is_store',
181 'has_pending_automated_transfer',
182 'woocommerce_is_active',
183 'editing_toolkit_is_active',
184 'design_type',
185 'site_goals',
186 'site_segment',
187 'site_source_slug',
188 'import_engine',
189 'is_pending_plan',
190 'is_wpforteams_site',
191 'p2_hub_blog_id',
192 'site_creation_flow',
193 'is_cloud_eligible',
194 'selected_features',
195 'anchor_podcast',
196 'was_created_with_blank_canvas_design',
197 'videopress_storage_used',
198 'is_difm_lite_in_progress',
199 'difm_lite_site_options',
200 'site_intent',
201 'site_vertical_id',
202 'blogging_prompts_settings',
203 'launchpad_screen',
204 'launchpad_checklist_tasks_statuses',
205 'wpcom_production_blog_id',
206 'wpcom_staging_blog_ids',
207 'can_blaze',
208 'wpcom_site_setup',
209 'is_commercial',
210 'is_commercial_reasons',
211 'wpcom_admin_interface',
212 'wpcom_classic_early_release',
213 );
214
215 /**
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 * Jetpack response fields.
228 *
229 * @var array $jetpack_response_field_additions
230 */
231 protected static $jetpack_response_field_additions = array(
232 'subscribers_count',
233 'site_migration',
234 'site_owner',
235 'is_wpcom_staging_site',
236 'was_ecommerce_trial',
237 'was_migration_trial',
238 'was_hosting_trial',
239 'was_upgraded_from_trial',
240 );
241
242 /**
243 * Jetpack response field member additions.
244 *
245 * @var array $jetpack_response_field_member_additions
246 */
247 protected static $jetpack_response_field_member_additions = array(
248 'capabilities',
249 'plan',
250 'products',
251 'zendesk_site_meta',
252 );
253
254 /**
255 * Jetpack response option additions.
256 *
257 * @var array $jetpack_response_field_member_additions
258 */
259 protected static $jetpack_response_option_additions = array(
260 'publicize_permanently_disabled',
261 'ak_vp_bundle_enabled',
262 'is_automated_transfer',
263 'is_wpcom_atomic',
264 'is_wpcom_store',
265 'woocommerce_is_active',
266 'editing_toolkit_is_active',
267 'frame_nonce',
268 'jetpack_frame_nonce',
269 'design_type',
270 'wordads',
271 // Use the site registered date from wpcom, since it is only available in a multisite context
272 // and defaults to `0000-00-00T00:00:00+00:00` from the Jetpack site.
273 // See https://github.com/Automattic/jetpack/blob/58638f46094b36f5df9cbc4570006544f0ad300c/sal/class.json-api-site-base.php#L387.
274 'created_at',
275 'updated_at',
276 'is_pending_plan',
277 'is_cloud_eligible',
278 'videopress_storage_used',
279 'blogging_prompts_settings',
280 'wpcom_production_blog_id',
281 'wpcom_staging_blog_ids',
282 'is_commercial',
283 'is_commercial_reasons',
284 'wpcom_admin_interface',
285 'wpcom_classic_early_release',
286 );
287
288 /**
289 * Current enabled trials.
290 *
291 * @var array $jetpack_enabled_trials
292 */
293 public static $jetpack_enabled_trials = array(
294 'was_ecommerce_trial' => 'ecommerce',
295 'was_migration_trial' => 'migration',
296 'was_hosting_trial' => 'hosting',
297 );
298
299 /**
300 * Site
301 *
302 * @var $site.
303 */
304 private $site;
305
306 /**
307 * Fields to include.
308 *
309 * @var $fields_to_include
310 */
311 protected $fields_to_include = '_all';
312
313 /**
314 * Options to include.
315 *
316 * @var $options_to_include
317 */
318 protected $options_to_include = '_all';
319
320 /**
321 *
322 * API callback.
323 *
324 * /sites/mine
325 * /sites/%s -> $blog_id\
326 *
327 * @param string $path - the path.
328 * @param int $blog_id - the blog ID.
329 */
330 public function callback( $path = '', $blog_id = 0 ) {
331 if ( 'mine' === $blog_id ) {
332 $api = WPCOM_JSON_API::init();
333 if ( ! $api->token_details || empty( $api->token_details['blog_id'] ) ) {
334 return new WP_Error( 'authorization_required', 'An active access token must be used to query information about the current blog.', 403 );
335 }
336 $blog_id = $api->token_details['blog_id'];
337 }
338
339 add_filter( 'wpcom_allow_jetpack_blog_token', '__return_true' );
340 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
341 if ( is_wp_error( $blog_id ) ) {
342 return $blog_id;
343 }
344
345 $this->filter_fields_and_options();
346
347 $response = $this->build_current_site_response();
348
349 /** This action is documented in json-endpoints/class.wpcom-json-api-site-settings-endpoint.php */
350 do_action( 'wpcom_json_api_objects', 'sites' );
351
352 return $response;
353 }
354
355 /**
356 * Filter fields and options.
357 */
358 public function filter_fields_and_options() {
359 $query_args = $this->query_args();
360
361 $this->fields_to_include = empty( $query_args['fields'] ) ? '_all' : array_map( 'trim', explode( ',', $query_args['fields'] ) );
362 $this->options_to_include = empty( $query_args['options'] ) ? '_all' : array_map( 'trim', explode( ',', $query_args['options'] ) );
363 }
364
365 /**
366 * Collects the necessary information to return for a site's response.
367 *
368 * @return array
369 */
370 public function build_current_site_response() {
371
372 $blog_id = (int) $this->api->get_blog_id_for_output();
373
374 $this->site = $this->get_platform()->get_site( $blog_id );
375
376 /**
377 * Filter the structure of information about the site to return.
378 *
379 * @module json-api
380 *
381 * @since 3.9.3
382 *
383 * @param array $site_format Data structure.
384 */
385 $default_fields = array_keys( apply_filters( 'sites_site_format', self::$site_format ) );
386
387 $response_keys = is_array( $this->fields_to_include ) ?
388 array_intersect( $default_fields, $this->fields_to_include ) :
389 $default_fields;
390
391 $has_blog_access = $this->has_blog_access( $this->api->token_details );
392 $has_user_access = $this->has_user_access();
393
394 if ( ! $has_user_access && ! $has_blog_access ) {
395 // Public access without user or blog auth, only return `$no_member_fields`.
396 $response_keys = array_intersect( $response_keys, self::$no_member_fields );
397 } elseif ( $has_user_access && ! current_user_can( 'edit_posts' ) ) {
398 // Subscriber level user, don't return site options.
399 $response_keys = array_diff( $response_keys, array( 'options' ) );
400 }
401
402 return $this->render_response_keys( $response_keys );
403 }
404
405 /**
406 * Checks that the current user has access to the current blog.
407 *
408 * @return bool Whether or not the current user can access the current blog.
409 */
410 private function has_user_access() {
411 return is_user_member_of_blog( get_current_user_id(), get_current_blog_id() );
412 }
413
414 /**
415 * Checks if the request has a valid blog token for the current blog.
416 *
417 * @param array $token_details Access token for the api request.
418 * @return bool
419 */
420 private function has_blog_access( $token_details ) {
421 $token_details = (array) $token_details;
422 if ( ! isset( $token_details['access'] ) || ! isset( $token_details['auth'] ) || ! isset( $token_details['blog_id'] ) ) {
423 return false;
424 }
425
426 return 'jetpack' === $token_details['auth'] &&
427 'blog' === $token_details['access'] &&
428 get_current_blog_id() === $token_details['blog_id'];
429 }
430
431 /**
432 * Render response keys.
433 *
434 * @param array $response_keys - the response keys.
435 */
436 private function render_response_keys( &$response_keys ) {
437 $response = array();
438
439 $is_user_logged_in = is_user_logged_in();
440
441 $this->site->before_render();
442
443 foreach ( $response_keys as $key ) {
444 $this->render_response_key( $key, $response, $is_user_logged_in );
445 }
446
447 $this->site->after_render( $response );
448
449 return $response;
450 }
451
452 /**
453 * Render response key.
454 *
455 * @param string $key - the key.
456 * @param array $response - the response.
457 * @param boolean $is_user_logged_in - if the user is logged in.
458 */
459 protected function render_response_key( $key, &$response, $is_user_logged_in ) {
460 do_action( 'pre_render_site_response_key', $key );
461
462 switch ( $key ) {
463 case 'ID':
464 $response[ $key ] = $this->site->blog_id;
465 break;
466 case 'name':
467 $response[ $key ] = $this->site->get_name();
468 break;
469 case 'description':
470 $response[ $key ] = $this->site->get_description();
471 break;
472 case 'URL':
473 $response[ $key ] = $this->site->get_url();
474 break;
475 case 'user_can_manage':
476 $response[ $key ] = $this->site->user_can_manage();
477 // fall through is intentional.
478 case 'is_private':
479 $response[ $key ] = $this->site->is_private();
480 break;
481 case 'is_coming_soon':
482 // This option is stored on wp.com for both simple and atomic sites. @see mu-plugins/private-blog.php.
483 $response[ $key ] = $this->site->is_coming_soon();
484
485 break;
486 case 'launch_status':
487 $response[ $key ] = $this->site->get_launch_status();
488 break;
489 case 'visible':
490 $response[ $key ] = $this->site->is_visible();
491 break;
492 case 'subscribers_count':
493 $response[ $key ] = $this->site->get_subscribers_count();
494 break;
495 case 'post_count':
496 if ( $is_user_logged_in ) {
497 $response[ $key ] = $this->site->get_post_count();
498 }
499 break;
500 case 'icon':
501 $icon = $this->site->get_icon();
502
503 if ( $icon !== null ) {
504 $response[ $key ] = $icon;
505 }
506 break;
507 case 'logo':
508 $response[ $key ] = $this->site->get_logo();
509 break;
510 case 'is_following':
511 $response[ $key ] = $this->site->is_following();
512 break;
513 case 'options':
514 // small optimisation - don't recalculate.
515 $all_options = apply_filters( 'sites_site_options_format', self::$site_options_format );
516
517 $options_response_keys = is_array( $this->options_to_include ) ?
518 array_intersect( $all_options, $this->options_to_include ) :
519 $all_options;
520
521 $options = $this->render_option_keys( $options_response_keys );
522
523 $this->site->after_render_options( $options );
524
525 $response[ $key ] = (object) $options;
526 break;
527 case 'meta':
528 $this->build_meta_response( $response );
529 break;
530 case 'lang':
531 $response[ $key ] = $is_user_logged_in ? $this->site->get_locale() : false;
532 break;
533 case 'locale':
534 $response[ $key ] = $is_user_logged_in ? $this->site->get_locale() : false;
535 break;
536 case 'jetpack':
537 $response[ $key ] = $this->site->is_jetpack();
538 break;
539 case 'jetpack_connection':
540 $response[ $key ] = $this->site->is_jetpack_connection();
541 break;
542 case 'single_user_site':
543 $response[ $key ] = $this->site->is_single_user_site();
544 break;
545 case 'is_vip':
546 $response[ $key ] = $this->site->is_vip();
547 break;
548 case 'is_multisite':
549 $response[ $key ] = $this->site->is_multisite();
550 break;
551 case 'site_owner':
552 $response[ $key ] = $this->site->get_site_owner();
553 break;
554 case 'organization_id':
555 $response[ $key ] = $this->site->get_p2_organization_id();
556 break;
557
558 case 'capabilities':
559 $response[ $key ] = $this->site->get_capabilities();
560 break;
561 case 'jetpack_modules':
562 if ( is_user_member_of_blog() ) {
563 $response[ $key ] = $this->site->get_jetpack_modules();
564 }
565 break;
566 case 'plan':
567 $response[ $key ] = $this->site->get_plan();
568 break;
569 case 'products':
570 $response[ $key ] = $this->site->get_products();
571 break;
572 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 }
578 break;
579 case 'quota':
580 $response[ $key ] = $this->site->get_quota();
581 break;
582 case 'site_migration':
583 $response[ $key ] = $this->site->get_migration_meta();
584 break;
585 case 'is_fse_active':
586 $response[ $key ] = $this->site->is_fse_active();
587 break;
588 case 'is_fse_eligible':
589 $response[ $key ] = $this->site->is_fse_eligible();
590 break;
591 case 'is_core_site_editor_enabled':
592 $response[ $key ] = $this->site->is_core_site_editor_enabled();
593 break;
594 case 'is_wpcom_atomic':
595 $response[ $key ] = $this->site->is_wpcom_atomic();
596 break;
597 case 'is_wpcom_staging_site':
598 $response[ $key ] = $this->site->is_wpcom_staging_site();
599 break;
600 case 'user_interactions':
601 $response[ $key ] = $this->site->get_user_interactions();
602 break;
603 case 'p2_thumbnail_elements':
604 $response[ $key ] = $this->site->get_p2_thumbnail_elements();
605 break;
606 case 'was_ecommerce_trial':
607 $response[ $key ] = $this->site->was_trial( self::$jetpack_enabled_trials['was_ecommerce_trial'] );
608 break;
609 case 'was_migration_trial':
610 $response[ $key ] = $this->site->was_trial( self::$jetpack_enabled_trials['was_migration_trial'] );
611 break;
612 case 'was_hosting_trial':
613 $response[ $key ] = $this->site->was_trial( self::$jetpack_enabled_trials['was_hosting_trial'] );
614 break;
615 case 'was_upgraded_from_trial':
616 $response[ $key ] = $this->site->was_upgraded_from_trial();
617 break;
618 }
619
620 do_action( 'post_render_site_response_key', $key );
621 }
622
623 /**
624 * Render option keys.
625 *
626 * @param array $options_response_keys - the response keys.
627 */
628 protected function render_option_keys( &$options_response_keys ) {
629 $options = array();
630 $site = $this->site;
631
632 $custom_front_page = $site->is_custom_front_page();
633
634 foreach ( $options_response_keys as $key ) {
635 switch ( $key ) {
636 case 'timezone':
637 $options[ $key ] = $site->get_timezone();
638 break;
639 case 'gmt_offset':
640 $options[ $key ] = $site->get_gmt_offset();
641 break;
642 case 'videopress_enabled':
643 $options[ $key ] = $site->has_videopress();
644 break;
645 case 'upgraded_filetypes_enabled':
646 $options[ $key ] = $site->upgraded_filetypes_enabled();
647 break;
648 case 'login_url':
649 $options[ $key ] = $site->get_login_url();
650 break;
651 case 'admin_url':
652 $options[ $key ] = $site->get_admin_url();
653 break;
654 case 'is_mapped_domain':
655 $options[ $key ] = $site->is_mapped_domain();
656 break;
657 case 'is_redirect':
658 $options[ $key ] = $site->is_redirect();
659 break;
660 case 'unmapped_url':
661 $options[ $key ] = $site->get_unmapped_url();
662 break;
663 case 'featured_images_enabled':
664 $options[ $key ] = $site->featured_images_enabled();
665 break;
666 case 'theme_slug':
667 $options[ $key ] = $site->get_theme_slug();
668 break;
669 case 'header_image':
670 $options[ $key ] = $site->get_header_image();
671 break;
672 case 'background_color':
673 $options[ $key ] = $site->get_background_color();
674 break;
675 case 'image_default_link_type':
676 $options[ $key ] = $site->get_image_default_link_type();
677 break;
678 case 'image_thumbnail_width':
679 $options[ $key ] = $site->get_image_thumbnail_width();
680 break;
681 case 'image_thumbnail_height':
682 $options[ $key ] = $site->get_image_thumbnail_height();
683 break;
684 case 'image_thumbnail_crop':
685 $options[ $key ] = $site->get_image_thumbnail_crop();
686 break;
687 case 'image_medium_width':
688 $options[ $key ] = $site->get_image_medium_width();
689 break;
690 case 'image_medium_height':
691 $options[ $key ] = $site->get_image_medium_height();
692 break;
693 case 'image_large_width':
694 $options[ $key ] = $site->get_image_large_width();
695 break;
696 case 'image_large_height':
697 $options[ $key ] = $site->get_image_large_height();
698 break;
699 case 'permalink_structure':
700 $options[ $key ] = $site->get_permalink_structure();
701 break;
702 case 'post_formats':
703 $options[ $key ] = $site->get_post_formats();
704 break;
705 case 'default_post_format':
706 $options[ $key ] = $site->get_default_post_format();
707 break;
708 case 'default_category':
709 $options[ $key ] = $site->get_default_category();
710 break;
711 case 'allowed_file_types':
712 $options[ $key ] = $site->allowed_file_types();
713 break;
714 case 'show_on_front':
715 $options[ $key ] = $site->get_show_on_front();
716 break;
717 /** This filter is documented in modules/likes.php */
718 case 'default_likes_enabled':
719 $options[ $key ] = $site->get_default_likes_enabled();
720 break;
721 case 'default_sharing_status':
722 $options[ $key ] = $site->get_default_sharing_status();
723 break;
724 case 'default_comment_status':
725 $options[ $key ] = $site->get_default_comment_status();
726 break;
727 case 'default_ping_status':
728 $options[ $key ] = $site->default_ping_status();
729 break;
730 case 'software_version':
731 $options[ $key ] = $site->get_wordpress_version();
732 break;
733 case 'created_at':
734 $options[ $key ] = $site->get_registered_date();
735 break;
736 case 'updated_at':
737 $options[ $key ] = $site->get_last_update_date();
738 break;
739 case 'wordads':
740 $options[ $key ] = $site->has_wordads();
741 break;
742 case 'publicize_permanently_disabled':
743 $options[ $key ] = $site->is_publicize_permanently_disabled();
744 break;
745 case 'frame_nonce':
746 $options[ $key ] = $site->get_frame_nonce();
747 break;
748 case 'jetpack_frame_nonce':
749 $options[ $key ] = $site->get_jetpack_frame_nonce();
750 break;
751 case 'page_on_front':
752 if ( $custom_front_page ) {
753 $options[ $key ] = $site->get_page_on_front();
754 }
755 break;
756 case 'page_for_posts':
757 if ( $custom_front_page ) {
758 $options[ $key ] = $site->get_page_for_posts();
759 }
760 break;
761 case 'headstart':
762 $options[ $key ] = $site->is_headstart();
763 break;
764 case 'headstart_is_fresh':
765 $options[ $key ] = $site->is_headstart_fresh();
766 break;
767 case 'ak_vp_bundle_enabled':
768 $options[ $key ] = $site->get_ak_vp_bundle_enabled();
769 break;
770 case Jetpack_SEO_Utils::FRONT_PAGE_META_OPTION:
771 $options[ $key ] = $site->get_jetpack_seo_front_page_description();
772 break;
773 case Jetpack_SEO_Titles::TITLE_FORMATS_OPTION:
774 $options[ $key ] = $site->get_jetpack_seo_title_formats();
775 break;
776 case 'verification_services_codes':
777 $options[ $key ] = $site->get_verification_services_codes();
778 break;
779 case 'podcasting_archive':
780 $options[ $key ] = $site->get_podcasting_archive();
781 break;
782 case 'is_domain_only':
783 $options[ $key ] = $site->is_domain_only();
784 break;
785 case 'is_automated_transfer':
786 $options[ $key ] = $site->is_automated_transfer();
787 break;
788 case 'blog_public':
789 $options[ $key ] = $site->get_blog_public();
790 break;
791 case 'is_wpcom_atomic':
792 $options[ $key ] = $site->is_wpcom_atomic();
793 break;
794 case 'is_wpcom_store':
795 $options[ $key ] = $site->is_wpcom_store();
796 break;
797 case 'signup_is_store':
798 $signup_is_store = $site->signup_is_store();
799
800 if ( $signup_is_store ) {
801 $options[ $key ] = $site->signup_is_store();
802 }
803
804 break;
805 case 'has_pending_automated_transfer':
806 $has_pending_automated_transfer = $site->has_pending_automated_transfer();
807
808 if ( $has_pending_automated_transfer ) {
809 $options[ $key ] = true;
810 }
811
812 break;
813 case 'woocommerce_is_active':
814 $options[ $key ] = $site->woocommerce_is_active();
815 break;
816 case 'editing_toolkit_is_active':
817 $options[ $key ] = $site->editing_toolkit_is_active();
818 break;
819 case 'design_type':
820 $options[ $key ] = $site->get_design_type();
821 break;
822 case 'site_segment':
823 $options[ $key ] = $site->get_site_segment();
824 break;
825 case 'import_engine':
826 $options[ $key ] = $site->get_import_engine();
827 break;
828 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 }
834 break;
835
836 case 'is_wpforteams_site':
837 $options[ $key ] = $site->is_wpforteams_site();
838 break;
839 case 'p2_hub_blog_id':
840 $options[ $key ] = $site->get_p2_hub_blog_id();
841 break;
842
843 case 'site_creation_flow':
844 $site_creation_flow = $site->get_site_creation_flow();
845 if ( $site_creation_flow ) {
846 $options[ $key ] = $site_creation_flow;
847 }
848 break;
849 case 'site_source_slug':
850 $site_source_slug = $site->get_site_source_slug();
851 if ( $site_source_slug ) {
852 $options[ $key ] = $site_source_slug;
853 }
854 break;
855 case 'is_cloud_eligible':
856 $options[ $key ] = $site->is_cloud_eligible();
857 break;
858 case 'selected_features':
859 $selected_features = $site->get_selected_features();
860 if ( $selected_features ) {
861 $options[ $key ] = $selected_features;
862 }
863 break;
864 case 'anchor_podcast':
865 $options[ $key ] = $site->get_anchor_podcast();
866 break;
867 case 'was_created_with_blank_canvas_design':
868 $options[ $key ] = $site->was_created_with_blank_canvas_design();
869 break;
870 case 'videopress_storage_used':
871 $options[ $key ] = $this->site->get_videopress_storage_used();
872 break;
873 case 'is_difm_lite_in_progress':
874 $options[ $key ] = $site->is_difm_lite_in_progress();
875 break;
876 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 );
888 }
889 $options[ $key ] = $filtered_difm_lite_options;
890 break;
891 case 'site_intent':
892 $options[ $key ] = $site->get_site_intent();
893 break;
894 case 'site_vertical_id':
895 $options[ $key ] = $site->get_site_vertical_id();
896 break;
897 case 'blogging_prompts_settings':
898 if ( current_user_can( 'edit_posts' ) ) {
899 $options[ $key ] = $site->get_blogging_prompts_settings( get_current_user_id(), $site->blog_id );
900 }
901 break;
902 case 'launchpad_screen':
903 $options[ $key ] = $site->get_launchpad_screen();
904 break;
905 case 'launchpad_checklist_tasks_statuses':
906 $options[ $key ] = $site->get_launchpad_checklist_tasks_statuses();
907 break;
908 case 'wpcom_production_blog_id':
909 $options[ $key ] = $site->get_wpcom_production_blog_id();
910 break;
911 case 'wpcom_staging_blog_ids':
912 $options[ $key ] = $site->get_wpcom_staging_blog_ids();
913 break;
914 case 'can_blaze':
915 $options[ $key ] = $site->can_blaze();
916 break;
917 case 'wpcom_site_setup':
918 $options[ $key ] = $site->get_wpcom_site_setup();
919 break;
920 case 'is_commercial':
921 $options[ $key ] = $site->is_commercial();
922 break;
923 case 'is_commercial_reasons':
924 $options[ $key ] = $site->get_is_commercial_reasons();
925 break;
926 case 'wpcom_admin_interface':
927 $options[ $key ] = $site->get_wpcom_admin_interface();
928 break;
929 case 'wpcom_classic_early_release':
930 $options[ $key ] = $site->get_wpcom_classic_early_release();
931 break;
932 }
933 }
934
935 return $options;
936 }
937
938 /**
939 * Build meta response.
940 *
941 * @param array $response - the response.
942 */
943 protected function build_meta_response( &$response ) {
944 $links = array(
945 'self' => (string) $this->links->get_site_link( $this->site->blog_id ),
946 'help' => (string) $this->links->get_site_link( $this->site->blog_id, 'help' ),
947 'posts' => (string) $this->links->get_site_link( $this->site->blog_id, 'posts/' ),
948 'comments' => (string) $this->links->get_site_link( $this->site->blog_id, 'comments/' ),
949 'xmlrpc' => (string) $this->site->get_xmlrpc_url(),
950 );
951
952 $icon = $this->site->get_icon();
953 if ( ! empty( $icon ) && ! empty( $icon['media_id'] ) ) {
954 $links['site_icon'] = (string) $this->links->get_site_link( $this->site->blog_id, 'media/' . $icon['media_id'] );
955 }
956
957 $response['meta'] = (object) array(
958 'links' => (object) $links,
959 );
960 }
961
962 /**
963 * Apply any WPCOM-only response components to a Jetpack site response.
964 *
965 * @param array $response - the response.
966 */
967 public function decorate_jetpack_response( &$response ) {
968 $this->site = $this->get_platform()->get_site( $response->ID );
969 switch_to_blog( $this->site->get_id() );
970
971 $wpcom_response = $this->render_response_keys( self::$jetpack_response_field_additions );
972
973 foreach ( $wpcom_response as $key => $value ) {
974 $response->{ $key } = $value;
975 }
976
977 if ( $this->has_user_access() || $this->has_blog_access( $this->api->token_details ) ) {
978 $wpcom_member_response = $this->render_response_keys( self::$jetpack_response_field_member_additions );
979
980 foreach ( $wpcom_member_response as $key => $value ) {
981 $response->{ $key } = $value;
982 }
983 } else {
984 // ensure private data is not rendered for non members of the site.
985 unset( $response->options );
986 unset( $response->is_vip );
987 unset( $response->single_user_site );
988 unset( $response->is_private );
989 unset( $response->is_coming_soon );
990 unset( $response->capabilities );
991 unset( $response->lang );
992 unset( $response->user_can_manage );
993 unset( $response->is_multisite );
994 unset( $response->site_owner );
995 unset( $response->plan );
996 unset( $response->products );
997 unset( $response->zendesk_site_meta );
998 }
999
1000 // render additional options.
1001 if ( isset( $response->options ) && $response->options ) {
1002 $wpcom_options_response = $this->render_option_keys( self::$jetpack_response_option_additions );
1003
1004 // Remove heic from jetpack (and atomic) sites so that the iOS app know to convert the file format into a JPEG.
1005 // heic fromat is currently not supported by for uploading.
1006 // 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'] ) ) {
1008 $remove_file_types = array(
1009 'heic',
1010 );
1011 $response->options['allowed_file_types'] = array_values( array_diff( $response->options['allowed_file_types'], $remove_file_types ) );
1012 }
1013
1014 foreach ( $wpcom_options_response as $key => $value ) {
1015 $response->options[ $key ] = $value;
1016 }
1017 }
1018
1019 restore_current_blog();
1020 return $response; // possibly no need since it's modified in place.
1021 }
1022 }
1023
1024 new WPCOM_JSON_API_List_Post_Formats_Endpoint(
1025 array(
1026 'description' => 'Get a list of post formats supported by a site.',
1027 'group' => '__do_not_document',
1028 'stat' => 'sites:X:post-formats',
1029
1030 'method' => 'GET',
1031 'path' => '/sites/%s/post-formats',
1032 'path_labels' => array(
1033 '$site' => '(int|string) Site ID or domain',
1034 ),
1035
1036 'query_parameters' => array(
1037 'context' => false,
1038 ),
1039
1040 'allow_fallback_to_jetpack_blog_token' => true,
1041
1042 'response_format' => array(
1043 'formats' => '(object) An object of supported post formats, each key a supported format slug mapped to its display string.',
1044 ),
1045 )
1046 );
1047
1048 /**
1049 * List Post Formates endpoint class.
1050 */
1051 class WPCOM_JSON_API_List_Post_Formats_Endpoint extends WPCOM_JSON_API_Endpoint { // phpcs:ignore
1052 /**
1053 *
1054 * API callback.
1055 *
1056 * /sites/%s/post-formats -> $blog_id
1057 *
1058 * @param string $path - the path.
1059 * @param int $blog_id - the blog ID.
1060 */
1061 public function callback( $path = '', $blog_id = 0 ) {
1062 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
1063 if ( is_wp_error( $blog_id ) ) {
1064 return $blog_id;
1065 }
1066
1067 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
1068 $this->load_theme_functions();
1069 }
1070
1071 // Get a list of supported post formats.
1072 $all_formats = get_post_format_strings();
1073 $supported = get_theme_support( 'post-formats' );
1074
1075 $response = array(
1076 'formats' => array(),
1077 );
1078 $supported_formats = $response['formats'];
1079
1080 if ( isset( $supported[0] ) ) {
1081 foreach ( $supported[0] as $format ) {
1082 $supported_formats[ $format ] = $all_formats[ $format ];
1083 }
1084 }
1085
1086 $response['formats'] = (object) $supported_formats;
1087
1088 return $response;
1089 }
1090 }
1091
1092 new WPCOM_JSON_API_List_Page_Templates_Endpoint(
1093 array(
1094 'description' => 'Get a list of page templates supported by a site.',
1095 'group' => 'sites',
1096 'stat' => 'sites:X:post-templates',
1097
1098 'method' => 'GET',
1099 'path' => '/sites/%s/page-templates',
1100 'path_labels' => array(
1101 '$site' => '(int|string) Site ID or domain',
1102 ),
1103 'query_parameters' => array(
1104 'context' => false,
1105 ),
1106 'response_format' => array(
1107 'templates' => '(array) A list of supported page templates. Contains label and file.',
1108 ),
1109 'example_request' => 'https://public-api.wordpress.com/rest/v1.1/sites/33534099/page-templates',
1110 )
1111 );
1112
1113 /**
1114 * List page templates endpoint class.
1115 */
1116 class WPCOM_JSON_API_List_Page_Templates_Endpoint extends WPCOM_JSON_API_Endpoint { // phpcs:ignore
1117 /**
1118 *
1119 * API callback.
1120 * /sites/%s/page-templates -> $blog_id
1121 *
1122 * @param string $path - the path.
1123 * @param int $blog_id - the blog ID.
1124 */
1125 public function callback( $path = '', $blog_id = 0 ) {
1126 $blog_id = $this->api->switch_to_blog_and_validate_user( $this->api->get_blog_id( $blog_id ) );
1127 if ( is_wp_error( $blog_id ) ) {
1128 return $blog_id;
1129 }
1130
1131 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
1132 $this->load_theme_functions();
1133 }
1134
1135 $response = array();
1136 $page_templates = array();
1137
1138 $templates = get_page_templates();
1139 ksort( $templates );
1140
1141 foreach ( array_keys( $templates ) as $label ) {
1142 $page_templates[] = array(
1143 'label' => $label,
1144 'file' => $templates[ $label ],
1145 );
1146 }
1147
1148 $response['templates'] = $page_templates;
1149
1150 return $response;
1151 }
1152 }
1153