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