PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 1.1.2
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v1.1.2
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / bootstrap.php
matomo / app Last commit date
config 6 years ago core 6 years ago js 6 years ago lang 6 years ago libs 6 years ago plugins 6 years ago vendor 6 years ago .htaccess 6 years ago LEGALNOTICE 6 years ago LICENSE 6 years ago PRIVACY.md 6 years ago README.md 6 years ago SECURITY.md 6 years ago bootstrap.php 6 years ago console 6 years ago favicon.ico 6 years ago index.php 6 years ago matomo.js 6 years ago matomo.php 6 years ago piwik.js 6 years ago piwik.php 6 years ago robots.txt 6 years ago
bootstrap.php
224 lines
1 <?php
2
3 $GLOBALS['CONFIG_INI_PATH_RESOLVER'] = function () {
4 if ( defined( 'ABSPATH' )
5 && defined( 'MATOMO_CONFIG_PATH' ) ) {
6 $paths = new \WpMatomo\Paths();
7
8 return $paths->get_config_ini_path();
9 }
10 };
11
12 $matomo_is_archive_request = !empty($_SERVER['argv'])
13 && is_array($_SERVER['argv'])
14 && in_array('climulti:request', $_SERVER['argv'], true);
15
16 if ( ! defined( 'PIWIK_ENABLE_ERROR_HANDLER' ) ) {
17 // we prefer using WP error handler... unless we are archiving where we want to prevent any warnings being printed
18 // as otherwise the archiving would be marked as failed because the cli archive output would contain a warning and
19 // the output would not be possible to do an unserialize anymore
20 if (!$matomo_is_archive_request) {
21 define( 'PIWIK_ENABLE_ERROR_HANDLER', false );
22 }
23 }
24
25 $GLOBALS['MATOMO_LOADED_DIRECTLY'] = ! defined( 'ABSPATH' );
26
27 if (!function_exists('matomo_log_message_no_display')) {
28 function matomo_log_message_no_display($message)
29 {
30 $message = 'Matomo ' . $message;
31
32 if ( defined( 'WP_DEBUG' ) && WP_DEBUG === true ) {
33 if (function_exists('ini_set') && function_exists('ini_get')) {
34 $value_orig = @ini_get('display_errors');
35 $value = @ini_set('display_errors', 'Off');
36 if (false !== $value) {
37 error_log( $message );
38 }
39 @ini_set('display_errors', $value_orig);
40 }
41 }
42
43 if (function_exists('update_option')
44 && class_exists('\WpMatomo\Logger')) {
45 // only if WordPress was bootstrapped by now... otherwise it will fail
46 try {
47 $logger = new \WpMatomo\Logger();
48 $logger->log_exception('archive_boot', new Exception($message));
49 } catch (Exception $e) {
50
51 }
52 }
53 }
54 }
55
56 if ( $GLOBALS['MATOMO_LOADED_DIRECTLY'] ) {
57
58 // prevent from loading twice
59 $matomo_wpload_base = '../../../../wp-load.php';
60 $matomo_wpload_full = dirname( __FILE__ ) . '/' . $matomo_wpload_base;
61
62 if ($matomo_is_archive_request) {
63 ob_start();
64 // the matomo error handler will be only loaded after WordPress has been loaded... here we want to prevent
65 // any warning/notice from being shown while bootstrapping WordPress or otherwise the unserialize of the response
66 // later in climulti will fail
67 set_error_handler(function ($errno, $errstr, $errfile, $errline) {
68 // if the error has been suppressed by the @ we don't handle the error
69 if (error_reporting() == 0) {
70 return;
71 }
72
73 if (in_array($errno, array(E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, E_USER_ERROR))) {
74 return false; //force standard behaviour
75 }
76
77 matomo_log_message_no_display( sprintf('error: %s: %s in %s:%s', $errno, $errstr, $errfile, $errline ) );
78 });
79 }
80
81 if (!empty($_SERVER['MATOMO_WP_ROOT_PATH']) && file_exists( rtrim($_SERVER['MATOMO_WP_ROOT_PATH'], '/') . '/wp-load.php')) {
82 require_once rtrim($_SERVER['MATOMO_WP_ROOT_PATH'], '/') . '/wp-load.php';
83 } elseif ( file_exists($matomo_wpload_full ) ) {
84 require_once $matomo_wpload_full;
85 } elseif (realpath( $matomo_wpload_full ) && file_exists(realpath( $matomo_wpload_full ))) {
86 require_once realpath( $matomo_wpload_full );
87 } elseif (!empty($_SERVER['SCRIPT_FILENAME']) && file_exists($_SERVER['SCRIPT_FILENAME'])) {
88 // seems symlinked... eg the wp-content dir or wp-content/plugins dir is symlinked from some very much other place...
89 $matomo_wpload_full = dirname($_SERVER['SCRIPT_FILENAME']) . '/' . $matomo_wpload_base;
90 if ( file_exists($matomo_wpload_full ) ) {
91 require_once $matomo_wpload_full;
92 } elseif (realpath( $matomo_wpload_full ) && file_exists(realpath( $matomo_wpload_full ))) {
93 require_once realpath( $matomo_wpload_full );
94 } elseif (file_exists(dirname(dirname(dirname(dirname(dirname( $_SERVER['SCRIPT_FILENAME'] ))))) . '/wp-load.php')) {
95 require_once dirname(dirname(dirname(dirname(dirname( $_SERVER['SCRIPT_FILENAME'] ))))) . '/wp-load.php';
96 }
97 }
98
99 if (!defined( 'ABSPATH')) {
100 // still not loaded... look in plugins directory if there is a config file for us.
101 $matomo_wpload_config = dirname(__FILE__) . '/../../matomo.wpload_dir.php';
102 if (file_exists( $matomo_wpload_config) && is_readable($matomo_wpload_config)) {
103 $matomo_wpload_content = @file_get_contents($matomo_wpload_config); // we do not include that file for security reasons
104 if (!empty($matomo_wpload_content)) {
105 $matomo_wpload_content = str_replace(array('<?php', 'exit;', 'wp-load.php'), '', $matomo_wpload_content);
106 $matomo_wpload_content = preg_replace('/\s/', '', $matomo_wpload_content);
107 $matomo_wpload_content = trim(ltrim(trim($matomo_wpload_content), '#')); // the path may be commented out # /abs/path
108 if (strpos($matomo_wpload_content, DIRECTORY_SEPARATOR) === 0) {
109 $matomo_wpload_file = rtrim($matomo_wpload_content, DIRECTORY_SEPARATOR) . '/wp-load.php';
110 if (file_exists($matomo_wpload_file) && is_readable($matomo_wpload_file)) {
111 require_once $matomo_wpload_file;
112 }
113 }
114 }
115 }
116 }
117
118 if ($matomo_is_archive_request) {
119 restore_error_handler();
120 if (ob_get_level()) {
121 $matomo_ob_end_clean_msg = @ob_get_clean();
122 if (!empty($matomo_ob_end_clean_msg)) {
123 matomo_log_message_no_display( $matomo_ob_end_clean_msg );
124 }
125 }
126 }
127 }
128
129 if ( ! defined( 'ABSPATH' ) ) {
130 echo 'Could not find wp-load. If your server uses symlinks or a custom content directory, Matomo may not work for you as we cannot detect the paths correctly. For more information see https://matomo.org/faq/wordpress/how-do-i-make-matomo-for-wordpress-work-when-i-have-a-custom-content-directory/';
131 exit; // if accessed directly
132 }
133
134 if ( !is_plugin_active('matomo/matomo.php')
135 && (!defined( 'MATOMO_PHPUNIT_TEST' ) || !MATOMO_PHPUNIT_TEST) ) { // during tests the plugin may temporarily not be active
136 exit;
137 }
138
139 if ( $GLOBALS['MATOMO_LOADED_DIRECTLY'] ) {
140 // see https://github.com/matomo-org/wp-matomo/issues/190
141 // wp-external-links plugin would register an ob_start(function () {...}) and manipulate any of our API output
142 // and in some cases the output would get completely lost causing blank pages.
143 add_filter('wpel_apply_settings', '__return_false', 99999);
144
145 // do not strip slashes if we bootstrap matomo within a regular wordpress request
146 if (!empty($_GET)) {
147 $_GET = stripslashes_deep( $_GET );
148 }
149 if (!empty($_POST)) {
150 $_POST = stripslashes_deep( $_POST );
151 }
152 if (!empty($_COOKIE)) {
153 $_COOKIE = stripslashes_deep( $_COOKIE );
154 }
155 if (!empty($_SERVER)) {
156 $_SERVER = stripslashes_deep( $_SERVER );
157 }
158 if (!empty($_REQUEST)) {
159 $_REQUEST = stripslashes_deep( $_REQUEST );
160 }
161 }
162
163
164 if ( matomo_is_app_request() ) {
165 // pretend we are in the admin... potentially avoiding caching etc
166 $GLOBALS['hook_suffix'] = '';
167 include_once ABSPATH . '/wp-admin/includes/class-wp-screen.php';
168 $GLOBALS['current_screen'] = WP_Screen::get();
169
170 // we disable jsonp
171 unset($_GET['jsoncallback']);
172 unset($_GET['callback']);
173 unset($_POST['jsoncallback']);
174 unset($_POST['callback']);
175 }
176
177 if ( ! defined( 'PIWIK_USER_PATH' ) ) {
178 define( 'PIWIK_USER_PATH', dirname( MATOMO_ANALYTICS_FILE ) );
179 }
180
181 if (function_exists('wp_raise_memory_limit') && function_exists('wp_convert_hr_to_bytes')) {
182 $current_limit = ini_get( 'memory_limit' );
183 $current_limit_int = wp_convert_hr_to_bytes( $current_limit );
184 $memory128MbInt = 134217728;
185 if ($current_limit_int && $current_limit_int > 0 && $current_limit_int < $memory128MbInt) {
186 // we try increase memory if memory is less than 128mb
187 wp_raise_memory_limit('admin');
188 }
189 }
190
191 $GLOBALS['MATOMO_MODIFY_CONFIG_SETTINGS'] = function ($settings) {
192 $plugins = $settings['Plugins'];
193 if (is_array($settings['Plugins'])) {
194 $pluginsToRemove = array('Marketplace', 'MultiSites', 'TwoFactorAuth', 'Widgetize', 'Monolog', 'Feedback', 'ExamplePlugin', 'ExampleAPI', 'ProfessionalServices', 'MobileAppMeasurable');
195 foreach ($pluginsToRemove as $pluginToRemove) {
196 // Marketplace => this is instead done in wordpress
197 // MultiSites => doesn't really make sense since we have only one website per installation
198 // TwoFactorAuth => not needed as login is being handled by WordPress
199 // widgetize for now we don't want to allow widgetizing as it is based on the token_auth authentication
200 // Monolog => we use our own logger
201 // ProfessionalServices => we advertise in the WP plugin itself instead
202 // feedback => we want to hide things like Need help in the admin etc
203 // MobileAppMeasurable => for WP mobile apps are not a thing
204 // custom variables we don't want to enable as we will deprecate them in Matomo 4 anyway => used to be disabled but we need to make sure the columns get installed otherwise matomo has issues... need to wait to matomo 4 to remove it
205 $pos = array_search($pluginToRemove, $plugins['Plugins']);
206 if ($pos !== false) {
207 array_splice($plugins['Plugins'], $pos, 1);
208 }
209 }
210 if (matomo_has_tag_manager()) {
211 $plugins['Plugins'][] = 'TagManager';
212 }
213 }
214 if (!empty($GLOBALS['MATOMO_PLUGINS_ENABLED'])) {
215 foreach ($GLOBALS['MATOMO_PLUGINS_ENABLED'] as $plugin) {
216 if (!in_array($plugin, $plugins['Plugins'])) {
217 $plugins['Plugins'][] = $plugin;
218 }
219 }
220 }
221 $settings['Plugins'] = $plugins;
222 return $settings;
223 };
224