PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.7.0
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.7.0
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 / classes / WpMatomo.php
matomo / classes Last commit date
WpMatomo 4 months ago .htaccess 6 years ago WpMatomo.php 4 months ago index.php 6 years ago
WpMatomo.php
306 lines
1 <?php
2 /**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 * @package matomo
8 */
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit; // if accessed directly
12 }
13
14 use WpMatomo\Admin\AdBlockDetector;
15 use WpMatomo\Admin\Admin;
16 use WpMatomo\Admin\Chart;
17 use WpMatomo\Admin\Dashboard;
18 use WpMatomo\Admin\MarketplaceSetupWizard;
19 use WpMatomo\Admin\Menu;
20 use WpMatomo\AjaxTracker;
21 use WpMatomo\Annotations;
22 use WpMatomo\API;
23 use WpMatomo\Capabilities;
24 use WpMatomo\Commands\MatomoCommands;
25 use WpMatomo\Ecommerce\EasyDigitalDownloads;
26 use WpMatomo\Ecommerce\MemberPress;
27 use WpMatomo\Ecommerce\Woocommerce;
28 use WpMatomo\Installer;
29 use WpMatomo\OptOut;
30 use WpMatomo\Paths;
31 use WpMatomo\PluginAdminOverrides;
32 use WpMatomo\RedirectOnActivation;
33 use WpMatomo\Report\Renderer;
34 use WpMatomo\Roles;
35 use WpMatomo\ScheduledTasks;
36 use WpMatomo\Settings;
37 use WpMatomo\Site\Sync as SiteSync;
38 use WpMatomo\TrackingCode;
39 use WpMatomo\Updater;
40 use WpMatomo\User\Sync as UserSync;
41
42 class WpMatomo {
43
44 /**
45 * @var Settings
46 */
47 public static $settings;
48
49 public function __construct() {
50 $this->declare_woocommerce_hpos_compatible();
51
52 if ( ! $this->check_compatibility() ) {
53 return;
54 }
55
56 self::$settings = new Settings();
57
58 if ( self::is_safe_mode() ) {
59 if ( is_admin() ) {
60 new Admin( self::$settings, false );
61 new \WpMatomo\Admin\SafeModeMenu( self::$settings );
62 }
63
64 return;
65 }
66
67 add_action( 'init', [ $this, 'init_plugin' ] );
68
69 $adblock_detector = new AdBlockDetector();
70 $adblock_detector->register_hooks();
71
72 $capabilities = new Capabilities( self::$settings );
73 $capabilities->register_hooks();
74
75 $roles = new Roles( self::$settings );
76 $roles->register_hooks();
77
78 $compatibility = new \WpMatomo\Compatibility();
79 $compatibility->register_hooks();
80
81 $site_config = new SiteSync\SyncConfig( self::$settings );
82 $scheduled_tasks = new ScheduledTasks( self::$settings, $site_config );
83 $scheduled_tasks->schedule();
84 $scheduled_tasks->register_ajax();
85
86 $privacy_badge = new OptOut();
87 $privacy_badge->register_hooks();
88
89 $renderer = new Renderer();
90 $renderer->register_hooks();
91
92 $api = new API();
93 $api->register_hooks();
94
95 if ( is_admin() ) {
96 new Admin( self::$settings );
97 $scheduled_tasks->show_errors_if_admin();
98
99 $dashboard = new Dashboard();
100 $dashboard->register_hooks();
101
102 $site_sync = new SiteSync( self::$settings );
103 $site_sync->register_hooks();
104 $user_sync = new UserSync();
105 $user_sync->register_hooks();
106
107 $referral = new \WpMatomo\Referral();
108 if ( $referral->should_show() ) {
109 $referral->register_hooks();
110 }
111
112 $error_notice = new \WpMatomo\ErrorNotice( self::$settings );
113 $error_notice->register_hooks();
114
115 $chart = new Chart();
116 $chart->register_hooks();
117
118 /*
119 * @see https://github.com/matomo-org/matomo-for-wordpress/issues/434
120 */
121 $redirect = new RedirectOnActivation( $this );
122 $redirect->register_hooks();
123
124 $plugin_admin_overrides = new PluginAdminOverrides( self::$settings );
125 $plugin_admin_overrides->register_hooks();
126 }
127
128 add_action(
129 'init',
130 function () {
131 $whats_new_notifications = new \WpMatomo\Admin\WhatsNewNotifications( self::$settings );
132 if ( $whats_new_notifications->is_active() ) {
133 $whats_new_notifications->register_hooks();
134 }
135 $whats_new_notifications->register_ajax();
136 }
137 );
138
139 $tracking_code = new TrackingCode( self::$settings );
140 $tracking_code->register_hooks();
141
142 $annotations = new Annotations( self::$settings );
143 $annotations->register_hooks();
144
145 $ai_bot_tracking = new \WpMatomo\AIBotTracking( self::$settings );
146 $ai_bot_tracking->register_hooks();
147
148 if ( defined( 'WP_CLI' ) && WP_CLI ) {
149 new MatomoCommands();
150 }
151
152 add_filter(
153 'plugin_action_links_' . plugin_basename( MATOMO_ANALYTICS_FILE ),
154 [
155 $this,
156 'add_settings_link',
157 ]
158 );
159
160 // TODO: need better way of doing ajax?
161 MarketplaceSetupWizard::register_ajax();
162 WpMatomo\Admin\TrackingSettings::register_ajax();
163 }
164
165 private function check_compatibility() {
166 if ( ! is_admin() ) {
167 return true;
168 }
169 if ( matomo_is_app_request() ) {
170 return true;
171 }
172
173 $paths = new Paths();
174 $upload_path = $paths->get_upload_base_dir();
175
176 if ( $upload_path
177 && ! is_writable( dirname( $upload_path ) ) ) {
178 add_action(
179 'init',
180 function () use ( $upload_path ) {
181 if ( self::is_admin_user() ) {
182 add_action(
183 'admin_notices',
184 function () use ( $upload_path ) {
185 echo '<div class="error"><p>' . sprintf( esc_html__( 'Matomo Analytics requires the uploads directory %s to be writable. Please make the directory writable for it to work.', 'matomo' ), '(' . esc_html( dirname( $upload_path ) ) . ')' ) . '</p></div>';
186 }
187 );
188 }
189 }
190 );
191
192 return false;
193 }
194
195 return true;
196 }
197
198 public static function is_admin_user() {
199 if ( ! function_exists( 'is_multisite' )
200 || ! is_multisite() ) {
201 return current_user_can( 'administrator' );
202 }
203
204 return is_super_admin();
205 }
206
207 public static function is_safe_mode() {
208 if ( defined( 'MATOMO_SAFE_MODE' ) ) {
209 return MATOMO_SAFE_MODE;
210 }
211
212 return false;
213 }
214
215 private static function get_active_plugins() {
216 $plugins = [];
217 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
218 $muplugins = get_site_option( 'active_sitewide_plugins' );
219 $plugins = array_keys( $muplugins );
220 }
221 $plugins = array_merge( (array) get_option( 'active_plugins', [] ), $plugins );
222
223 return $plugins;
224 }
225
226 public static function should_disable_addhandler() {
227 return defined( 'MATOMO_DISABLE_ADDHANDLER' ) && MATOMO_DISABLE_ADDHANDLER;
228 }
229
230 public function add_settings_link( $links ) {
231 $get_started = new \WpMatomo\Admin\GetStarted( self::$settings );
232
233 if ( self::$settings->get_global_option( Settings::SHOW_GET_STARTED_PAGE ) && $get_started->can_user_manage() ) {
234 $links[] = '<a href="' . menu_page_url( Menu::SLUG_GET_STARTED, false ) . '">' . __( 'Get Started', 'matomo' ) . '</a>';
235 } elseif ( current_user_can( Capabilities::KEY_SUPERUSER ) ) {
236 $links[] = '<a href="' . menu_page_url( Menu::SLUG_SETTINGS, false ) . '">' . __( 'Settings', 'matomo' ) . '</a>';
237 }
238
239 return $links;
240 }
241
242 public function init_plugin() {
243 if ( ( is_admin() || matomo_is_app_request() ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
244 $installer = new Installer( self::$settings );
245 $installer->register_hooks();
246 if ( $installer->looks_like_it_is_installed() ) {
247 if ( is_admin() && ( ! defined( 'MATOMO_ENABLE_AUTO_UPGRADE' ) || MATOMO_ENABLE_AUTO_UPGRADE ) ) {
248 $updater = new Updater( self::$settings );
249 $updater->update_if_needed();
250 }
251 } else {
252 if ( matomo_is_app_request() ) {
253 // we can't install if matomo is requested... there's some circular reference
254 wp_safe_redirect( admin_url() );
255 exit;
256 } else {
257 if ( $installer->can_be_installed() ) {
258 $installer->install();
259 }
260 }
261 }
262 }
263 $tracking_code = new TrackingCode( self::$settings );
264 if ( self::$settings->is_tracking_enabled()
265 && self::$settings->get_global_option( 'track_ecommerce' )
266 && ! $tracking_code->is_hidden_user() ) {
267 $tracker = new AjaxTracker( self::$settings );
268
269 $sync_config = new SiteSync\SyncConfig( self::$settings );
270
271 if ( function_exists( 'WC' ) ) {
272 $woocommerce = new Woocommerce( $tracker, self::$settings, $sync_config );
273 $woocommerce->register_hooks();
274 }
275
276 $easy_digital_downloads = new EasyDigitalDownloads( $tracker, self::$settings, $sync_config );
277 $easy_digital_downloads->register_hooks();
278
279 $member_press = new MemberPress( $tracker, self::$settings, $sync_config );
280 $member_press->register_hooks();
281
282 do_action( 'matomo_ecommerce_init', $tracker );
283 }
284 }
285
286 private function declare_woocommerce_hpos_compatible() {
287 add_action(
288 'before_woocommerce_init',
289 function() {
290 if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
291 \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'matomo/matomo.php', true );
292 }
293 }
294 );
295 }
296
297 public static function is_async_archiving_manually_disabled() {
298 return ( defined( 'MATOMO_SUPPORT_ASYNC_ARCHIVING' ) && ! MATOMO_SUPPORT_ASYNC_ARCHIVING )
299 || self::is_async_archiving_disabled_by_setting();
300 }
301
302 private static function is_async_archiving_disabled_by_setting() {
303 return self::$settings->is_async_archiving_disabled_by_option();
304 }
305 }
306