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