PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
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 / _inc / lib / core-api / class.jetpack-core-api-site-endpoints.php
jetpack / _inc / lib / core-api Last commit date
wpcom-endpoints 3 days ago class-wpcom-rest-field-controller.php 1 month ago class.jetpack-core-api-module-endpoints.php 2 weeks ago class.jetpack-core-api-site-endpoints.php 2 months ago class.jetpack-core-api-widgets-endpoints.php 4 years ago class.jetpack-core-api-xmlrpc-consumer-endpoint.php 4 years ago load-wpcom-endpoints.php 7 months ago
class.jetpack-core-api-site-endpoints.php
304 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * List of /site core REST API endpoints used in Jetpack's dashboard.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Connection\Client;
9 use Automattic\Jetpack\Publicize\Publicize;
10 use Automattic\Jetpack\Stats\WPCOM_Stats;
11
12 /**
13 * This is the endpoint class for `/site` endpoints.
14 */
15 class Jetpack_Core_API_Site_Endpoint {
16 /**
17 * Returns commonly used WP_Error indicating failure to fetch data
18 *
19 * @return WP_Error that denotes our inability to fetch the requested data
20 */
21 private static function get_failed_fetch_error() {
22 return new WP_Error(
23 'failed_to_fetch_data',
24 esc_html__( 'Unable to fetch the requested data.', 'jetpack' ),
25 array( 'status' => 500 )
26 );
27 }
28
29 /**
30 * Returns the result of `/sites/%s/features` endpoint call.
31 *
32 * @return object $features has 'active' and 'available' properties each of which contain feature slugs.
33 * 'active' is a simple array of slugs that are active on the current plan.
34 * 'available' is an object with keys that represent feature slugs and values are arrays
35 * of plan slugs that enable these features
36 */
37 public static function get_features() {
38 // Make the API request.
39 $request = sprintf( '/sites/%d/features', Jetpack_Options::get_option( 'id' ) );
40 $response = Client::wpcom_json_api_request_as_blog( $request, '1.1' );
41
42 // Bail if there was an error or malformed response.
43 if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
44 return self::get_failed_fetch_error();
45 }
46
47 // Decode the results.
48 $results = json_decode( $response['body'], true );
49
50 // Bail if there were no results or plan details returned.
51 if ( ! is_array( $results ) ) {
52 return self::get_failed_fetch_error();
53 }
54
55 return rest_ensure_response(
56 array(
57 'code' => 'success',
58 'message' => esc_html__( 'Site features correctly received.', 'jetpack' ),
59 'data' => wp_remote_retrieve_body( $response ),
60 )
61 );
62 }
63
64 /**
65 * Returns the result of `/upgrades` endpoint call.
66 *
67 * @return array of site purchases.
68 */
69 public static function get_purchases() {
70 // Make the API request.
71 $request = sprintf( '/upgrades?site=%d', Jetpack_Options::get_option( 'id' ) );
72 $response = Client::wpcom_json_api_request_as_blog( $request, '1.2' );
73
74 // Bail if there was an error or malformed response.
75 if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
76 return self::get_failed_fetch_error();
77 }
78
79 if ( 200 !== (int) wp_remote_retrieve_response_code( $response ) ) {
80 return self::get_failed_fetch_error();
81 }
82
83 // Decode the results.
84 $results = json_decode( $response['body'], true );
85
86 // Bail if there were no results or purchase details returned.
87 if ( ! is_array( $results ) ) {
88 return self::get_failed_fetch_error();
89 }
90
91 return rest_ensure_response(
92 array(
93 'code' => 'success',
94 'message' => esc_html__( 'Site purchases correctly received.', 'jetpack' ),
95 'data' => wp_remote_retrieve_body( $response ),
96 )
97 );
98 }
99
100 /**
101 * Returns the result of `/sites/%d/products` endpoint call.
102 *
103 * @return array of site products.
104 */
105 public static function get_products() {
106 $url = sprintf( '/sites/%d/products?locale=%s&type=jetpack', Jetpack_Options::get_option( 'id' ), get_user_locale() );
107 $response = Client::wpcom_json_api_request_as_blog( $url, '1.1' );
108
109 if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
110 return self::get_failed_fetch_error();
111 }
112
113 $results = json_decode( wp_remote_retrieve_body( $response ), true );
114 if ( ! is_array( $results ) ) {
115 return self::get_failed_fetch_error();
116 }
117
118 return rest_ensure_response(
119 array(
120 'code' => 'success',
121 'message' => esc_html__( 'Site products correctly received.', 'jetpack' ),
122 'data' => $results,
123 )
124 );
125 }
126
127 /**
128 * Check that the current user has permissions to request information about this site.
129 *
130 * @since 5.1.0
131 *
132 * @return bool
133 */
134 public static function can_request() {
135 return current_user_can( 'jetpack_manage_modules' );
136 }
137
138 /**
139 * Gets an array of data that show how Jetpack is currently being used to benefit the site.
140 *
141 * @since 7.7
142 *
143 * @return WP_REST_Response
144 */
145 public static function get_benefits() {
146 $benefits = array();
147
148 /*
149 * We get different benefits from Stats:
150 * - this year's visitors
151 * - Followers (only if subs module is active)
152 * - Sharing counts (not currently supported in Jetpack -- https://github.com/Automattic/jetpack/issues/844 )
153 */
154 $wpcom_stats = new WPCOM_Stats();
155 $stats = $wpcom_stats->convert_stats_array_to_object(
156 $wpcom_stats->get_stats( array( 'fields' => 'stats' ) )
157 );
158 $has_stats = null !== $stats && ! is_wp_error( $stats );
159
160 // Yearly visitors.
161 if ( $has_stats && $stats->stats->visitors > 0 ) {
162 $benefits[] = array(
163 'name' => 'jetpack-stats',
164 'title' => esc_html__( 'Jetpack Stats', 'jetpack' ),
165 'description' => esc_html__( 'Visitors tracked by Jetpack', 'jetpack' ),
166 'value' => absint( $stats->stats->visitors ),
167 );
168 }
169
170 // Protect blocked logins.
171 if ( Jetpack::is_module_active( 'protect' ) ) {
172 $protect = get_site_option( 'jetpack_protect_blocked_attempts' );
173 if ( $protect > 0 ) {
174 $benefits[] = array(
175 'name' => 'protect',
176 'title' => esc_html__( 'Brute force protection', 'jetpack' ),
177 'description' => esc_html__( 'The number of malicious login attempts blocked by Jetpack', 'jetpack' ),
178 'value' => absint( $protect ),
179 );
180 }
181 }
182
183 // Number of followers.
184 if ( $has_stats && $stats->stats->followers_blog > 0 && Jetpack::is_module_active( 'subscriptions' ) ) {
185 $benefits[] = array(
186 'name' => 'subscribers',
187 'title' => esc_html__( 'Subscribers', 'jetpack' ),
188 'description' => esc_html__( 'People subscribed to your updates through Jetpack', 'jetpack' ),
189 'value' => absint( $stats->stats->followers_blog ),
190 );
191 }
192
193 // VaultPress backups.
194 if ( Jetpack::is_plugin_active( 'vaultpress/vaultpress.php' ) && class_exists( 'VaultPress' ) ) {
195 $vaultpress = new VaultPress();
196 if ( $vaultpress->is_registered() ) {
197 $data = json_decode( base64_decode( $vaultpress->contact_service( 'plugin_data' ) ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
198 if ( $data && $data->features->backups && ! empty( $data->backups->stats ) && $data->backups->stats->revisions > 0 ) {
199 $benefits[] = array(
200 'name' => 'jetpack-backup',
201 'title' => esc_html__( 'Jetpack Backup', 'jetpack' ),
202 'description' => esc_html__( 'The number of times Jetpack has backed up your site and kept it safe', 'jetpack' ),
203 'value' => absint( $data->backups->stats->revisions ),
204 );
205 }
206 }
207 }
208
209 // Number of forms sent via a Jetpack contact form.
210 if ( Jetpack::is_module_active( 'contact-form' ) ) {
211 $contact_form_count = array_sum( get_object_vars( wp_count_posts( 'feedback' ) ) );
212 if ( $contact_form_count > 0 ) {
213 $benefits[] = array(
214 'name' => 'contact-form-feedback',
215 'title' => esc_html__( 'Contact Form Feedback', 'jetpack' ),
216 'description' => esc_html__( 'Form submissions stored by Jetpack', 'jetpack' ),
217 'value' => absint( $contact_form_count ),
218 );
219 }
220 }
221
222 // Number of images in the library if Photon is active.
223 if ( Jetpack::is_module_active( 'photon' ) ) {
224 $photon_count = array_reduce(
225 get_object_vars( wp_count_attachments( array( 'image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/webp' ) ) ),
226 function ( $i, $j ) {
227 return $i + $j;
228 }
229 );
230 if ( $photon_count > 0 ) {
231 $benefits[] = array(
232 'name' => 'image-hosting',
233 'title' => esc_html__( 'Image Hosting', 'jetpack' ),
234 'description' => esc_html__( 'Super-fast, mobile-ready images served by Jetpack', 'jetpack' ),
235 'value' => absint( $photon_count ),
236 );
237 }
238 }
239
240 // Number of VideoPress videos on the site.
241 if ( Jetpack::is_module_active( 'videopress' ) ) {
242 $videopress_attachments = wp_count_attachments( 'video/videopress' );
243 if (
244 isset( $videopress_attachments->{'video/videopress'} )
245 && $videopress_attachments->{'video/videopress'} > 0
246 ) {
247 $benefits[] = array(
248 'name' => 'video-hosting',
249 'title' => esc_html__( 'Video Hosting', 'jetpack' ),
250 'description' => esc_html__( 'Ad-free, lightning-fast videos delivered by Jetpack', 'jetpack' ),
251 'value' => absint( $videopress_attachments->{'video/videopress'} ),
252 );
253 }
254 }
255
256 // Number of active Publicize connections.
257 if ( Jetpack::is_module_active( 'publicize' ) && class_exists( Publicize::class ) ) {
258 $publicize = new Publicize();
259 $connections = $publicize->get_all_connections();
260
261 $number_of_connections = 0;
262 if ( is_array( $connections ) && ! empty( $connections ) ) {
263 $number_of_connections = count( $connections );
264 }
265
266 if ( $number_of_connections > 0 ) {
267 $benefits[] = array(
268 'name' => 'publicize',
269 'title' => esc_html__( 'Jetpack Social', 'jetpack' ),
270 'description' => esc_html__( 'Live social media site connections, powered by Jetpack', 'jetpack' ),
271 'value' => absint( $number_of_connections ),
272 );
273 }
274 }
275
276 // Total number of shares.
277 if ( $has_stats && $stats->stats->shares > 0 ) {
278 $benefits[] = array(
279 'name' => 'sharing',
280 'title' => esc_html__( 'Sharing', 'jetpack' ),
281 'description' => esc_html__( 'The number of times visitors have shared your posts with the world using Jetpack', 'jetpack' ),
282 'value' => absint( $stats->stats->shares ),
283 );
284 }
285
286 if ( Jetpack::is_module_active( 'search' ) && ! class_exists( 'Automattic\\Jetpack\\Search_Plugin\\Jetpack_Search_Plugin' ) ) {
287 $benefits[] = array(
288 'name' => 'search',
289 'title' => esc_html__( 'Search', 'jetpack' ),
290 'description' => esc_html__( 'Help your visitors find exactly what they are looking for, fast', 'jetpack' ),
291 );
292 }
293
294 // Finally, return the whole list of benefits.
295 return rest_ensure_response(
296 array(
297 'code' => 'success',
298 'message' => esc_html__( 'Site benefits correctly received.', 'jetpack' ),
299 'data' => wp_json_encode( $benefits, JSON_UNESCAPED_SLASHES ),
300 )
301 );
302 }
303 }
304