PluginProbe
Independent Analytics – WordPress Analytics Plugin / 2.6.0
Independent Analytics – WordPress Analytics Plugin v2.6.0
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 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 All 120 releases
independent-analytics / IAWP / Rows / Referrers.php
Referrers.php
88 lines 7.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace IAWP\Rows;
4
5 use IAWP\Form_Submissions\Form;
6 use IAWP\Illuminate_Builder;
7 use IAWP\Models\Referrer;
8 use IAWP\Query;
9 use IAWP\WooCommerce_Order;
10 use IAWPSCOPED\Illuminate\Database\Query\Builder;
11 use IAWPSCOPED\Illuminate\Database\Query\JoinClause;
12 /** @internal */
13 class Referrers extends \IAWP\Rows\Rows
14 {
15 public function attach_filters(Builder $query) : void
16 {
17 $query->joinSub($this->query(\true), 'referrer_rows', function (JoinClause $join) {
18 $join->on('referrer_rows.referrer_id', '=', 'sessions.referrer_id');
19 });
20 }
21 protected function fetch_rows() : array
22 {
23 $rows = $this->query()->get()->all();
24 return \array_map(function ($row) {
25 return new Referrer($row);
26 }, $rows);
27 }
28 private function query(?bool $skip_pagination = \false) : Builder
29 {
30 if ($skip_pagination) {
31 $this->number_of_rows = null;
32 }
33 $views_table = Query::get_table_name(Query::VIEWS);
34 $sessions_table = Query::get_table_name(Query::SESSIONS);
35 $wc_orders_table = Query::get_table_name(Query::WC_ORDERS);
36 $referrers_table = Query::get_table_name(Query::REFERRERS);
37 $woo_commerce_query = Illuminate_Builder::get_builder();
38 $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_table, 'wc_orders')->whereIn('wc_orders.status', WooCommerce_Order::tracked_order_statuses())->whereBetween('wc_orders.created_at', $this->get_current_period_iso_range())->groupBy('wc_orders.view_id');
39 $referrers_query = Illuminate_Builder::get_builder();
40 $referrers_query->select('sessions.referrer_id', 'referrer', 'type AS referrer_type', 'domain')->selectRaw('COUNT(DISTINCT views.id) AS views')->selectRaw('COUNT(DISTINCT sessions.visitor_id) AS visitors')->selectRaw('COUNT(DISTINCT sessions.session_id) AS sessions')->selectRaw('ROUND(AVG( TIMESTAMPDIFF(SECOND, sessions.created_at, sessions.ended_at))) AS average_session_duration')->selectRaw('COUNT(DISTINCT IF(sessions.final_view_id IS NULL, sessions.session_id, NULL)) AS bounces')->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')->selectRaw('IFNULL(SUM(form_submissions.form_submissions), 0) AS form_submissions')->tap(function (Builder $query) {
41 foreach (Form::get_forms() as $form) {
42 $query->selectRaw("SUM(IF(form_submissions.form_id = ?, form_submissions.form_submissions, 0)) AS {$form->submissions_column()}", [$form->id()]);
43 }
44 })->from($views_table, 'views')->leftJoin($referrers_query->raw($sessions_table . ' AS sessions'), function (JoinClause $join) {
45 $join->on('views.session_id', '=', 'sessions.session_id');
46 })->leftJoin($referrers_query->raw($referrers_table . ' AS referrers'), function (JoinClause $join) {
47 $join->on('sessions.referrer_id', '=', 'referrers.id');
48 })->leftJoinSub($woo_commerce_query, 'wc', function (JoinClause $join) {
49 $join->on('wc.view_id', '=', 'views.id');
50 })->leftJoinSub($this->get_form_submissions_query(), 'form_submissions', function (JoinClause $join) {
51 $join->on('form_submissions.view_id', '=', 'views.id');
52 })->whereBetween('views.viewed_at', $this->get_current_period_iso_range())->whereBetween('sessions.created_at', $this->get_current_period_iso_range())->when(\count($this->filters) > 0, function (Builder $query) {
53 foreach ($this->filters as $filter) {
54 if (!$this->is_a_calculated_column($filter->column())) {
55 $filter->apply_to_query($query);
56 }
57 }
58 })->groupBy('sessions.referrer_id')->having('views', '>', 0)->when(!$this->is_using_a_calculated_column(), function (Builder $query) {
59 $query->when($this->sort_configuration->is_column_nullable(), function (Builder $query) {
60 $query->orderByRaw("CASE WHEN {$this->sort_configuration->column()} IS NULL THEN 1 ELSE 0 END");
61 })->orderBy($this->sort_configuration->column(), $this->sort_configuration->direction())->orderBy('referrer')->when(\is_int($this->number_of_rows), function (Builder $query) {
62 $query->limit($this->number_of_rows);
63 });
64 });
65 $previous_period_query = Illuminate_Builder::get_builder();
66 $previous_period_query->select(['sessions.referrer_id'])->selectRaw('SUM(sessions.total_views) AS previous_period_views')->selectRaw('COUNT(DISTINCT sessions.visitor_id) AS previous_period_visitors')->from($sessions_table, 'sessions')->whereBetween('sessions.created_at', $this->get_previous_period_iso_range())->groupBy('sessions.referrer_id');
67 $outer_query = Illuminate_Builder::get_builder();
68 $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')->selectRaw('IF(visitors = 0, 0, (form_submissions / visitors) * 100) AS form_conversion_rate')->tap(function (Builder $query) {
69 foreach (Form::get_forms() as $form) {
70 $query->selectRaw("IF(visitors = 0, 0, ({$form->submissions_column()} / visitors) * 100) AS {$form->conversion_rate_column()}");
71 }
72 })->when(\count($this->filters) > 0, function (Builder $query) {
73 foreach ($this->filters as $filter) {
74 if ($this->is_a_calculated_column($filter->column())) {
75 $filter->apply_to_query($query);
76 }
77 }
78 })->fromSub($referrers_query, 'referrers')->leftJoinSub($previous_period_query, 'previous_period_stats', 'referrers.referrer_id', '=', 'previous_period_stats.referrer_id')->when($this->is_using_a_calculated_column(), function (Builder $query) {
79 $query->when($this->sort_configuration->is_column_nullable(), function (Builder $query) {
80 $query->orderByRaw("CASE WHEN {$this->sort_configuration->column()} IS NULL THEN 1 ELSE 0 END");
81 })->orderBy($this->sort_configuration->column(), $this->sort_configuration->direction())->orderBy('referrer')->when(\is_int($this->number_of_rows), function (Builder $query) {
82 $query->limit($this->number_of_rows);
83 });
84 });
85 return $outer_query;
86 }
87 }
88