PluginProbe ʕ •ᴥ•ʔ
ShareThis Dashboard for Google Analytics / 2.5.4
ShareThis Dashboard for Google Analytics v2.5.4
3.3.2 trunk 1.0.7 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2.5 2.3.5 2.3.6 2.3.7 2.3.8 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 3.0.0 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.3.0 3.3.1
googleanalytics / class / Ga_Stats.php
googleanalytics / class Last commit date
controller 5 years ago core 5 years ago Ga_Admin.php 4 years ago Ga_Autoloader.php 4 years ago Ga_Frontend.php 5 years ago Ga_Helper.php 4 years ago Ga_Hook.php 4 years ago Ga_Notice.php 6 years ago Ga_Sharethis.php 6 years ago Ga_Stats.php 4 years ago Ga_Template.php 4 years ago
Ga_Stats.php
1048 lines
1 <?php
2
3 /**
4 * Ga_Stats class
5 *
6 * Preparing request and parsing response from Google Analytics Reporting Api
7 *
8 * @author wle@adips.com
9 * @version 1.0
10 */
11 class Ga_Stats {
12
13 private $profile = array();
14
15 /**
16 * Primary class constructor.
17 *
18 * @access public
19 * @since 7.0.0
20 */
21 public function __construct() {
22 }
23
24 /**
25 * Preparing query to get Analytics data
26 *
27 * @param string $query query type
28 * @param int $id_view The Analytics view ID from which to retrieve data.
29 * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'
30 * @param string $metric A metric expression
31 * @param bool $old Use old query style.
32 *
33 * @return array Request query
34 */
35 public static function get_query( $query, $id_view, $date_range = null, $metric = null, $old = false ) {
36 if ( $query == 'main_chart' ) {
37 return $old ? self::main_chart_query_old($id_view, $date_range, $metric) : self::main_chart_query($id_view,
38 $date_range, $metric);
39 } elseif ( $query == 'gender' ) {
40 return self::gender_chart_query($id_view, $date_range, $metric);
41 } elseif ( $query == 'device' ) {
42 return self::device_chart_query($id_view, $date_range, $metric);
43 } elseif ( $query == 'age' ) {
44 return self::age_chart_query($id_view, $date_range, $metric);
45 } elseif ( $query == 'boxes' ) {
46 return self::boxes_query( $id_view );
47 } elseif ( $query == 'dashboard_boxes' ) {
48 return $old ? self::dashboard_boxes_query_old( $id_view, $date_range ) :
49 self::dashboard_boxes_query( $id_view, $date_range );
50 } elseif ( $query == 'sources' ) {
51 return self::sources_query( $id_view, $date_range );
52 } else {
53 return array();
54 }
55 }
56
57 /**
58 * Preparing query for top traffic sources table
59 *
60 * @param int $id_view The Analytics view ID from which to retrieve data.
61 * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
62 * @return array Sources query
63 */
64 public static function sources_query( $id_view, $date_ranges ) {
65 $reports_requests = array();
66
67 if ( isset( $_GET['ts'] ) ) {
68 $reports_requests[] = array(
69 'viewId' => $id_view,
70 'dateRanges' => $date_ranges,
71 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
72 'includeEmptyRows' => true,
73 'pageSize' => 10,
74 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
75 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
76 );
77 } else {
78 $reports_requests[] = array(
79 'viewId' => $id_view,
80 'dateRanges' => $date_ranges,
81 'metrics' => self::set_metrics( array(
82 'ga:pageviews',
83 'ga:uniquePageviews',
84 'ga:timeOnPage',
85 'ga:bounces',
86 'ga:entrances',
87 'ga:exits'
88 ) ),
89 'includeEmptyRows' => true,
90 'pageSize' => 10,
91 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
92 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
93 );
94 }
95
96 $query = array(
97 'reportRequests' => $reports_requests
98 );
99
100 return $query;
101 }
102
103 /**
104 * Preparing query for dashboard boxes
105 *
106 * @param int $id_view The Analytics view ID from which to retrieve data.
107 * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
108 *
109 * @return array Dashboard boxes query
110 */
111 public static function dashboard_boxes_query( $id_view, $date_ranges ) {
112 $reports_requests = array();
113
114 if ( isset( $_GET['ts'] ) ) {
115 $reports_requests[] = array(
116 'viewId' => $id_view,
117 'dateRanges' => $date_ranges,
118 'metrics' => self::set_metrics( array( 'ga:pageviews' ) ),
119 'includeEmptyRows' => true,
120 'pageSize' => 10,
121 'dimensions' => self::set_dimensions( 'ga:sourceMedium' ),
122 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
123 );
124 } else {
125 $reports_requests[] = array(
126 'viewId' => $id_view,
127 'dateRanges' => $date_ranges,
128 'metrics' => self::set_metrics( array(
129 'ga:pageviews',
130 'ga:uniquePageviews',
131 'ga:timeOnPage',
132 'ga:bounces',
133 'ga:entrances',
134 'ga:exits'
135 ) ),
136 'includeEmptyRows' => true,
137 'pageSize' => 10,
138 'dimensions' => self::set_dimensions( 'ga:pagePath' ),
139 'orderBys' => self::set_order_bys( 'ga:pageviews', 'DESCENDING' ),
140 );
141 }
142 $query = array(
143 'reportRequests' => $reports_requests
144 );
145
146 return $query;
147 }
148
149 /**
150 * Preparing query for dashboard boxes
151 *
152 * @param int $id_view The Analytics view ID from which to retrieve data.
153 * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'
154 *
155 * @return array Dashboard boxes query
156 * @deprecated
157 *
158 */
159 public static function dashboard_boxes_query_old($id_view, $date_range)
160 {
161 $reports_requests = [];
162 $daysAgo = isset($_GET['th']) ? '30daysAgo' : '7daysAgo';
163
164 if (isset($_GET['ts'])) {
165 $reports_requests[] = [
166 'viewId' => $id_view,
167 'dateRanges' => self::set_date_ranges($daysAgo, 'yesterday'),
168 'metrics' => self::set_metrics(['ga:pageviews']),
169 'includeEmptyRows' => true,
170 'pageSize' => 10,
171 'dimensions' => self::set_dimensions('ga:sourceMedium'),
172 'orderBys' => self::set_order_bys('ga:pageviews', 'DESCENDING'),
173 ];
174 } else {
175 $reports_requests[] = [
176 'viewId' => $id_view,
177 'dateRanges' => self::set_date_ranges($daysAgo, 'yesterday'),
178 'metrics' => self::set_metrics([
179 'ga:pageviews',
180 'ga:uniquePageviews',
181 'ga:timeOnPage',
182 'ga:bounces',
183 'ga:entrances',
184 'ga:exits',
185 ]),
186 'includeEmptyRows' => true,
187 'pageSize' => 10,
188 'dimensions' => self::set_dimensions('ga:pagePath'),
189 'orderBys' => self::set_order_bys('ga:pageviews', 'DESCENDING'),
190 ];
191 }
192 $query = [
193 'reportRequests' => $reports_requests,
194 ];
195
196 return $query;
197 }
198
199 /**
200 * Preparing query for stats boxes
201 *
202 * @param int $id_view The Analytics view ID from which to retrieve data.
203 *
204 * @return array Boxes query
205 */
206 public static function boxes_query( $id_view ) {
207 $range = isset( $_GET['th'] ) ? '30daysAgo' : '7daysAgo';
208 $range_s_prev = isset( $_GET['th'] ) ? '60daysAgo' : '14daysAgo';
209 $range_e_prev = isset( $_GET['th'] ) ? '31daysAgo' : '8daysAgo';
210 $reports_requests = array();
211 $reports_requests[] = array(
212 'viewId' => $id_view,
213 'dateRanges' => self::set_date_ranges( $range, 'yesterday', $range_s_prev, $range_e_prev ),
214 'metrics' => self::set_metrics( array(
215 'ga:users',
216 'ga:pageviews',
217 'ga:pageviewsPerSession',
218 'ga:BounceRate'
219 ) ),
220 'includeEmptyRows' => true,
221 'dimensions' => self::set_dimensions( 'ga:date' )
222 );
223 $query = array(
224 'reportRequests' => $reports_requests
225 );
226
227 return $query;
228 }
229
230 /**
231 * Preparing query for chart
232 *
233 * @param int $id_view The Analytics view ID from which to retrieve data.
234 * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
235 * @param string $metric A metric expression
236 *
237 * @return array Chart query
238 */
239 public static function main_chart_query( $id_view, $date_ranges = null, $metric = null ) {
240 if ( true === empty( $metric ) ) {
241 $metric = 'ga:pageviews';
242 } else {
243 $metric = 'ga:' . $metric;
244 }
245
246 $reports_requests = array();
247 $reports_requests[] = array(
248 'viewId' => $id_view,
249 'dateRanges' => $date_ranges,
250 'metrics' => self::set_metrics( $metric ),
251 'includeEmptyRows' => true,
252 'dimensions' => self::set_dimensions( 'ga:date' )
253 );
254 $query = array(
255 'reportRequests' => $reports_requests
256 );
257
258 return $query;
259 }
260
261 /**
262 * Preparing query for chart
263 *
264 * @param int $id_view The Analytics view ID from which to retrieve data.
265 * @param string $date_range The start date for the query in the format YYYY-MM-DD or '7daysAgo'
266 * @param string $metric A metric expression
267 *
268 * @return array Chart query
269 * @deprecated
270 *
271 */
272 public static function main_chart_query_old($id_view, $date_range = null, $metric = null)
273 {
274 if (empty($date_range)) {
275 $date_ranges = self::set_date_ranges('7daysAgo', 'yesterday', '14daysAgo', '8daysAgo');
276 } else {
277 $date_ranges = self::set_date_ranges($date_range, 'yesterday', '14daysAgo', '8daysAgo');
278 }
279
280 if (empty($metric)) {
281 $metric = 'ga:pageviews';
282 } else {
283 $metric = 'ga:' . $metric;
284 }
285
286 $reports_requests = [];
287 $reports_requests[] = [
288 'viewId' => $id_view,
289 'dateRanges' => $date_ranges,
290 'metrics' => self::set_metrics($metric),
291 'includeEmptyRows' => true,
292 'dimensions' => self::set_dimensions('ga:date'),
293 ];
294 $query = [
295 'reportRequests' => $reports_requests,
296 ];
297
298 return $query;
299 }
300
301 /**
302 * Preparing query for gender chart
303 *
304 * @param int $id_view The Analytics view ID from which to retrieve data.
305 * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
306 * @param string $metric A metric expression
307 *
308 * @return array Chart query
309 */
310 public static function gender_chart_query( $id_view, $date_ranges = null, $metric = null ) {
311 if ( true === empty( $date_ranges ) ) {
312 $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
313 }
314
315 $reports_requests = array();
316 $reports_requests[] = array(
317 'viewId' => $id_view,
318 'dateRanges' => $date_ranges,
319 'metrics' => self::set_metrics( 'ga:sessions' ),
320 'includeEmptyRows' => true,
321 'dimensions' => self::set_dimensions( 'ga:userGender' )
322 );
323 $query = array(
324 'reportRequests' => $reports_requests
325 );
326
327 return $query;
328 }
329
330 /**
331 * Preparing query for device chart.
332 *
333 * @param int $id_view The Analytics view ID from which to retrieve data.
334 * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
335 * @param string $metric A metric expression
336 *
337 * @return array Chart query
338 * @since 2.5.2
339 */
340 public static function device_chart_query( $id_view, $date_ranges = null, $metric = null ) {
341 return array(
342 'reportRequests' => array(
343 array(
344 'viewId' => $id_view,
345 'dateRanges' => $date_ranges,
346 'metrics' => self::set_metrics( 'ga:sessions' ),
347 'includeEmptyRows' => true,
348 'dimensions' => self::set_dimensions( 'ga:deviceCategory' )
349 )
350 )
351 );
352 }
353
354 /**
355 * Preparing query for age chart
356 *
357 * @param int $id_view The Analytics view ID from which to retrieve data.
358 * @param array $date_ranges An array representing the date ranges that will be passed to chart query.
359 * @param string $metric A metric expression
360 *
361 * @return array Chart query
362 */
363 public static function age_chart_query( $id_view, $date_ranges = null, $metric = null ) {
364 if ( true === empty( $date_ranges ) ) {
365 $date_ranges = self::set_date_ranges( '7daysAgo', 'yesterday', '14daysAgo', '8daysAgo' );
366 }
367
368 $reports_requests = array();
369 $reports_requests[] = array(
370 'viewId' => $id_view,
371 'dateRanges' => $date_ranges,
372 'metrics' => self::set_metrics( 'ga:sessions' ),
373 'includeEmptyRows' => true,
374 'dimensions' => self::set_dimensions( 'ga:userAgeBracket' )
375 );
376 $query = array(
377 'reportRequests' => $reports_requests
378 );
379
380 return $query;
381 }
382
383 /**
384 * Setting order for requests
385 *
386 * @param string $name The field which to sort by. The default sort order is ascending. Example: ga:browser.
387 * @param string $sort The sorting order for the field. 'ASCENDING' or 'DESCENDING'
388 *
389 * @return array OrderBys
390 */
391 public static function set_order_bys( $name, $sort ) {
392 $order = array();
393 $order[] = array(
394 'fieldName' => $name,
395 'sortOrder' => $sort,
396 );
397
398 return $order;
399 }
400
401 /**
402 * Setting metrics for requests
403 *
404 * @param mixed $expression A metric expression or array of expressions
405 *
406 * @return array Metrics
407 */
408 public static function set_metrics( $expression ) {
409 $metrics = array();
410 if ( is_array( $expression ) ) {
411 foreach ( $expression as $exp ) {
412 $metrics[] = array(
413 'expression' => $exp
414 );
415 }
416 } else {
417 $metrics[] = array(
418 'expression' => $expression
419 );
420 }
421
422 return $metrics;
423 }
424
425 /**
426 * Setting dimensions for requests
427 *
428 * @param string $name Name of the dimension to fetch, for example ga:browser.
429 *
430 * @return array Dimensions
431 */
432 public static function set_dimensions( $name ) {
433 $dimensions = array();
434 $dimensions[] = array(
435 'name' => $name
436 );
437
438 return $dimensions;
439 }
440
441 /**
442 * Setting date ranges for requests
443 *
444 * @param string $start_date The start date for the query in the format YYYY-MM-DD.
445 * @param string $end_date The end date for the query in the format YYYY-MM-DD.
446 * @param string $prev_start_date The start date (second range) for the query in the format YYYY-MM-DD.
447 * @param string $prev_end_date The start date (second range) for the query in the format YYYY-MM-DD.
448 *
449 * @return array Date ranges
450 */
451 public static function set_date_ranges( $start_date, $end_date, $prev_start_date = '', $prev_end_date = '' ) {
452 $date_danges = array();
453 $date_danges[] = array(
454 'startDate' => $start_date,
455 'endDate' => $end_date,
456 );
457 if ( !empty( $prev_start_date ) and ! empty( $prev_end_date ) ) {
458 $date_danges[] = array(
459 'startDate' => $prev_start_date,
460 'endDate' => $prev_end_date,
461 );
462 }
463
464 return $date_danges;
465 }
466
467 /**
468 * Preparing response for data received from analytics
469 *
470 * @param array $data Analytics response
471 *
472 * @return array Response rows
473 */
474 public static function prepare_response( $data ) {
475 $data = self::get_reports_from_response( $data );
476 self::handle_more_reports( $data );
477 $report = self::get_single_report( $data );
478 self::get_report_column_header( $report );
479 $report_data = self::get_report_data( $report );
480 self::get_totals( $report_data );
481 self::get_row_count( $report_data );
482 $rows = self::get_rows( $report_data );
483
484 return $rows;
485 }
486
487 /**
488 * Get dimensions from response row
489 *
490 * @param array $row Analytics response row
491 *
492 * @return array|bool Dimensions
493 */
494 public static function get_dimensions( $row ) {
495 if ( !empty( $row[ 'dimensions' ] ) ) {
496 return $row[ 'dimensions' ];
497 }
498
499 return false;
500 }
501
502 /**
503 * Get metrics from response row
504 *
505 * @param array $row Analytics response row
506 *
507 * @return array|bool Metrics
508 */
509 public static function get_metrics( $row ) {
510 if ( !empty( $row[ 'metrics' ] ) ) {
511 return $row[ 'metrics' ];
512 }
513
514 return false;
515 }
516
517 /**
518 * Get row from response report data
519 *
520 * @param array $report_data Analytics response report data
521 *
522 * @return array|bool Rows
523 */
524 public static function get_rows( $report_data ) {
525 if ( !empty( $report_data[ 'rows' ] ) ) {
526 return $report_data[ 'rows' ];
527 }
528
529 return false;
530 }
531
532 /**
533 * Get row count from response report data
534 *
535 * @param array $report_data Analytics response report data
536 *
537 * @return array|bool Row count
538 */
539 public static function get_row_count( $report_data ) {
540 if ( !empty( $report_data[ 'rowCount' ] ) ) {
541 return $report_data[ 'rowCount' ];
542 }
543
544 return false;
545 }
546
547 /**
548 * Get totals from response report data
549 *
550 * @param array $report_data Analytics response report data
551 *
552 * @return array|bool Totals
553 */
554 public static function get_totals( $report_data ) {
555 if ( !empty( $report_data[ 'totals' ] ) ) {
556 return $report_data[ 'totals' ];
557 }
558
559 return false;
560 }
561
562 /**
563 * Get reports from response data
564 *
565 * @param array $data Analytics response data
566 *
567 * @return array|bool Reports
568 */
569 public static function get_reports_from_response( $data ) {
570 if ( !empty( $data[ 'reports' ] ) ) {
571 return $data[ 'reports' ];
572 }
573
574 return false;
575 }
576
577 /**
578 * Show info for multiple data
579 *
580 * @param array $data Analytics response data
581 *
582 */
583 public static function handle_more_reports( $data ) {
584 if ( count( $data ) > 1 ) {
585 echo 'more than one report';
586 }
587 }
588
589 /**
590 * Show info for multiple rows
591 *
592 * @param array $rows Analytics response rows
593 *
594 */
595 public static function handle_more_rows( $rows ) {
596 if ( count( $rows ) > 1 ) {
597 echo 'more than one row';
598 }
599 }
600
601 /**
602 * Get single report from response data
603 *
604 * @param array $data Analytics response data
605 *
606 * @return array|bool Report
607 */
608 public static function get_single_report( $data ) {
609 if ( !empty( $data ) ) {
610 foreach ( $data as $report ) {
611 if ( !empty( $report ) ) {
612 return $report;
613 }
614 }
615 }
616
617 return false;
618 }
619
620 /**
621 * Get single row from response data rows
622 *
623 * @param array $rows Analytics response data rows
624 *
625 * @return array|bool Row
626 */
627 public static function get_single_row( $rows ) {
628 if ( !empty( $rows ) ) {
629 foreach ( $rows as $row ) {
630 if ( !empty( $row ) ) {
631 return $row;
632 }
633 }
634 }
635
636 return false;
637 }
638
639 /**
640 * Get column header from response data
641 *
642 * @param array $data Analytics response data
643 *
644 * @return array Column header
645 */
646 public static function get_report_column_header( $data ) {
647 if ( !empty( $data[ 'columnHeader' ] ) ) {
648 return $data[ 'columnHeader' ];
649 }
650
651 return false;
652 }
653
654 /**
655 * Get report data from response data
656 *
657 * @param array $data Analytics response data
658 *
659 * @return array data
660 */
661 public static function get_report_data( $data ) {
662 if ( !empty( $data[ 'data' ] ) ) {
663 return $data[ 'data' ];
664 }
665
666 return false;
667 }
668
669 /**
670 * Get chart from response data
671 *
672 * @param array $response_data Analytics response data
673 *
674 * @return array chart data
675 */
676 public static function get_chart( $response_data, $period_in_days = 7 ) {
677 $chart_data = array();
678 if ( ! empty( $response_data ) ) {
679 $data = ( ! empty( $response_data['reports'] ) && ! empty( $response_data['reports'][0] ) && ! empty( $response_data['reports'][0]['data'] ) ) ? $response_data['reports'][0]['data'] : array();
680 $rows = ( ! empty( $data['rows'] ) ) ? $data['rows'] : array();
681 if ( ! empty( $rows ) ) {
682 foreach ( $rows as $key => $row ) {
683 if ( $key < $period_in_days ) {
684 $chart_data[ $key ]['previous'] = ! empty( $row['metrics'][1]['values'][0] ) ? $row['metrics'][1]['values'][0] : 0;
685 $chart_data[ $key ]['previous-day'] = date( 'M j', strtotime( $row['dimensions'][0] ) );
686 } else {
687 $chart_data[ $key - $period_in_days ]['day'] = date( 'M j', strtotime( $row['dimensions'][0] ) );
688 $chart_data[ $key - $period_in_days ]['current'] = ! empty( $row['metrics'][0]['values'][0] ) ? $row['metrics'][0]['values'][0] : 0;
689 $chart_data['date'] = strtotime( $row['dimensions'][0] );
690 }
691 }
692 }
693 }
694
695 return $chart_data;
696 }
697
698 /**
699 * Get gender chart from response data
700 *
701 * @param array $response_data Analytics response data
702 *
703 * @return array chart data
704 */
705 public static function get_gender_chart( $response_data ) {
706 $chart_data = [];
707 if ( !empty( $response_data ) ) {
708 $data = (!empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
709 $rows = (!empty( $data[ 'rows' ] ) ) ? $data[ 'rows' ] : array();
710 if ( !empty( $rows ) ) {
711 foreach ( $rows as $key => $row ) {
712 $chart_data[$row['dimensions'][0]] = self::get_metric_value($row['metrics']);
713 }
714 }
715 }
716
717 return $chart_data;
718 }
719
720 /**
721 * Get device chart from response data.
722 *
723 * @param array $response_data Analytics response data array.
724 *
725 * @return array Chart data array.
726 */
727 public static function get_device_chart( $response_data ) {
728 $chart_data = [];
729 if ( false === empty( $response_data ) ) {
730 $data = (false === empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
731 $rows = ( false === empty( $data['rows'] ) ) ? $data['rows'] : array();
732 if ( false === empty( $rows ) ) {
733 foreach ( $rows as $row ) {
734 $chart_data[$row['dimensions'][0]] = self::get_metric_value($row['metrics']);
735 }
736 }
737 }
738
739 return $chart_data;
740 }
741
742 /**
743 * Get the value of metric data response.
744 *
745 * @param $metrics
746 *
747 * @return mixed
748 */
749 private static function get_metric_value($metrics)
750 {
751 if (is_array($metrics)) {
752 foreach($metrics as $metric) {
753 $values[] = $metric['values'][0];
754 }
755 }
756
757 return $values[0];
758 }
759
760 /**
761 * Get gender chart from response data
762 *
763 * @param array $response_data Analytics response data
764 *
765 * @return array chart data
766 */
767 public static function get_age_chart( $response_data ) {
768 $chart_data = [];
769 if ( !empty( $response_data ) ) {
770 $data = (!empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
771 $rows = (!empty( $data[ 'rows' ] ) ) ? $data[ 'rows' ] : array();
772 if ( !empty( $rows ) ) {
773 foreach ( $rows as $key => $row ) {
774 $chart_data[$row['dimensions'][0]] = self::get_metric_value($row['metrics']);
775 }
776 }
777 }
778
779 return $chart_data;
780 }
781
782 /**
783 * Get dasboard chart from response data
784 *
785 * @param array $response_data Analytics response data
786 *
787 * @return array dashboard chart data
788 */
789 public static function get_dashboard_chart( $response_data ) {
790 $chart_data = array();
791 if ( !empty( $response_data ) ) {
792 $data = (!empty( $response_data[ 'reports' ] ) && !empty( $response_data[ 'reports' ][ 0 ] ) && !empty( $response_data[ 'reports' ][ 0 ][ 'data' ] ) ) ? $response_data[ 'reports' ][ 0 ][ 'data' ] : array();
793 $rows = (!empty( $data[ 'rows' ] ) ) ? $data[ 'rows' ] : array();
794 if ( !empty( $rows ) ) {
795 foreach ( $rows as $row ) {
796 $chart_data[] = array(
797 'day' => date( 'M j', strtotime( $row[ 'dimensions' ][ 0 ] ) ),
798 'current' => !empty( $row[ 'metrics' ][ 0 ][ 'values' ][ 0 ] ) ? $row[ 'metrics' ][ 0 ][ 'values' ][ 0 ] : 0
799 );
800 }
801 }
802 }
803
804 return $chart_data;
805 }
806
807 /**
808 * Get boxes from response data
809 *
810 * @param array $data Analytics response data
811 *
812 * @return array boxes data
813 */
814 public static function get_boxes( $data ) {
815 if ( !empty( $data ) ) {
816 $data = self::get_reports_from_response( $data );
817 self::handle_more_reports( $data );
818 $report = self::get_single_report( $data );
819 self::get_report_column_header( $report );
820 $report_data = self::get_report_data( $report );
821 $totals = self::get_totals( $report_data );
822
823 return self::get_boxes_from_totals( $totals );
824 }
825 }
826
827 /**
828 * Get boxes from totals
829 *
830 * @param array $totals Analytics response totals
831 *
832 * @return array boxes data
833 */
834 public static function get_boxes_from_totals( $totals ) {
835 if ( !empty( $totals ) ) {
836 $boxes_data = array();
837 foreach ( $totals as $key => $total ) {
838 if ( $key == 0 ) {
839 $boxes_data[ 'Users' ][ 'current' ] = $total[ 'values' ][ 0 ];
840 $boxes_data[ 'Pageviews' ][ 'current' ] = $total[ 'values' ][ 1 ];
841 $boxes_data[ 'PageviewsPerSession' ][ 'current' ] = $total[ 'values' ][ 2 ];
842 $boxes_data[ 'BounceRate' ][ 'current' ] = round( $total[ 'values' ][ 3 ], 2 );
843 } else {
844 $boxes_data[ 'Users' ][ 'previous' ] = $total[ 'values' ][ 0 ];
845 $boxes_data[ 'Pageviews' ][ 'previous' ] = $total[ 'values' ][ 1 ];
846 $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] = $total[ 'values' ][ 2 ];
847 $boxes_data[ 'BounceRate' ][ 'previous' ] = round( $total[ 'values' ][ 3 ], 2 );
848 }
849 }
850
851 return self::prepare_boxes( $boxes_data );
852 }
853
854 return false;
855 }
856
857 /**
858 * Prepare boxes data
859 *
860 * @param array $boxes_data Boxes data
861 *
862 * @return array boxes data
863 */
864 public static function prepare_boxes( $boxes_data ) {
865 $boxes_data[ 'Users' ][ 'diff' ] = ( $boxes_data[ 'Users' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'Users' ][ 'current' ] - $boxes_data[ 'Users' ][ 'previous' ] ) / $boxes_data[ 'Users' ][ 'previous' ] * 100, 2 ) : 100;
866 $boxes_data[ 'Pageviews' ][ 'diff' ] = ( $boxes_data[ 'Pageviews' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'Pageviews' ][ 'current' ] - $boxes_data[ 'Pageviews' ][ 'previous' ] ) / $boxes_data[ 'Pageviews' ][ 'previous' ] * 100, 2 ) : 100;
867 $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'PageviewsPerSession' ][ 'current' ] - $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] ) / $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] * 100, 2 ) : 100;
868 $boxes_data[ 'BounceRate' ][ 'diff' ] = ( $boxes_data[ 'BounceRate' ][ 'previous' ] > 0 ) ? round( ( $boxes_data[ 'BounceRate' ][ 'current' ] - $boxes_data[ 'BounceRate' ][ 'previous' ] ) / $boxes_data[ 'BounceRate' ][ 'previous' ] * 100, 2 ) : 100;
869 $boxes_data[ 'Users' ][ 'diff' ] = ( $boxes_data[ 'Users' ][ 'previous' ] == 0 && $boxes_data[ 'Users' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'Users' ][ 'diff' ];
870 $boxes_data[ 'Pageviews' ][ 'diff' ] = ( $boxes_data[ 'Pageviews' ][ 'previous' ] == 0 && $boxes_data[ 'Pageviews' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'Pageviews' ][ 'diff' ];
871 $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'previous' ] == 0 && $boxes_data[ 'PageviewsPerSession' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'PageviewsPerSession' ][ 'diff' ];
872 $boxes_data[ 'BounceRate' ][ 'diff' ] = ( $boxes_data[ 'BounceRate' ][ 'previous' ] == 0 && $boxes_data[ 'BounceRate' ][ 'current' ] == 0 ) ? 0 : $boxes_data[ 'BounceRate' ][ 'diff' ];
873 $boxes_data[ 'Users' ][ 'label' ] = 'Users';
874 $boxes_data[ 'Pageviews' ][ 'label' ] = 'Pageviews';
875 $boxes_data[ 'PageviewsPerSession' ][ 'label' ] = 'Pages / Session';
876 $boxes_data[ 'BounceRate' ][ 'label' ] = 'Bounce Rate';
877 $boxes_data[ 'Users' ][ 'comparison' ] = $boxes_data[ 'Users' ][ 'current' ] . ' vs ' . $boxes_data[ 'Users' ][ 'previous' ];
878 $boxes_data[ 'Pageviews' ][ 'comparison' ] = $boxes_data[ 'Pageviews' ][ 'current' ] . ' vs ' . $boxes_data[ 'Pageviews' ][ 'previous' ];
879 $boxes_data[ 'PageviewsPerSession' ][ 'comparison' ] = self::number_format_clean( $boxes_data[ 'PageviewsPerSession' ][ 'current' ], 2, '.', ',' ) . ' vs ' . self::number_format_clean( $boxes_data[ 'PageviewsPerSession' ][ 'previous' ], 2, '.', ',' );
880 $boxes_data[ 'BounceRate' ][ 'comparison' ] = self::number_format_clean( $boxes_data[ 'BounceRate' ][ 'current' ], 2, '.', ',' ) . '% vs ' . self::number_format_clean( $boxes_data[ 'BounceRate' ][ 'previous' ], 2, '.', ',' ) . '%';
881 $boxes_data[ 'Users' ][ 'color' ] = ( $boxes_data[ 'Users' ][ 'diff' ] > 0 ) ? 'green' : 'red';
882 $boxes_data[ 'Pageviews' ][ 'color' ] = ( $boxes_data[ 'Pageviews' ][ 'diff' ] > 0 ) ? 'green' : 'red';
883 $boxes_data[ 'PageviewsPerSession' ][ 'color' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] > 0 ) ? 'green' : 'red';
884 $boxes_data[ 'BounceRate' ][ 'color' ] = ( $boxes_data[ 'BounceRate' ][ 'diff' ] > 0 ) ? 'red' : 'green';
885 $boxes_data[ 'Users' ][ 'color' ] = ( $boxes_data[ 'Users' ][ 'diff' ] != 0 ) ? $boxes_data[ 'Users' ][ 'color' ] : 'black';
886 $boxes_data[ 'Pageviews' ][ 'color' ] = ( $boxes_data[ 'Pageviews' ][ 'diff' ] != 0 ) ? $boxes_data[ 'Pageviews' ][ 'color' ] : 'black';
887 $boxes_data[ 'PageviewsPerSession' ][ 'color' ] = ( $boxes_data[ 'PageviewsPerSession' ][ 'diff' ] != 0 ) ? $boxes_data[ 'PageviewsPerSession' ][ 'color' ] : 'black';
888 $boxes_data[ 'BounceRate' ][ 'color' ] = ( $boxes_data[ 'BounceRate' ][ 'diff' ] != 0 ) ? $boxes_data[ 'BounceRate' ][ 'color' ] : 'black';
889
890 return $boxes_data;
891 }
892
893 /**
894 * Number format for boxes
895 *
896 * @param float $number Number to format
897 * @param int $precision Precision
898 * @param string $dec_point Decimal point
899 * @param string $thousands_sep Thousands Separator
900 *
901 * @return string clean number format
902 */
903 public static function number_format_clean( $number, $precision = 0, $dec_point = '.', $thousands_sep = ',' ) {
904 if ( $number == 0 ) {
905 return 0;
906 } else {
907 $format = number_format( $number, $precision, $dec_point, $thousands_sep );
908 if ( substr( $format, 2 ) == '.00' ) {
909 return substr( $format, 0, - 3 );
910 }
911
912 return $format;
913 }
914 }
915
916 /**
917 * Get sources from analytics response data
918 *
919 * @param array $data Analytics response data
920 *
921 * @return array|bool sources data
922 */
923 public static function get_sources( $data ) {
924 if ( !empty( $data ) ) {
925 $data = self::get_reports_from_response( $data );
926 self::handle_more_reports( $data );
927 $report = self::get_single_report( $data );
928 self::get_report_column_header( $report );
929 $report_data = self::get_report_data( $report );
930 $rows = self::get_rows( $report_data );
931 $totals = self::get_totals( $report_data );
932 $totalCount = array();
933 if ( !empty( $totals ) ) {
934 foreach ( $totals as $key => $total ) {
935 $totalCount = $total[ 'values' ][ 0 ];
936 }
937 }
938 $sources = array(
939 'total' => $totalCount,
940 'sum' => 0,
941 'rows' => array(),
942 );
943 if ( !empty( $rows ) ) {
944 $i = 1;
945 foreach ( $rows as $row ) {
946 if ( !empty( $row ) ) {
947 foreach ( $row as $key => $value ) {
948 if ( $key == 'dimensions' ) {
949 $sources[ 'rows' ][ $i ][ 'name' ] = $value[ 0 ];
950 $sources[ 'rows' ][ $i ][ 'url' ] = $value[ 0 ];
951 } elseif ( $key == 'metrics' ) {
952 $sources[ 'rows' ][ $i ][ 'number' ] = $value[ 0 ][ 'values' ][ 0 ];
953 $sources[ 'rows' ][ $i ][ 'percent' ] = (!empty( $totalCount ) ) ? round( $value[ 0 ][ 'values' ][ 0 ] / $totalCount * 100, 2 ) : 0;
954 $sources[ 'sum' ] += $value[ 0 ][ 'values' ][ 0 ];
955 }
956 }
957 $i ++;
958 }
959 }
960 }
961
962 return $sources;
963 }
964
965 return false;
966 }
967
968 /**
969 * Get dashboard boxes data from analytics response data
970 *
971 * @param array $data Analytics response data
972 *
973 * @return array dashboard boxes data
974 */
975 public static function get_dashboard_boxes_data( $data ) {
976 if ( !empty( $data ) ) {
977 $data = self::get_reports_from_response( $data );
978 self::handle_more_reports( $data );
979 $report = self::get_single_report( $data );
980 self::get_report_column_header( $report );
981 $report_data = self::get_report_data( $report );
982 $totals = self::get_totals( $report_data );
983 $boxes_data = array();
984 $boxes_data[ 'Sessions' ] = array(
985 'label' => 'Visits',
986 'value' => $totals[ 0 ][ 'values' ][ 0 ],
987 );
988 $boxes_data[ 'Pageviews' ] = array(
989 'label' => 'Pageviews',
990 'value' => $totals[ 0 ][ 'values' ][ 1 ],
991 );
992 $boxes_data[ 'pageviewsPerSession' ] = array(
993 'label' => 'Pages / Visit',
994 'value' => self::number_format_clean( $totals[ 0 ][ 'values' ][ 2 ], 2, '.', ',' ),
995 );
996 $boxes_data[ 'BounceRate' ] = array(
997 'label' => 'Bounce Rate',
998 'value' => self::number_format_clean( $totals[ 0 ][ 'values' ][ 3 ], 2, '.', ',' ) . '%',
999 );
1000 $boxes_data[ 'avgTimeOnPage' ] = array(
1001 'label' => 'Avg. Time on Site',
1002 'value' => gmdate( "H:i:s", $totals[ 0 ][ 'values' ][ 4 ] ),
1003 );
1004 $boxes_data[ 'percentNewSessions' ] = array(
1005 'label' => '% of New Visits',
1006 'value' => self::number_format_clean( $totals[ 0 ][ 'values' ][ 5 ], 2, '.', ',' ),
1007 );
1008
1009 return $boxes_data;
1010 }
1011 }
1012
1013 /**
1014 * Get Empty Boxes Structure.
1015 *
1016 * @return array Array of empty boxes structure values.
1017 */
1018 public static function get_empty_boxes_structure() {
1019 $boxes_data = array();
1020 $boxes_data[ 'Sessions' ] = array(
1021 'label' => 'Visits',
1022 'value' => 0,
1023 );
1024 $boxes_data[ 'Pageviews' ] = array(
1025 'label' => 'Pageviews',
1026 'value' => 0,
1027 );
1028 $boxes_data[ 'pageviewsPerSession' ] = array(
1029 'label' => 'Pages / Visit',
1030 'value' => self::number_format_clean( 0, 2, '.', ',' ),
1031 );
1032 $boxes_data[ 'BounceRate' ] = array(
1033 'label' => 'Bounce Rate',
1034 'value' => self::number_format_clean( 0, 2, '.', ',' ) . '%',
1035 );
1036 $boxes_data[ 'avgTimeOnPage' ] = array(
1037 'label' => 'Avg. Time on Site',
1038 'value' => gmdate( "H:i:s", 0 ),
1039 );
1040 $boxes_data[ 'percentNewSessions' ] = array(
1041 'label' => '% of New Visits',
1042 'value' => self::number_format_clean( 0, 2, '.', ',' ),
1043 );
1044
1045 return $boxes_data;
1046 }
1047 }
1048