PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.14.2
Independent Analytics – WordPress Analytics Plugin v2.14.2
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Public_API / Top_Posts.php
independent-analytics / IAWP / Public_API Last commit date
Analytics.php 1 year ago Singular_Analytics.php 1 year ago Top_Posts.php 5 months ago
Top_Posts.php
83 lines
1 <?php
2
3 namespace IAWP\Public_API;
4
5 use IAWPSCOPED\Carbon\CarbonImmutable;
6 use IAWP\Date_Range\Exact_Date_Range;
7 use IAWP\Illuminate_Builder;
8 use IAWP\Query;
9 use IAWPSCOPED\Illuminate\Database\Query\Builder;
10 use IAWPSCOPED\Illuminate\Database\Query\JoinClause;
11 /** @internal */
12 class Top_Posts
13 {
14 public $options = [];
15 public function __construct(array $options = [])
16 {
17 $this->options = $this->validate_options($options);
18 }
19 public function get() : array
20 {
21 $date_range = new Exact_Date_Range($this->options['from']->toDateTime(), $this->options['to']->toDateTime());
22 $resources_table = Query::get_table_name(Query::RESOURCES);
23 $views_table = Query::get_table_name(Query::VIEWS);
24 $sessions_table = Query::get_table_name(Query::SESSIONS);
25 $resource_statistics_query = Illuminate_Builder::new();
26 $resource_statistics_query->selectRaw('resources.singular_id AS id')->selectRaw('resources.cached_title AS title')->selectRaw('COUNT(DISTINCT views.id) AS views')->selectRaw('COUNT(DISTINCT sessions.visitor_id) AS visitors')->selectRaw('COUNT(DISTINCT sessions.session_id) AS sessions')->from("{$views_table} as views")->join("{$resources_table} AS resources", function (JoinClause $join) {
27 $join->on('resources.id', '=', 'views.resource_id');
28 })->join("{$sessions_table} AS sessions", function (JoinClause $join) {
29 $join->on('sessions.session_id', '=', 'views.session_id');
30 })->whereNotNull('resources.singular_id')->where('resources.cached_type', '=', $this->options['post_type'])->when(\is_int($this->options['category']), function (Builder $query) {
31 $query->whereRaw("find_in_set(?, REPLACE(cached_category, ', ', ','))", [$this->options['category']]);
32 })->whereBetween('views.viewed_at', [$date_range->iso_start(), $date_range->iso_end()])->limit($this->options['limit'])->orderByDesc($this->options['sort_by'])->groupBy('resources.id');
33 $results = $resource_statistics_query->get()->toArray();
34 return $results;
35 }
36 private function validate_options(array $options) : array
37 {
38 // Post type
39 if (\array_key_exists('post_type', $options) && \post_type_exists($options['post_type'])) {
40 $post_type = $options['post_type'];
41 } else {
42 $post_type = 'post';
43 }
44 // Category
45 if (\array_key_exists('category', $options) && \is_int($options['category'])) {
46 $category = $options['category'];
47 } else {
48 $category = null;
49 }
50 // Limit
51 if (\array_key_exists('limit', $options) && \is_int($options['limit'])) {
52 $limit = $options['limit'];
53 } else {
54 $limit = 10;
55 }
56 // From
57 if (\array_key_exists('from', $options) && $options['from'] instanceof \DateTime) {
58 $from = CarbonImmutable::instance($options['from']);
59 } else {
60 $from = CarbonImmutable::now('utc')->subtract('days', 30);
61 }
62 // To
63 if (\array_key_exists('to', $options) && $options['to'] instanceof \DateTime) {
64 $to = CarbonImmutable::instance($options['to']);
65 } else {
66 $to = CarbonImmutable::now('utc');
67 }
68 // Is date range valid?
69 if ($from->greaterThanOrEqualTo($to)) {
70 $from = CarbonImmutable::now('utc')->subtract('days', 30);
71 $to = CarbonImmutable::now('utc');
72 }
73 // Sort by
74 $valid_sorting_options = ['views', 'visitors', 'sessions'];
75 if (\array_key_exists('sort_by', $options) && \in_array($options['sort_by'], $valid_sorting_options)) {
76 $sort_by = $options['sort_by'];
77 } else {
78 $sort_by = 'views';
79 }
80 return ['post_type' => $post_type, 'category' => $category, 'limit' => $limit, 'from' => $from, 'to' => $to, 'sort_by' => $sort_by];
81 }
82 }
83