PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.2.0
Independent Analytics – WordPress Analytics Plugin v2.2.0
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 / Rows / Referrers.php
independent-analytics / IAWP / Rows Last commit date
Campaigns.php 2 years ago Cities.php 2 years ago Countries.php 2 years ago Device_Browsers.php 2 years ago Device_OSS.php 2 years ago Device_Types.php 2 years ago Filter.php 2 years ago Pages.php 2 years ago Referrers.php 2 years ago Rows.php 2 years ago
Referrers.php
92 lines
1 <?php
2
3 namespace IAWP_SCOPED\IAWP\Rows;
4
5 use IAWP_SCOPED\IAWP\Illuminate_Builder;
6 use IAWP_SCOPED\IAWP\Models\Referrer;
7 use IAWP_SCOPED\IAWP\Query;
8 use IAWP_SCOPED\Illuminate\Database\Query\Builder;
9 use IAWP_SCOPED\Illuminate\Database\Query\JoinClause;
10 /** @internal */
11 class Referrers extends Rows
12 {
13 public function attach_filters(Builder $query) : void
14 {
15 $query->joinSub($this->query(\true), 'referrer_rows', function (JoinClause $join) {
16 $join->on('referrer_rows.referrer_id', '=', 'sessions.referrer_id');
17 });
18 }
19 protected function fetch_rows() : array
20 {
21 $rows = $this->query()->get()->all();
22 return \array_map(function ($row) {
23 return new Referrer($row);
24 }, $rows);
25 }
26 private function query(?bool $skip_pagination = \false) : Builder
27 {
28 if ($skip_pagination) {
29 $this->number_of_rows = null;
30 }
31 $views_table = Query::get_table_name(Query::VIEWS);
32 $sessions_table = Query::get_table_name(Query::SESSIONS);
33 $wc_orders = Query::get_table_name(Query::WC_ORDERS);
34 $referrers_table = Query::get_table_name(Query::REFERRERS);
35 $current_period_array = [$this->date_range->iso_start(), $this->date_range->iso_end()];
36 $previous_period_array = [$this->date_range->previous_period()->iso_start(), $this->date_range->previous_period()->iso_end()];
37 $total_period_array = [$this->date_range->previous_period()->iso_start(), $this->date_range->iso_end()];
38 $calculated_columns = ['views_per_session', 'views_growth', 'visitors_growth', 'bounce_rate', 'wc_net_sales', 'wc_conversion_rate', 'wc_earnings_per_visitor', 'wc_average_order_volume'];
39 $has_calculate_column_filter = !empty(\array_filter($this->filters, function ($filter) use($calculated_columns) {
40 return \in_array($filter['column'], $calculated_columns);
41 }));
42 if (\in_array($this->sort_configuration->column(), $calculated_columns)) {
43 $has_calculate_column_filter = \true;
44 }
45 $woo_commerce_query = Illuminate_Builder::get_builder();
46 $woo_commerce_query->select(['wc_orders.view_id AS view_id'])->selectRaw('IFNULL(COUNT(DISTINCT wc_orders.order_id), 0) AS wc_orders')->selectRaw('IFNULL(ROUND(CAST(SUM(wc_orders.total) AS DECIMAL(10, 2))), 0) AS wc_gross_sales')->selectRaw('IFNULL(ROUND(CAST(SUM(wc_orders.total_refunded) AS DECIMAL(10, 2))), 0) AS wc_refunded_amount')->selectRaw('IFNULL(SUM(wc_orders.total_refunds), 0) AS wc_refunds')->from($wc_orders, 'wc_orders')->whereIn('wc_orders.status', ['wc-completed', 'completed', 'wc-processing', 'processing', 'wc-refunded', 'refunded'])->whereBetween('wc_orders.created_at', $current_period_array)->groupBy('wc_orders.view_id');
47 $referrers_query = Illuminate_Builder::get_builder();
48 $referrers_query->select('sessions.referrer_id', 'referrer', 'type AS referrer_type', 'domain')->selectRaw('COUNT(DISTINCT IF(views.viewed_at BETWEEN ? AND ?, views.id, NULL)) AS views', $current_period_array)->selectRaw('COUNT(DISTINCT IF(views.viewed_at BETWEEN ? AND ?, views.id, NULL)) AS previous_period_views', $previous_period_array)->selectRaw('COUNT(DISTINCT IF(views.viewed_at BETWEEN ? AND ?, sessions.visitor_id, NULL)) AS visitors', $current_period_array)->selectRaw('COUNT(DISTINCT IF(views.viewed_at BETWEEN ? AND ?, sessions.visitor_id, NULL)) AS previous_period_visitors', $previous_period_array)->selectRaw('COUNT(DISTINCT IF(views.viewed_at BETWEEN ? AND ?, sessions.session_id, NULL)) AS sessions', $current_period_array)->selectRaw('ROUND(AVG( IF(views.viewed_at BETWEEN ? AND ?, TIMESTAMPDIFF(SECOND, sessions.created_at, sessions.ended_at), NULL))) AS average_session_duration', $current_period_array)->selectRaw('COUNT(DISTINCT IF(views.viewed_at BETWEEN ? AND ? AND sessions.final_view_id IS NULL, sessions.session_id, NULL)) AS bounces', $current_period_array)->selectRaw('IFNULL(SUM(wc.wc_orders), 0) AS wc_orders')->selectRaw('IFNULL(SUM(wc.wc_gross_sales), 0) AS wc_gross_sales')->selectRaw('IFNULL(SUM(wc.wc_refunded_amount), 0) AS wc_refunded_amount')->selectRaw('IFNULL(SUM(wc_refunds), 0) AS wc_refunds')->from($views_table, 'views')->leftJoin($referrers_query->raw($sessions_table . ' AS sessions'), function (JoinClause $join) {
49 $join->on('views.session_id', '=', 'sessions.session_id');
50 })->leftJoin($referrers_query->raw($referrers_table . ' AS referrers'), function (JoinClause $join) {
51 $join->on('sessions.referrer_id', '=', 'referrers.id');
52 })->leftJoinSub($woo_commerce_query, 'wc', function (JoinClause $join) {
53 $join->on('wc.view_id', '=', 'views.id');
54 })->whereBetween('views.viewed_at', $total_period_array)->whereBetween('sessions.created_at', $total_period_array)->where(function (Builder $query) use($total_period_array) {
55 $query->whereNull('sessions.ended_at')->orWhereBetween('sessions.ended_at', $total_period_array);
56 })->when(\count($this->filters) > 0, function (Builder $query) use($calculated_columns) {
57 foreach ($this->filters as $filter) {
58 if (\in_array($filter['column'], $calculated_columns)) {
59 continue;
60 }
61 $filter = new Filter($filter);
62 $method = $filter->method();
63 $query->{$method}($filter->column(), $filter->operator(), $filter->value());
64 }
65 })->groupBy('sessions.referrer_id')->having('views', '>', 0)->when(!$has_calculate_column_filter, function (Builder $query) {
66 $query->when($this->sort_configuration->is_nullable(), function (Builder $query) {
67 $query->orderByRaw("CASE WHEN {$this->sort_configuration->column()} IS NULL THEN 1 ELSE 0 END");
68 })->orderBy($this->sort_configuration->column(), $this->sort_configuration->direction())->orderBy('referrer')->when(\is_int($this->number_of_rows), function (Builder $query) {
69 $query->limit($this->number_of_rows);
70 });
71 });
72 $outer_query = Illuminate_Builder::get_builder();
73 $outer_query->selectRaw('referrers.*')->selectRaw('IF(sessions = 0, 0, views / sessions) AS views_per_session')->selectRaw('IFNULL((views - previous_period_views) / previous_period_views * 100, 0) AS views_growth')->selectRaw('IFNULL((visitors - previous_period_visitors) / previous_period_visitors * 100, 0) AS visitors_growth')->selectRaw('IFNULL(bounces / sessions * 100, 0) AS bounce_rate')->selectRaw('ROUND(CAST(wc_gross_sales - wc_refunded_amount AS DECIMAL(10, 2))) AS wc_net_sales')->selectRaw('IF(visitors = 0, 0, (wc_orders / visitors) * 100) AS wc_conversion_rate')->selectRaw('IF(visitors = 0, 0, (wc_gross_sales - wc_refunded_amount) / visitors) AS wc_earnings_per_visitor')->selectRaw('IF(wc_orders = 0, 0, ROUND(CAST(wc_gross_sales / wc_orders AS DECIMAL(10, 2)))) AS wc_average_order_volume')->when(\count($this->filters) > 0, function (Builder $query) use($calculated_columns) {
74 foreach ($this->filters as $filter) {
75 if (!\in_array($filter['column'], $calculated_columns)) {
76 continue;
77 }
78 $filter = new Filter($filter);
79 $method = $filter->method();
80 $query->{$method}($filter->column(), $filter->operator(), $filter->value());
81 }
82 })->fromSub($referrers_query, 'referrers')->when($has_calculate_column_filter, function (Builder $query) {
83 $query->when($this->sort_configuration->is_nullable(), function (Builder $query) {
84 $query->orderByRaw("CASE WHEN {$this->sort_configuration->column()} IS NULL THEN 1 ELSE 0 END");
85 })->orderBy($this->sort_configuration->column(), $this->sort_configuration->direction())->orderBy('referrer')->when(\is_int($this->number_of_rows), function (Builder $query) {
86 $query->limit($this->number_of_rows);
87 });
88 });
89 return $outer_query;
90 }
91 }
92