PluginProbe
Independent Analytics – WordPress Analytics Plugin / 2.7.1
Independent Analytics – WordPress Analytics Plugin v2.7.1
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
92 lines 7.5 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\Capability_Manager;
6 use IAWP\Form_Submissions\Form;
7 use IAWP\Illuminate_Builder;
8 use IAWP\Models\Referrer;
9 use IAWP\Query;
10 use IAWP\Query_Taps;
11 use IAWP\WooCommerce_Order;
12 use IAWPSCOPED\Illuminate\Database\Query\Builder;
13 use IAWPSCOPED\Illuminate\Database\Query\JoinClause;
14 /** @internal */
15 class Referrers extends \IAWP\Rows\Rows
16 {
17 public function attach_filters(Builder $query) : void
18 {
19 $query->joinSub($this->query(\true), 'referrer_rows', function (JoinClause $join) {
20 $join->on('referrer_rows.referrer_id', '=', 'sessions.referrer_id');
21 });
22 }
23 protected function fetch_rows() : array
24 {
25 $rows = $this->query()->get()->all();
26 return \array_map(function ($row) {
27 return new Referrer($row);
28 }, $rows);
29 }
30 private function query(?bool $skip_pagination = \false) : Builder
31 {
32 if ($skip_pagination) {
33 $this->number_of_rows = null;
34 }
35 $views_table = Query::get_table_name(Query::VIEWS);
36 $sessions_table = Query::get_table_name(Query::SESSIONS);
37 $wc_orders_table = Query::get_table_name(Query::WC_ORDERS);
38 $referrers_table = Query::get_table_name(Query::REFERRERS);
39 $woo_commerce_query = Illuminate_Builder::get_builder();
40 $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');
41 $referrers_query = Illuminate_Builder::get_builder();
42 $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) {
43 foreach (Form::get_forms() as $form) {
44 $query->selectRaw("SUM(IF(form_submissions.form_id = ?, form_submissions.form_submissions, 0)) AS {$form->submissions_column()}", [$form->id()]);
45 }
46 })->from($views_table, 'views')->leftJoin($referrers_query->raw($sessions_table . ' AS sessions'), function (JoinClause $join) {
47 $join->on('views.session_id', '=', 'sessions.session_id');
48 })->leftJoin($referrers_query->raw($referrers_table . ' AS referrers'), function (JoinClause $join) {
49 $join->on('sessions.referrer_id', '=', 'referrers.id');
50 })->leftJoinSub($woo_commerce_query, 'wc', function (JoinClause $join) {
51 $join->on('wc.view_id', '=', 'views.id');
52 })->leftJoinSub($this->get_form_submissions_query(), 'form_submissions', function (JoinClause $join) {
53 $join->on('form_submissions.view_id', '=', 'views.id');
54 })->whereBetween('views.viewed_at', $this->get_current_period_iso_range())->when(!$this->appears_to_be_for_real_time_analytics(), function (Builder $query) {
55 $query->whereBetween('sessions.created_at', $this->get_current_period_iso_range());
56 })->tap(Query_Taps::tap_authored_content_check())->when(\count($this->filters) > 0, function (Builder $query) {
57 foreach ($this->filters as $filter) {
58 if (!$this->is_a_calculated_column($filter->column())) {
59 $filter->apply_to_query($query);
60 }
61 }
62 })->groupBy('sessions.referrer_id')->having('views', '>', 0)->when(!$this->is_using_a_calculated_column(), function (Builder $query) {
63 $query->when($this->sort_configuration->is_column_nullable(), function (Builder $query) {
64 $query->orderByRaw("CASE WHEN {$this->sort_configuration->column()} IS NULL THEN 1 ELSE 0 END");
65 })->orderBy($this->sort_configuration->column(), $this->sort_configuration->direction())->orderBy('referrer')->when(\is_int($this->number_of_rows), function (Builder $query) {
66 $query->limit($this->number_of_rows);
67 });
68 });
69 $previous_period_query = Illuminate_Builder::get_builder();
70 $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');
71 $outer_query = Illuminate_Builder::get_builder();
72 $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) {
73 foreach (Form::get_forms() as $form) {
74 $query->selectRaw("IF(visitors = 0, 0, ({$form->submissions_column()} / visitors) * 100) AS {$form->conversion_rate_column()}");
75 }
76 })->when(\count($this->filters) > 0, function (Builder $query) {
77 foreach ($this->filters as $filter) {
78 if ($this->is_a_calculated_column($filter->column())) {
79 $filter->apply_to_query($query);
80 }
81 }
82 })->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) {
83 $query->when($this->sort_configuration->is_column_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