PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.5.0
Independent Analytics – WordPress Analytics Plugin v2.5.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 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-bootstrap.php
independent-analytics Last commit date
IAWP 2 years ago dist 2 years ago freemius 2 years ago img 2 years ago javascript-source 2 years ago javascript-unminified 2 years ago languages 2 years ago vendor 2 years ago views 2 years ago iawp-bootstrap.php 2 years ago iawp.php 2 years ago readme.txt 2 years ago
iawp-bootstrap.php
323 lines
1 <?php
2
3 namespace IAWPSCOPED;
4
5 use IAWP\Custom_WordPress_Columns\Views_Column;
6 use IAWP\Dashboard_Options;
7 use IAWP\Database;
8 use IAWP\Date_Range\Exact_Date_Range;
9 use IAWP\Env;
10 use IAWP\Form;
11 use IAWP\Geo_Database_Background_Job;
12 use IAWP\Independent_Analytics;
13 use IAWP\Interrupt;
14 use IAWP\Migrations;
15 use IAWP\Public_API\Analytics;
16 use IAWP\Public_API\Singular_Analytics;
17 use IAWP\Utils\BladeOne;
18 use IAWP\WP_Option_Cache_Bust;
19 \define( 'IAWP_DIRECTORY', \rtrim( \plugin_dir_path( __FILE__ ), \DIRECTORY_SEPARATOR ) );
20 \define( 'IAWP_URL', \rtrim( \plugin_dir_url( __FILE__ ), '/' ) );
21 \define( 'IAWP_VERSION', '2.5.0' );
22 \define( 'IAWP_DATABASE_VERSION', '32' );
23 \define( 'IAWP_LANGUAGES_DIRECTORY', \dirname( \plugin_basename( __FILE__ ) ) . '/languages' );
24 \define( 'IAWP_PLUGIN_FILE', __DIR__ . '/iawp.php' );
25 if ( \file_exists( \IAWPSCOPED\iawp_path_to( 'vendor/scoper-autoload.php' ) ) ) {
26 require_once \IAWPSCOPED\iawp_path_to( 'vendor/scoper-autoload.php' );
27 } else {
28 require_once \IAWPSCOPED\iawp_path_to( 'vendor/autoload.php' );
29 }
30 // This is needed because something with age gate is preventing my own helpers from loading
31 // The problem is that in autoload_static.php, there's some sort of caching going on where it's trying
32 // to not load a file twice. I'm guessing that's normally a good thing, but in our case we've made changes (scoped)
33 // so we do indeed want to load our version even though age gate has alreawdy learned
34 require_once \IAWPSCOPED\iawp_path_to( 'vendor/illuminate/collections/helpers.php' );
35 /**
36 * @param $log
37 *
38 * @return void
39 * @internal
40 */
41 function iawp_log( $log ) : void {
42 if ( \WP_DEBUG === \true && \WP_DEBUG_LOG === \true ) {
43 if ( \is_array( $log ) || \is_object( $log ) ) {
44 \error_log( \print_r( $log, \true ) );
45 } else {
46 \error_log( $log );
47 }
48 }
49 }
50
51 /** @internal */
52 function iawp_path_to( string $path ) : string {
53 $path = \trim( $path, \DIRECTORY_SEPARATOR );
54 return \implode( \DIRECTORY_SEPARATOR, [\IAWP_DIRECTORY, $path] );
55 }
56
57 /**
58 * add_filter('iawp_temp_directory_path', function ($value) {
59 * return '/Users/andrew/site/wp-content/uploads/iawp';
60 * });
61 *
62 * @param string $path
63 *
64 * @return string
65 * @throws Exception
66 * @internal
67 */
68 function iawp_temp_path_to( string $path ) : string {
69 $temp_directory = ( \defined( 'IAWP_TEMP_DIR' ) ? \IAWP_TEMP_DIR : \apply_filters( 'iawp_temp_directory_path', 'temp' ) );
70 $path = \rtrim( $path, \DIRECTORY_SEPARATOR );
71 if ( $temp_directory === 'temp' ) {
72 return \IAWPSCOPED\iawp_path_to( \implode( \DIRECTORY_SEPARATOR, [$temp_directory, $path] ) );
73 }
74 $temp_directory = \rtrim( $temp_directory, \DIRECTORY_SEPARATOR );
75 if ( !\is_writable( $temp_directory ) ) {
76 \wp_mkdir_p( $temp_directory );
77 }
78 // Separate condition to see if wp_mkdir_p call fixed the issue
79 if ( !\is_writable( $temp_directory ) ) {
80 throw new \Exception('You have provided and missing or non-writable directory for the iawp_temp_directory_path filter: ' . $temp_directory);
81 }
82 return \implode( \DIRECTORY_SEPARATOR, [$temp_directory, $path] );
83 }
84
85 /** @internal */
86 function iawp_url_to( string $path ) : string {
87 $path = \trim( $path, '/' );
88 return \implode( '/', [\IAWP_URL, $path] );
89 }
90
91 /**
92 * @param string $path
93 * @param bool $prefer_parent_site_upload_path If it's a multisite installation, use the parent sites upload folder
94 * @return string
95 * @internal
96 */
97 function iawp_upload_path_to( string $path, bool $prefer_parent_site_upload_path = \false ) : string {
98 $path = \trim( $path, \DIRECTORY_SEPARATOR );
99 $upload_directory = \wp_upload_dir()['basedir'];
100 if ( $prefer_parent_site_upload_path && \is_multisite() ) {
101 $site = \get_site();
102 if ( $site !== null ) {
103 \switch_to_blog( \intval( $site->site_id ) );
104 $upload_directory = \wp_upload_dir()['basedir'];
105 \restore_current_blog();
106 }
107 }
108 return \implode( \DIRECTORY_SEPARATOR, [$upload_directory, $path] );
109 }
110
111 /**
112 * Determines if the user is running a licensed pro version
113 *
114 * @return bool
115 * @internal
116 */
117 function iawp_is_pro() : bool {
118 return \false;
119 }
120
121 /**
122 * Determines if the user is running a free version or an unlicensed pro version
123 * @return bool
124 * @internal
125 */
126 function iawp_is_free() : bool {
127 return !\IAWPSCOPED\iawp_is_pro();
128 }
129
130 /**
131 * Determines if a pro user has WooCommerce activated
132 * @return bool
133 * @internal
134 */
135 function iawp_using_woocommerce() : bool {
136 global $wpdb;
137 if ( \IAWPSCOPED\iawp_is_free() ) {
138 return \false;
139 }
140 $class_missing = \class_exists( '\\WooCommerce' ) === \false;
141 if ( $class_missing ) {
142 return \false;
143 }
144 $table_name = $wpdb->prefix . 'wc_order_stats';
145 $order_stats_table = $wpdb->get_row( $wpdb->prepare( '
146 SELECT * FROM INFORMATION_SCHEMA.TABLES
147 WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
148 ', $wpdb->dbname, $table_name ) );
149 if ( \is_null( $order_stats_table ) ) {
150 return \false;
151 }
152 return \true;
153 }
154
155 /** @internal */
156 function iawp_using_a_form_plugin() : bool {
157 if ( \IAWPSCOPED\iawp_is_free() ) {
158 return \false;
159 }
160 return Form::has_any_active_form_plugins();
161 }
162
163 /** @internal */
164 function iawp_dashboard_url( array $query_arguments = [] ) : string {
165 $default_query_arguments = [
166 'page' => 'independent-analytics',
167 ];
168 return \add_query_arg( \array_merge( $default_query_arguments, $query_arguments ), \admin_url( 'admin.php' ) );
169 }
170
171 /** @internal */
172 function iawp_blade() {
173 if ( !\file_exists( \IAWPSCOPED\iawp_temp_path_to( 'template-cache' ) ) ) {
174 \wp_mkdir_p( \IAWPSCOPED\iawp_temp_path_to( 'template-cache' ) );
175 }
176 $blade = BladeOne::create();
177 $blade->share( 'env', new Env() );
178 return $blade;
179 }
180
181 /** @internal */
182 function iawp_icon( string $icon ) : string {
183 try {
184 return \IAWPSCOPED\iawp_blade()->run( 'icons.plugins.' . $icon );
185 } catch ( \Throwable $e ) {
186 return '';
187 }
188 }
189
190 /**
191 * Get the currently installed database version
192 *
193 * @return int
194 * @internal
195 */
196 function iawp_db_version() : int {
197 return \intval( \get_option( 'iawp_db_version', '0' ) );
198 }
199
200 /**
201 * iawp_singular_analytics('60', new DateTime('-3 days'), new DateTime());
202 *
203 * @param string|int $singular_id
204 * @param DateTime $from
205 * @param DateTime $to
206 *
207 * @return Singular_Analytics|null
208 * @internal
209 */
210 function iawp_singular_analytics( $singular_id, \DateTime $from, \DateTime $to ) : ?Singular_Analytics {
211 $date_range = new Exact_Date_Range($from, $to);
212 return Singular_Analytics::for( $singular_id, $date_range );
213 }
214
215 /**
216 * iawp_analytics(new DateTime('-3 days'), new DateTime());
217 *
218 * @param DateTime $from
219 * @param DateTime $to
220 *
221 * @return Analytics
222 * @internal
223 */
224 function iawp_analytics( \DateTime $from, \DateTime $to ) : Analytics {
225 $date_range = new Exact_Date_Range($from, $to);
226 return Analytics::for( $date_range );
227 }
228
229 if ( !\extension_loaded( 'pdo' ) || !\extension_loaded( 'pdo_mysql' ) ) {
230 $interrupt = new Interrupt('interrupt.pdo');
231 $interrupt->render();
232 return;
233 }
234 global $wpdb;
235 if ( \strlen( $wpdb->prefix ) > 25 ) {
236 $interrupt = new Interrupt('interrupt.database-prefix-too-long');
237 $interrupt->render( [
238 'prefix' => $wpdb->prefix,
239 'length' => \strlen( $wpdb->prefix ),
240 ] );
241 return;
242 }
243 if ( Migrations\Migrations::is_database_ahead_of_plugin() ) {
244 $interrupt = new Interrupt('interrupt.database-ahead-of-plugin');
245 $interrupt->render();
246 return;
247 }
248 if ( \IAWPSCOPED\iawp_db_version() === 0 && !Database::has_correct_database_privileges() ) {
249 $interrupt = new Interrupt('interrupt.missing-database-permissions');
250 $interrupt->render( [
251 'missing_privileges' => Database::missing_database_privileges(),
252 ] );
253 return;
254 }
255 if ( \get_option( 'iawp_missing_tables' ) === '1' ) {
256 if ( \IAWPSCOPED\iawp_db_version() === 0 ) {
257 \delete_option( 'iawp_missing_tables' );
258 } else {
259 $interrupt = new Interrupt('interrupt.missing-database-tables');
260 $interrupt->render();
261 return;
262 }
263 }
264 // These can be updated in background jobs. Always get the actual value from the database.
265 WP_Option_Cache_Bust::register( 'iawp_is_migrating' );
266 WP_Option_Cache_Bust::register( 'iawp_is_database_downloading' );
267 WP_Option_Cache_Bust::register( 'iawp_db_version' );
268 WP_Option_Cache_Bust::register( 'iawp_geo_database_version' );
269 /** @internal */
270 function iawp() {
271 return Independent_Analytics::getInstance();
272 }
273
274 \IAWPSCOPED\iawp();
275 \register_activation_hook( \IAWP_PLUGIN_FILE, function () {
276 \wp_mkdir_p( \IAWPSCOPED\iawp_temp_path_to( 'template-cache' ) );
277 if ( \IAWPSCOPED\iawp_db_version() === 0 ) {
278 // If there is no database installed, run migration on current process
279 Migrations\Migrations::create_or_migrate();
280 } else {
281 // If there is a database, run migration in a background process
282 Migrations\Migration_Job::maybe_dispatch();
283 }
284 Geo_Database_Background_Job::maybe_dispatch();
285 \update_option( 'iawp_need_clear_cache', \true );
286 \IAWPSCOPED\iawp()->cron_manager->schedule_refresh_salt();
287 if ( \IAWPSCOPED\iawp_is_pro() ) {
288 \IAWPSCOPED\iawp()->email_reports->schedule_email_report();
289 }
290 // Set current version for changelog notifications
291 \update_option( 'iawp_last_update_viewed', \IAWP_VERSION );
292 if ( \IAWPSCOPED\iawp_db_version() > 0 && Database::is_missing_all_tables() ) {
293 \update_option( 'iawp_missing_tables', '1' );
294 }
295 } );
296 \register_deactivation_hook( \IAWP_PLUGIN_FILE, function () {
297 \IAWPSCOPED\iawp()->cron_manager->unschedule_daily_salt_refresh();
298 if ( \IAWPSCOPED\iawp_is_pro() ) {
299 \IAWPSCOPED\iawp()->email_reports->unschedule_email_report();
300 }
301 \wp_delete_file( \trailingslashit( \WPMU_PLUGIN_DIR ) . 'iawp-performance-boost.php' );
302 \delete_option( 'iawp_must_use_directory_not_writable' );
303 } );
304 /*
305 * The admin_init hook will fire when the dashboard is loaded or an admin ajax request is made
306 */
307 \add_action( 'admin_init', function () {
308 Migrations\Migrations::handle_migration_18_error();
309 Migrations\Migrations::handle_migration_22_error();
310 Migrations\Migrations::handle_migration_29_error();
311 $options = Dashboard_Options::getInstance();
312 $options->maybe_redirect();
313 new Migrations\Migration_Job();
314 if ( \get_option( 'iawp_db_version', '0' ) === '0' ) {
315 // If there is no database installed, run migration on current process
316 Migrations\Migrations::create_or_migrate();
317 } else {
318 // If there is a database, run migration in a background process
319 Migrations\Migration_Job::maybe_dispatch();
320 }
321 Geo_Database_Background_Job::maybe_dispatch();
322 } );
323 Views_Column::initialize();