PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.9.5
Jetpack – WP Security, Backup, Speed, & Growth v12.9.5
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 / jetpack_vendor / automattic / jetpack-stats / src / class-wpcom-stats.php
jetpack / jetpack_vendor / automattic / jetpack-stats / src Last commit date
class-main.php 3 years ago class-options.php 3 years ago class-tracking-pixel.php 3 years ago class-wpcom-stats.php 2 years ago class-xmlrpc-provider.php 3 years ago
class-wpcom-stats.php
419 lines
1 <?php
2 /**
3 * Stats WPCOM_Stats
4 *
5 * @package automattic/jetpack-stats
6 */
7
8 namespace Automattic\Jetpack\Stats;
9
10 use Automattic\Jetpack\Connection\Client;
11 use Jetpack_Options;
12 use WP_Error;
13
14 /**
15 * Stats WPCOM_Stats class.
16 *
17 * Responsible for fetching Stats related data from WPCOM.
18 *
19 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/
20 *
21 * @since 0.1.0
22 */
23 class WPCOM_Stats {
24 /**
25 * Transient prefix for storing Stats results from the REST API.
26 *
27 * @var string
28 */
29 const STATS_CACHE_TRANSIENT_PREFIX = 'jetpack_restapi_stats_cache_';
30
31 /**
32 * Time, in minutes, to cache stats results from the REST API.
33 *
34 * @var int
35 */
36 const STATS_CACHE_EXPIRATION_IN_MINUTES = 5;
37
38 /**
39 * Stats REST API version.
40 *
41 * @var string
42 */
43 const STATS_REST_API_VERSION = '1.1';
44
45 /**
46 * The stats resource to fetch results for.
47 *
48 * @var string
49 */
50 protected $resource;
51
52 /**
53 * Get site's stats.
54 *
55 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/
56 * @param array $args Optional query parameters.
57 * @return array| WP_Error
58 */
59 public function get_stats( $args = array() ) {
60 $this->resource = '';
61
62 return $this->fetch_stats( $args );
63 }
64
65 /**
66 * Get site's summarized views, visitors, likes and comments.
67 *
68 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/summary/
69 * @param array $args Optional query parameters.
70 * @return array|WP_Error
71 */
72 public function get_stats_summary( $args = array() ) {
73 $this->resource = 'summary';
74
75 return $this->fetch_stats( $args );
76 }
77
78 /**
79 * Get site's top posts and pages by views.
80 *
81 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/top-posts/
82 * @param array $args Optional query parameters.
83 * @return array|WP_Error
84 */
85 public function get_top_posts( $args = array() ) {
86 $this->resource = 'top-posts';
87
88 return $this->fetch_stats( $args );
89 }
90
91 /**
92 * Get the details of a single video.
93 *
94 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/video/%24post_id/
95 * @param int $post_id The video's ID.
96 * @param array $args Optional query parameters.
97 * @return array|WP_Error
98 */
99 public function get_video_details( $post_id, $args = array() ) {
100 $this->resource = sprintf( 'video/%d', $post_id );
101
102 return $this->fetch_stats( $args );
103 }
104
105 /**
106 * Get site's referrers.
107 *
108 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/referrers/
109 * @param array $args Optional query parameters.
110 * @return array|WP_Error
111 */
112 public function get_referrers( $args = array() ) {
113 $this->resource = 'referrers';
114
115 return $this->fetch_stats( $args );
116 }
117
118 /**
119 * Get site's outbound clicks.
120 *
121 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/clicks/
122 * @param array $args Optional query parameters.
123 * @return array|WP_Error
124 */
125 public function get_clicks( $args = array() ) {
126 $this->resource = 'clicks';
127
128 return $this->fetch_stats( $args );
129 }
130
131 /**
132 * Get site's views by tags and categories.
133 *
134 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/tags/
135 * @param array $args Optional query parameters.
136 * @return array|WP_Error
137 */
138 public function get_tags( $args = array() ) {
139 $this->resource = 'tags';
140
141 return $this->fetch_stats( $args );
142 }
143
144 /**
145 * Get site's top authors.
146 *
147 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/top-authors/
148 * @param array $args Optional query parameters.
149 * @return array|WP_Error
150 */
151 public function get_top_authors( $args = array() ) {
152 $this->resource = 'top-authors';
153
154 return $this->fetch_stats( $args );
155 }
156
157 /**
158 * Get site's top comment authors and most-commented posts.
159 *
160 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/comments/
161 * @param array $args Optional query parameters.
162 * @return array|WP_Error
163 */
164 public function get_top_comments( $args = array() ) {
165 $this->resource = 'comments';
166
167 return $this->fetch_stats( $args );
168 }
169
170 /**
171 * Get site's video plays.
172 *
173 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/video-plays/
174 * @param array $args Optional query parameters.
175 * @return array|WP_Error
176 */
177 public function get_video_plays( $args = array() ) {
178 $this->resource = 'video-plays';
179
180 return $this->fetch_stats( $args );
181 }
182
183 /**
184 * Get site's file downloads.
185 *
186 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/file-downloads/
187 * @param array $args Optional query parameters.
188 * @return array|WP_Error
189 */
190 public function get_file_downloads( $args = array() ) {
191 $this->resource = 'file-downloads';
192
193 return $this->fetch_stats( $args );
194 }
195
196 /**
197 * Get a post's views.
198 *
199 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/post/%24post_id/
200 * @param int $post_id The video's ID.
201 * @param array $args Optional query parameters.
202 * @return array|WP_Error
203 */
204 public function get_post_views( $post_id, $args = array() ) {
205 $this->resource = sprintf( 'post/%d', $post_id );
206
207 return $this->fetch_stats( $args );
208 }
209
210 /**
211 * Get site's views by country.
212 *
213 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/country-views/
214 * @param array $args Optional query parameters.
215 * @return array|WP_Error
216 */
217 public function get_views_by_country( $args = array() ) {
218
219 $this->resource = 'country-views';
220
221 return $this->fetch_stats( $args );
222 }
223
224 /**
225 * Get site's followers.
226 *
227 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/followers/
228 * @param array $args Optional query parameters.
229 * @return array|WP_Error
230 */
231 public function get_followers( $args = array() ) {
232
233 $this->resource = 'followers';
234
235 return $this->fetch_stats( $args );
236 }
237
238 /**
239 * Get site's comment followers.
240 *
241 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/comment-followers/
242 * @param array $args Optional query parameters.
243 * @return array|WP_Error
244 */
245 public function get_comment_followers( $args = array() ) {
246
247 $this->resource = 'comment-followers';
248
249 return $this->fetch_stats( $args );
250 }
251
252 /**
253 * Get site's publicize follower counts.
254 *
255 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/publicize/
256 * @param array $args Optional query parameters.
257 * @return array|WP_Error
258 */
259 public function get_publicize_followers( $args = array() ) {
260
261 $this->resource = 'publicize';
262
263 return $this->fetch_stats( $args );
264 }
265
266 /**
267 * Get search terms used to find the site.
268 *
269 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/search-terms/
270 * @param array $args Optional query parameters.
271 * @return array|WP_Error
272 */
273 public function get_search_terms( $args = array() ) {
274
275 $this->resource = 'search-terms';
276
277 return $this->fetch_stats( $args );
278 }
279
280 /**
281 * Get the total number of views for each post.
282 *
283 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/views/posts/
284 * @param array $args Optional query parameters.
285 * @return array|WP_Error
286 */
287 public function get_total_post_views( $args = array() ) {
288
289 $this->resource = 'views/posts';
290
291 return $this->fetch_stats( $args );
292 }
293
294 /**
295 * Get the number of visits for the site.
296 *
297 * @param array $args Optional query parameters.
298 * @return array|WP_Error
299 */
300 public function get_visits( $args = array() ) {
301
302 $this->resource = 'visits';
303
304 return $this->fetch_stats( $args );
305 }
306
307 /**
308 * Get streaks for the site.
309 *
310 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/streak/
311 *
312 * @param array $args Optional query parameters.
313 * @return array|WP_Error
314 */
315 public function get_streak( $args = array() ) {
316
317 $this->resource = 'streak';
318
319 return $this->fetch_stats( $args );
320 }
321
322 /**
323 * Get the highlights for the site.
324 *
325 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/highlights/
326 *
327 * @param array $args Optional query parameters.
328 * @return array|WP_Error
329 */
330 public function get_highlights( $args = array() ) {
331
332 $this->resource = 'highlights';
333
334 return $this->fetch_stats( $args );
335 }
336
337 /**
338 * Get the number of visits for the site.
339 *
340 * @param array $args Optional query parameters.
341 * @return array|WP_Error
342 */
343 public function get_insights( $args = array() ) {
344
345 $this->resource = 'insights';
346
347 return $this->fetch_stats( $args );
348 }
349
350 /**
351 * Build WPCOM REST API endpoint.
352 *
353 * @return string
354 */
355 protected function build_endpoint() {
356 $resource = ltrim( $this->resource, '/' );
357
358 return sprintf( '/sites/%d/stats/%s', Jetpack_Options::get_option( 'id' ), $resource );
359 }
360
361 /**
362 * Fetches stats data from WPCOM or local Cache. Caches locally for 5 minutes.
363 *
364 * @param array $args Optional query parameters.
365 *
366 * @return array|WP_Error
367 */
368 protected function fetch_stats( $args = array() ) {
369 $endpoint = $this->build_endpoint();
370 $api_version = self::STATS_REST_API_VERSION;
371 $cache_key = md5( implode( '|', array( $endpoint, $api_version, wp_json_encode( $args ) ) ) );
372 $transient_name = self::STATS_CACHE_TRANSIENT_PREFIX . $cache_key;
373 $stats_cache = get_transient( $transient_name );
374
375 if ( $stats_cache ) {
376 $time = key( $stats_cache );
377 $data = $stats_cache[ $time ]; // WP_Error or string (JSON encoded object).
378
379 if ( is_wp_error( $data ) ) {
380 return $data;
381 }
382
383 return array_merge( array( 'cached_at' => $time ), (array) json_decode( $data, true ) );
384 }
385
386 $wpcom_stats = $this->fetch_remote_stats( $endpoint, $args );
387
388 // To reduce size in storage: store with time as key, store JSON encoded data.
389 $cached_value = is_wp_error( $wpcom_stats ) ? $wpcom_stats : wp_json_encode( $wpcom_stats );
390 $expiration = self::STATS_CACHE_EXPIRATION_IN_MINUTES * MINUTE_IN_SECONDS;
391 set_transient( $transient_name, array( time() => $cached_value ), $expiration );
392
393 return $wpcom_stats;
394 }
395
396 /**
397 * Fetches stats data from WPCOM.
398 *
399 * @link https://developer.wordpress.com/docs/api/1.1/get/sites/%24site/stats/
400 * @param string $endpoint The stats endpoint.
401 * @param array $args The query arguments.
402 * @return array|WP_Error.
403 */
404 protected function fetch_remote_stats( $endpoint, $args ) {
405 if ( is_array( $args ) && ! empty( $args ) ) {
406 $endpoint .= '?' . http_build_query( $args );
407 }
408 $response = Client::wpcom_json_api_request_as_blog( $endpoint, self::STATS_REST_API_VERSION, array( 'timeout' => 20 ) );
409 $response_code = wp_remote_retrieve_response_code( $response );
410 $response_body = wp_remote_retrieve_body( $response );
411
412 if ( is_wp_error( $response ) || 200 !== $response_code || empty( $response_body ) ) {
413 return is_wp_error( $response ) ? $response : new WP_Error( 'stats_error', 'Failed to fetch Stats from WPCOM' );
414 }
415
416 return json_decode( $response_body, true );
417 }
418 }
419