PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.13.5
Independent Analytics – WordPress Analytics Plugin v2.13.5
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 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 / Admin_Page / Analytics_Page.php
independent-analytics / IAWP / Admin_Page Last commit date
Admin_Page.php 1 year ago Analytics_Page.php 10 months ago Campaign_Builder_Page.php 2 years ago Click_Tracking_Page.php 1 year ago Debug_Page.php 1 year ago Integrations_Pages.php 1 year ago Settings_Page.php 2 years ago Support_Page.php 1 year ago Updates_Page.php 2 years ago
Analytics_Page.php
241 lines
1 <?php
2
3 namespace IAWP\Admin_Page;
4
5 use IAWP\Capability_Manager;
6 use IAWP\Chart;
7 use IAWP\Dashboard_Options;
8 use IAWP\Database;
9 use IAWP\Env;
10 use IAWP\Examiner\Header;
11 use IAWP\Map;
12 use IAWP\Map_Data;
13 use IAWP\Overview\Overview;
14 use IAWP\Plugin_Conflict_Detector;
15 use IAWP\Quick_Stats;
16 use IAWP\Real_Time;
17 use IAWP\Report;
18 use IAWP\Report_Finder;
19 use IAWP\Tables\Table;
20 use IAWP\Utils\Request;
21 use IAWP\Utils\Security;
22 use IAWPSCOPED\Illuminate\Support\Arr;
23 use IAWPSCOPED\Illuminate\Support\Collection;
24 /** @internal */
25 class Analytics_Page extends \IAWP\Admin_Page\Admin_Page
26 {
27 protected function render_page()
28 {
29 $options = Dashboard_Options::getInstance();
30 $date_rage = $options->get_date_range();
31 $tab = (new Env())->get_tab();
32 $report = Report_Finder::new()->fetch_current_report();
33 $is_showing_skeleton_ui = $report instanceof Report && $report->has_filters();
34 // Real-time is its own thing
35 if ($tab === 'real-time') {
36 $real_time = new Real_Time();
37 $real_time->render_real_time_analytics();
38 return;
39 }
40 // Overview is its own thing
41 if ($tab === 'overview') {
42 $overview = new Overview();
43 echo $overview->get_report_html();
44 $this->notices();
45 return;
46 }
47 $table_class = Env::get_table($tab);
48 $table = new $table_class($options->group());
49 $sort_configuration = $table->sanitize_sort_parameters($options->sort_column(), $options->sort_direction());
50 $hide_unfiltered_statistics = \false;
51 $rows = null;
52 $examiner_model = null;
53 if ($options->is_examiner()) {
54 $rows_class = $table->group()->rows_class();
55 $rows = new $rows_class($options->get_date_range(), $sort_configuration);
56 $id = Request::query_int('examiner');
57 $rows->limit_to($id);
58 $examiner_model = $rows->rows()[0];
59 $hide_unfiltered_statistics = \true;
60 }
61 $statistics_class = $table->group()->statistics_class();
62 $statistics = new $statistics_class($date_rage, $rows, $options->chart_interval());
63 $stats = new Quick_Stats($statistics, \false, $is_showing_skeleton_ui, $hide_unfiltered_statistics);
64 // Never show the map when loading the geo examiner. It'll only ever show a single country anyway.
65 if ($tab === 'geo' && !$options->is_examiner()) {
66 $table_data_class = $table->group()->rows_class();
67 $geo_data = new $table_data_class($date_rage, $table->sanitize_sort_parameters());
68 $map_data = new Map_Data($geo_data->rows());
69 $chart = new Map($map_data->get_country_data(), null, $is_showing_skeleton_ui);
70 } else {
71 $chart = new Chart($statistics, \false, $is_showing_skeleton_ui);
72 }
73 $this->interface($table, $stats, $chart, $examiner_model);
74 }
75 private function interface(Table $table, $stats, $chart, $examiner_model = null)
76 {
77 $options = Dashboard_Options::getInstance();
78 $sort_configuration = $table->sanitize_sort_parameters($options->sort_column(), $options->sort_direction());
79 $header = \IAWPSCOPED\iawp_blade()->run('partials.report-header', ['report' => Report_Finder::new()->fetch_current_report(), 'can_edit' => Capability_Manager::can_edit()]);
80 $examiner_tabs = '';
81 if ($examiner_model) {
82 $header = Header::html($table, $examiner_model);
83 $available_tabs = Collection::make($this->tables())->filter(function (array $table) use($examiner_model) {
84 return $table['table_type'] !== $examiner_model->table_type();
85 })->values()->all();
86 $current = Arr::first($available_tabs);
87 $examiner_tabs = \IAWPSCOPED\iawp_blade()->run('examiner.table-tabs', ['tables' => $available_tabs, 'active' => $current['table_type']]);
88 $table_class = Env::get_table($current['table_type']);
89 $table = new $table_class();
90 }
91 if ($options->is_examiner()) {
92 ?>
93 <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
94 <?php
95 }
96 ?>
97 <div data-controller="report"
98 data-report-is-examiner-value="<?php
99 echo $options->is_examiner() ? '1' : '0';
100 ?>"
101 data-report-name-value="<?php
102 echo Security::string($options->report_name());
103 ?>"
104 data-report-report-name-value="<?php
105 echo Security::string($table->group()->singular());
106 ?>"
107 data-report-relative-range-id-value="<?php
108 echo Security::attr($options->relative_range_id());
109 ?>"
110 data-report-exact-start-value="<?php
111 echo Security::attr($options->start());
112 ?>"
113 data-report-exact-end-value="<?php
114 echo Security::attr($options->end());
115 ?>"
116 data-report-group-value="<?php
117 echo Security::attr($table->group()->id());
118 ?>"
119 data-report-filters-value="<?php
120 echo \esc_attr(Security::json_encode($options->raw_filters()));
121 ?>"
122 data-report-filter-logic-value="<?php
123 echo Security::attr($options->filter_logic());
124 ?>"
125 data-report-chart-interval-value="<?php
126 echo Security::attr($options->chart_interval()->id());
127 ?>"
128 data-report-sort-column-value="<?php
129 echo Security::attr($sort_configuration->column());
130 ?>"
131 data-report-sort-direction-value="<?php
132 echo Security::attr($sort_configuration->direction());
133 ?>"
134 data-report-columns-value="<?php
135 echo \esc_attr(Security::json_encode($table->visible_column_ids()));
136 ?>"
137 data-report-quick-stats-value="<?php
138 echo \esc_attr(Security::json_encode($options->visible_quick_stats()));
139 ?>"
140 data-report-primary-chart-metric-id-value="<?php
141 echo \esc_attr($options->primary_chart_metric_id());
142 ?>"
143 data-report-secondary-chart-metric-id-value="<?php
144 echo \esc_attr($options->secondary_chart_metric_id());
145 ?>"
146 >
147 <div id="report-header-container" class="report-header-container">
148 <?php
149 echo $header;
150 ?>
151 <?php
152 $table->output_report_toolbar();
153 ?>
154 <div class="modal-background"></div>
155 </div>
156 <?php
157 echo $stats->get_html();
158 ?>
159 <?php
160 echo $chart->get_html();
161 ?>
162 <?php
163 echo $examiner_tabs;
164 ?>
165 <?php
166 echo $table->get_table_toolbar_markup();
167 ?>
168 <?php
169 echo $table->get_table_markup($sort_configuration->column(), $sort_configuration->direction());
170 ?>
171 </div>
172 <?php
173 if (!$options->is_examiner()) {
174 ?>
175 <div id="iawp-examiner-modal" aria-hidden="true" class="mm micromodal-slide" data-controller="examiner">
176 <div tabindex="-1" class="mm__overlay mm__overlay--full-screen" data-action="click->examiner#close:self" >
177 <div role="dialog" aria-modal="true" class="mm__container examiner examiner--loading">
178 <div data-examiner-target="content" class="examiner-content"></div>
179 <?php
180 echo \IAWPSCOPED\iawp_blade()->run('examiner.skeleton');
181 ?>
182 </div>
183 </div>
184 </div>
185 <?php
186 }
187 ?>
188 <?php
189 if (Env::get_tab() === 'geo') {
190 echo '<div class="geo-ip-attribution">';
191 echo \esc_html_x('Geolocation data powered by', 'Following text is a noun: DB-IP', 'independent-analytics') . ' ' . '<a href="https://db-ip.com" target="_blank">DB-IP</a>.';
192 echo '</div>';
193 }
194 $this->notices();
195 }
196 private function notices()
197 {
198 $plugin_conflict_detector = new Plugin_Conflict_Detector();
199 $requires_logged_in_tracking = $plugin_conflict_detector->plugin_requiring_logged_in_tracking();
200 $show_logged_in_tracking_notice = $requires_logged_in_tracking && !\get_option('iawp_track_authenticated_users') && !\get_option('iawp_need_clear_cache') && !\get_option('iawp_logged_in_tracking_notice');
201 ?><div class="iawp-notices"><?php
202 if (Capability_Manager::can_edit()) {
203 if ($plugin_conflict_detector->has_conflict()) {
204 echo \IAWPSCOPED\iawp_blade()->run('notices.notice', ['notice_text' => $plugin_conflict_detector->get_error(), 'button_text' => \false, 'id' => 'plugin-conflict', 'notice' => 'iawp-error', 'plugin' => $plugin_conflict_detector->get_plugin(), 'url' => 'https://independentwp.com/knowledgebase/tracking/secure-rest-api/']);
205 } elseif (\IAWPSCOPED\iawp_is_pro() && \is_plugin_active('better-wp-security/better-wp-security.php')) {
206 $settings = \get_option('itsec-storage');
207 if (\array_key_exists('system-tweaks', $settings)) {
208 if (\array_key_exists('plugins_php', $settings['system-tweaks'])) {
209 if ($settings['system-tweaks']['plugins_php']) {
210 echo \IAWPSCOPED\iawp_blade()->run('notices.notice', ['notice_text' => \__('The "Solid Security" plugin is disabling PHP execution in the plugins folder, and this is preventing click tracking from working. Please visit the Security > Settings page, click on the Advanced section, click on System Tweaks Settings, uncheck the "Disable PHP Plugins" option, and then save.', 'independent-analytics'), 'button_text' => \false, 'id' => 'plugin-conflict', 'notice' => 'iawp-error', 'url' => 'https://independentwp.com/knowledgebase/click-tracking/allow-php-execution-plugins-folder/']);
211 }
212 }
213 }
214 }
215 if (\get_option('iawp_need_clear_cache')) {
216 echo \IAWPSCOPED\iawp_blade()->run('notices.notice', ['notice_text' => \__('Please clear your cache to ensure tracking works properly.', 'independent-analytics'), 'button_text' => \__('I\'ve cleared the cache', 'independent-analytics'), 'id' => 'iawp_need_clear_cache', 'notice' => 'iawp-warning', 'url' => 'https://independentwp.com/knowledgebase/common-questions/views-not-recording/']);
217 }
218 if ($show_logged_in_tracking_notice) {
219 echo \IAWPSCOPED\iawp_blade()->run('notices.notice', ['notice_text' => '<strong>' . \sprintf(\_x('%s compatibility:', 'Variable is the name of a plugin', 'independent-analytics'), $requires_logged_in_tracking) . '</strong> ' . \__('We recommend you enable tracking for logged-in visitors.', 'independent-analytics'), 'button_text' => \__('Dismiss', 'independent-analytics'), 'id' => 'enable-logged-in-tracking', 'notice' => 'iawp-warning', 'url' => 'https://independentwp.com/knowledgebase/tracking/how-to-track-logged-in-visitors/']);
220 }
221 if (\IAWPSCOPED\iawp_db_version() > 0 && !Database::has_correct_database_privileges()) {
222 echo \IAWPSCOPED\iawp_blade()->run('notices.notice', ['notice_text' => \__('Your site is missing the following critical database permissions:', 'independent-analytics') . ' ' . \implode(', ', Database::missing_database_privileges()) . '. ' . \__('There is no issue at this time, but you will need to enable the missing permissions before updating the plugin to a newer version to ensure an error is avoided. Please click this link to read our tutorial:', 'independent-analytics'), 'button_text' => \false, 'id' => 'missing-permissions', 'notice' => 'iawp-error', 'url' => 'https://independentwp.com/knowledgebase/common-questions/missing-database-permissions/']);
223 }
224 if (Env::get_tab() === 'clicks') {
225 if (!\get_option('iawp_clicks_sync_notice')) {
226 echo \IAWPSCOPED\iawp_blade()->run('notices.notice', ['notice_text' => \__('Click data syncs every 60 seconds. Please allow for this delay when testing clicks on new links.', 'independent-analytics'), 'button_text' => \__('Dismiss', 'independent-analytics'), 'id' => 'iawp_clicks_sync_notice', 'notice' => 'iawp-warning', 'url' => 'https://independentwp.com/knowledgebase/click-tracking/click-tracking-update-process/']);
227 }
228 }
229 }
230 ?>
231 </div><?php
232 if (\get_option('iawp_show_gsg') === '1' && !\get_option('iawp_need_clear_cache') && !$show_logged_in_tracking_notice && !$plugin_conflict_detector->has_conflict() && (Env::get_tab() !== 'clicks' || Env::get_tab() === 'clicks' && \get_option('iawp_clicks_sync_notice'))) {
233 echo \IAWPSCOPED\iawp_blade()->run('notices.getting-started');
234 }
235 }
236 private function tables() : array
237 {
238 return [['table_type' => 'views', 'name' => \__('Pages', 'independent-analytics')], ['table_type' => 'referrers', 'name' => \__('Referrers', 'independent-analytics')], ['table_type' => 'geo', 'name' => \__('Geographic', 'independent-analytics')], ['table_type' => 'devices', 'name' => \__('Devices', 'independent-analytics')], ['table_type' => 'campaigns', 'name' => \__('Campaigns', 'independent-analytics')], ['table_type' => 'clicks', 'name' => \__('Clicks', 'independent-analytics')]];
239 }
240 }
241