PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.1.4
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.1.4
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 1 year ago core 1 year ago js 2 years ago lang 1 year ago libs 1 year ago node_modules 2 years ago plugins 1 year ago vendor 1 year ago .htaccess 6 years ago DIObject.php 2 years ago LEGALNOTICE 2 years ago LICENSE 2 years ago LegacyAutoloader.php 2 years ago PRIVACY.md 5 years ago README.md 3 years ago SECURITY.md 2 years ago bootstrap.php 2 years ago console 6 years ago favicon.ico 2 years ago index.php 2 years ago matomo.js 2 years ago matomo.php 2 years ago offline-service-worker.js 5 years ago piwik.js 2 years ago piwik.php 2 years ago robots.txt 5 years ago
bootstrap.php
259 lines
1 <?php
2
3 // see plugins/WordPress/WordPress.php for more info
4 $GLOBALS['MATOMO_WP_ORIGINAL_ERROR_REPORTING'] = error_reporting();
5
6 $GLOBALS['CONFIG_INI_PATH_RESOLVER'] = function () {
7 if ( defined( 'ABSPATH' )
8 && defined( 'MATOMO_CONFIG_PATH' ) ) {
9 $paths = new \WpMatomo\Paths();
10
11 return $paths->get_config_ini_path();
12 }
13 };
14
15 $matomo_is_archive_request = !empty($_SERVER['argv'])
16 && is_array($_SERVER['argv'])
17 && in_array('climulti:request', $_SERVER['argv'], true);
18
19 if ( ! defined( 'PIWIK_ENABLE_ERROR_HANDLER' ) ) {
20 // we prefer using WP error handler... unless we are archiving where we want to prevent any warnings being printed
21 // as otherwise the archiving would be marked as failed because the cli archive output would contain a warning and
22 // the output would not be possible to do an unserialize anymore
23 if (!$matomo_is_archive_request) {
24 define( 'PIWIK_ENABLE_ERROR_HANDLER', false );
25 }
26 }
27
28 $GLOBALS['MATOMO_LOADED_DIRECTLY'] = ! defined( 'ABSPATH' );
29
30 if (!function_exists('matomo_ch_dir')) {
31 function matomo_ch_dir($file) {
32 if (function_exists('chdir') && is_dir(dirname($file))) {
33 @chdir(dirname($file));
34 }
35 }
36 }
37
38 if (!function_exists('matomo_log_message_no_display')) {
39 function matomo_log_message_no_display($message)
40 {
41 $message = 'Matomo ' . $message;
42
43 if ( defined( 'WP_DEBUG' ) && WP_DEBUG === true ) {
44 if (function_exists('ini_set') && function_exists('ini_get')) {
45 $value_orig = @ini_get('display_errors');
46 $value = @ini_set('display_errors', 'Off');
47 if (false !== $value) {
48 error_log( $message );
49 }
50 @ini_set('display_errors', $value_orig);
51 }
52 }
53
54 if (function_exists('update_option')
55 && class_exists('\WpMatomo\Logger')) {
56 // only if WordPress was bootstrapped by now... otherwise it will fail
57 try {
58 $logger = new \WpMatomo\Logger();
59 $logger->log_exception('archive_boot', new Exception($message));
60 } catch (Exception $e) {
61
62 }
63 }
64 }
65 }
66
67 if ( $GLOBALS['MATOMO_LOADED_DIRECTLY'] ) {
68
69 // prevent from loading twice
70 $matomo_wpload_base = '../../../../wp-load.php';
71 $matomo_wpload_full = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) ) . '/wp-load.php';
72
73 if ($matomo_is_archive_request) {
74 ob_start();
75 // the matomo error handler will be only loaded after WordPress has been loaded... here we want to prevent
76 // any warning/notice from being shown while bootstrapping WordPress or otherwise the unserialize of the response
77 // later in climulti will fail
78 set_error_handler(function ($errno, $errstr, $errfile, $errline) {
79 // if the error has been suppressed by the @ we don't handle the error
80 if (error_reporting() == 0) {
81 return;
82 }
83
84 if (in_array($errno, array(E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, E_USER_ERROR))) {
85 return false; //force standard behaviour
86 }
87
88 matomo_log_message_no_display( sprintf('error: %s: %s in %s:%s', $errno, $errstr, $errfile, $errline ) );
89 });
90 }
91
92 if (!empty($_SERVER['MATOMO_WP_ROOT_PATH']) && file_exists( rtrim($_SERVER['MATOMO_WP_ROOT_PATH'], '/') . '/wp-load.php')) {
93 $matomo_wp_root_file = rtrim($_SERVER['MATOMO_WP_ROOT_PATH'], '/') . '/wp-load.php';
94 matomo_ch_dir($matomo_wp_root_file);
95 require_once $matomo_wp_root_file;
96 } elseif (file_exists($matomo_wpload_full ) ) {
97 matomo_ch_dir($matomo_wpload_full);
98 require_once $matomo_wpload_full;
99 } elseif (realpath( $matomo_wpload_full ) && file_exists(realpath( $matomo_wpload_full ))) {
100 matomo_ch_dir(realpath( $matomo_wpload_full ));
101
102 require_once realpath( $matomo_wpload_full );
103 } elseif (!empty($_SERVER['SCRIPT_FILENAME']) && file_exists($_SERVER['SCRIPT_FILENAME'])) {
104 // seems symlinked... eg the wp-content dir or wp-content/plugins dir is symlinked from some very much other place...
105 $matomo_wpload_full = dirname($_SERVER['SCRIPT_FILENAME']) . '/' . $matomo_wpload_base;
106 if ( file_exists($matomo_wpload_full ) ) {
107 matomo_ch_dir($matomo_wpload_full);
108
109 require_once $matomo_wpload_full;
110 } elseif (realpath( $matomo_wpload_full ) && file_exists(realpath( $matomo_wpload_full ))) {
111 matomo_ch_dir(realpath( $matomo_wpload_full ));
112 require_once realpath( $matomo_wpload_full );
113 } elseif (file_exists(dirname(dirname(dirname(dirname(dirname( $_SERVER['SCRIPT_FILENAME'] ))))) . '/wp-load.php')) {
114 $matomo_relative_path = dirname(dirname(dirname(dirname(dirname( $_SERVER['SCRIPT_FILENAME'] ))))) . '/wp-load.php';
115
116 matomo_ch_dir($matomo_relative_path);
117 require_once $matomo_relative_path;
118 }
119 }
120
121 if (!defined( 'ABSPATH')) {
122 // still not loaded... look in plugins directory if there is a config file for us.
123 $matomo_wpload_config = dirname(__FILE__) . '/../../matomo.wpload_dir.php';
124 if (file_exists( $matomo_wpload_config) && is_readable($matomo_wpload_config)) {
125 $matomo_wpload_content = @file_get_contents($matomo_wpload_config); // we do not include that file for security reasons
126 if (!empty($matomo_wpload_content)) {
127 $matomo_wpload_content = str_replace(array('<?php', 'exit;', 'wp-load.php'), '', $matomo_wpload_content);
128 $matomo_wpload_content = preg_replace('/\s/', '', $matomo_wpload_content);
129 $matomo_wpload_content = trim(ltrim(trim($matomo_wpload_content), '#')); // the path may be commented out # /abs/path
130 if (strpos($matomo_wpload_content, DIRECTORY_SEPARATOR) === 0) {
131 $matomo_wpload_file = rtrim($matomo_wpload_content, DIRECTORY_SEPARATOR) . '/wp-load.php';
132 if (file_exists($matomo_wpload_file) && is_readable($matomo_wpload_file)) {
133 matomo_ch_dir($matomo_wpload_file);
134 require_once $matomo_wpload_file;
135 }
136 }
137 }
138 }
139 }
140
141 if ($matomo_is_archive_request) {
142 restore_error_handler();
143 if (ob_get_level()) {
144 $matomo_ob_end_clean_msg = @ob_get_clean();
145 if (!empty($matomo_ob_end_clean_msg)) {
146 matomo_log_message_no_display( $matomo_ob_end_clean_msg );
147 }
148 }
149 }
150 }
151
152 if ( ! defined( 'ABSPATH' ) ) {
153 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/';
154 if (!empty($_SERVER['MATOMO_WP_ROOT_PATH'])) {
155 echo ' Note: A custom WP root path was set.';
156 }
157 exit; // if accessed directly
158 }
159
160 if ( !is_plugin_active('matomo/matomo.php')
161 && (!defined( 'MATOMO_PHPUNIT_TEST' ) || !MATOMO_PHPUNIT_TEST) ) { // during tests the plugin may temporarily not be active
162 exit;
163 }
164
165 if ( $GLOBALS['MATOMO_LOADED_DIRECTLY'] ) {
166 // see https://github.com/matomo-org/matomo-for-wordpress/issues/190
167 // wp-external-links plugin would register an ob_start(function () {...}) and manipulate any of our API output
168 // and in some cases the output would get completely lost causing blank pages.
169 add_filter('wpel_apply_settings', '__return_false', 99999);
170
171 // do not strip slashes if we bootstrap matomo within a regular wordpress request
172 if (!empty($_GET)) {
173 $_GET = stripslashes_deep( $_GET );
174 }
175 if (!empty($_POST)) {
176 $_POST = stripslashes_deep( $_POST );
177 }
178 if (!empty($_COOKIE)) {
179 $_COOKIE = stripslashes_deep( $_COOKIE );
180 }
181 if (!empty($_SERVER)) {
182 $_SERVER = stripslashes_deep( $_SERVER );
183 }
184 if (!empty($_REQUEST)) {
185 $_REQUEST = stripslashes_deep( $_REQUEST );
186 }
187 }
188
189
190 if ( matomo_is_app_request() ) {
191 // pretend we are in the admin... potentially avoiding caching etc
192 $GLOBALS['hook_suffix'] = '';
193 include_once ABSPATH . '/wp-admin/includes/class-wp-screen.php';
194 $GLOBALS['current_screen'] = WP_Screen::get();
195
196 // we disable jsonp
197 unset($_GET['jsoncallback']);
198 unset($_GET['callback']);
199 unset($_POST['jsoncallback']);
200 unset($_POST['callback']);
201 }
202
203 if ( ! defined( 'PIWIK_USER_PATH' ) ) {
204 define( 'PIWIK_USER_PATH', dirname( MATOMO_ANALYTICS_FILE ) );
205 }
206
207 if (function_exists('wp_raise_memory_limit') && function_exists('wp_convert_hr_to_bytes')) {
208 $current_limit = ini_get( 'memory_limit' );
209 $current_limit_int = wp_convert_hr_to_bytes( $current_limit );
210 $memory128MbInt = 134217728;
211 if ($current_limit_int && $current_limit_int > 0 && $current_limit_int < $memory128MbInt) {
212 // we try increase memory if memory is less than 128mb
213 wp_raise_memory_limit('admin');
214 }
215 }
216
217 $GLOBALS['MATOMO_MODIFY_CONFIG_SETTINGS'] = function ($settings) {
218 $plugins = $settings['Plugins'];
219 if (is_array($settings['Plugins'])) {
220 $pluginsToRemove = array('Marketplace', 'MultiSites', 'TwoFactorAuth', 'Widgetize', 'Monolog', 'Feedback', 'ExamplePlugin', 'ExampleAPI', 'ProfessionalServices', 'MobileAppMeasurable', 'CustomPiwikJs');
221 foreach ($pluginsToRemove as $pluginToRemove) {
222 // Marketplace => this is instead done in wordpress
223 // MultiSites => doesn't really make sense since we have only one website per installation
224 // TwoFactorAuth => not needed as login is being handled by WordPress
225 // widgetize for now we don't want to allow widgetizing as it is based on the token_auth authentication
226 // Monolog => we use our own logger
227 // ProfessionalServices => we advertise in the WP plugin itself instead
228 // feedback => we want to hide things like Need help in the admin etc
229 // MobileAppMeasurable => for WP mobile apps are not a thing
230 // 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
231 $pos = array_search($pluginToRemove, $plugins['Plugins']);
232 if ($pos !== false) {
233 array_splice($plugins['Plugins'], $pos, 1);
234 }
235 }
236 if (matomo_has_tag_manager()) {
237 $plugins['Plugins'][] = 'TagManager';
238 }
239 $mustEnable = ['BulkTracking', 'CustomJsTracker'];
240 foreach ($mustEnable as $enable) {
241 if (!in_array($enable, $plugins['Plugins'])) {
242 $plugins['Plugins'][] = $enable;
243 }
244 }
245 }
246 if (!empty($GLOBALS['MATOMO_PLUGINS_ENABLED'])) {
247 foreach ($GLOBALS['MATOMO_PLUGINS_ENABLED'] as $plugin) {
248 if (!in_array($plugin, $plugins['Plugins'])) {
249 $plugins['Plugins'][] = $plugin;
250 }
251 }
252 }
253 if (!empty($GLOBALS['MATOMO_MARKETPLACE_PLUGINS'])) {
254 matomo_filter_incompatible_plugins($plugins['Plugins']);
255 }
256 $settings['Plugins'] = $plugins;
257 return $settings;
258 };
259