PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.6.0
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.6.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 7 months ago .htaccess 6 years ago WpMatomo.php 7 months ago index.php 6 years ago
WpMatomo.php
301 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 $scheduled_tasks = new ScheduledTasks( self::$settings );
82 $scheduled_tasks->schedule();
83 $scheduled_tasks->register_ajax();
84
85 $privacy_badge = new OptOut();
86 $privacy_badge->register_hooks();
87
88 $renderer = new Renderer();
89 $renderer->register_hooks();
90
91 $api = new API();
92 $api->register_hooks();
93
94 if ( is_admin() ) {
95 new Admin( self::$settings );
96 $scheduled_tasks->show_errors_if_admin();
97
98 $dashboard = new Dashboard();
99 $dashboard->register_hooks();
100
101 $site_sync = new SiteSync( self::$settings );
102 $site_sync->register_hooks();
103 $user_sync = new UserSync();
104 $user_sync->register_hooks();
105
106 $referral = new \WpMatomo\Referral();
107 if ( $referral->should_show() ) {
108 $referral->register_hooks();
109 }
110
111 $error_notice = new \WpMatomo\ErrorNotice( self::$settings );
112 $error_notice->register_hooks();
113
114 $chart = new Chart();
115 $chart->register_hooks();
116
117 /*
118 * @see https://github.com/matomo-org/matomo-for-wordpress/issues/434
119 */
120 $redirect = new RedirectOnActivation( $this );
121 $redirect->register_hooks();
122
123 $plugin_admin_overrides = new PluginAdminOverrides( self::$settings );
124 $plugin_admin_overrides->register_hooks();
125 }
126
127 add_action(
128 'init',
129 function () {
130 $whats_new_notifications = new \WpMatomo\Admin\WhatsNewNotifications( self::$settings );
131 if ( $whats_new_notifications->is_active() ) {
132 $whats_new_notifications->register_hooks();
133 }
134 $whats_new_notifications->register_ajax();
135 }
136 );
137
138 $tracking_code = new TrackingCode( self::$settings );
139 $tracking_code->register_hooks();
140 $annotations = new Annotations( self::$settings );
141 $annotations->register_hooks();
142
143 if ( defined( 'WP_CLI' ) && WP_CLI ) {
144 new MatomoCommands();
145 }
146
147 add_filter(
148 'plugin_action_links_' . plugin_basename( MATOMO_ANALYTICS_FILE ),
149 [
150 $this,
151 'add_settings_link',
152 ]
153 );
154
155 // TODO: need better way of doing ajax?
156 MarketplaceSetupWizard::register_ajax();
157 WpMatomo\Admin\TrackingSettings::register_ajax();
158 }
159
160 private function check_compatibility() {
161 if ( ! is_admin() ) {
162 return true;
163 }
164 if ( matomo_is_app_request() ) {
165 return true;
166 }
167
168 $paths = new Paths();
169 $upload_path = $paths->get_upload_base_dir();
170
171 if ( $upload_path
172 && ! is_writable( dirname( $upload_path ) ) ) {
173 add_action(
174 'init',
175 function () use ( $upload_path ) {
176 if ( self::is_admin_user() ) {
177 add_action(
178 'admin_notices',
179 function () use ( $upload_path ) {
180 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>';
181 }
182 );
183 }
184 }
185 );
186
187 return false;
188 }
189
190 return true;
191 }
192
193 public static function is_admin_user() {
194 if ( ! function_exists( 'is_multisite' )
195 || ! is_multisite() ) {
196 return current_user_can( 'administrator' );
197 }
198
199 return is_super_admin();
200 }
201
202 public static function is_safe_mode() {
203 if ( defined( 'MATOMO_SAFE_MODE' ) ) {
204 return MATOMO_SAFE_MODE;
205 }
206
207 return false;
208 }
209
210 private static function get_active_plugins() {
211 $plugins = [];
212 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
213 $muplugins = get_site_option( 'active_sitewide_plugins' );
214 $plugins = array_keys( $muplugins );
215 }
216 $plugins = array_merge( (array) get_option( 'active_plugins', [] ), $plugins );
217
218 return $plugins;
219 }
220
221 public static function should_disable_addhandler() {
222 return defined( 'MATOMO_DISABLE_ADDHANDLER' ) && MATOMO_DISABLE_ADDHANDLER;
223 }
224
225 public function add_settings_link( $links ) {
226 $get_started = new \WpMatomo\Admin\GetStarted( self::$settings );
227
228 if ( self::$settings->get_global_option( Settings::SHOW_GET_STARTED_PAGE ) && $get_started->can_user_manage() ) {
229 $links[] = '<a href="' . menu_page_url( Menu::SLUG_GET_STARTED, false ) . '">' . __( 'Get Started', 'matomo' ) . '</a>';
230 } elseif ( current_user_can( Capabilities::KEY_SUPERUSER ) ) {
231 $links[] = '<a href="' . menu_page_url( Menu::SLUG_SETTINGS, false ) . '">' . __( 'Settings', 'matomo' ) . '</a>';
232 }
233
234 return $links;
235 }
236
237 public function init_plugin() {
238 if ( ( is_admin() || matomo_is_app_request() ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
239 $installer = new Installer( self::$settings );
240 $installer->register_hooks();
241 if ( $installer->looks_like_it_is_installed() ) {
242 if ( is_admin() && ( ! defined( 'MATOMO_ENABLE_AUTO_UPGRADE' ) || MATOMO_ENABLE_AUTO_UPGRADE ) ) {
243 $updater = new Updater( self::$settings );
244 $updater->update_if_needed();
245 }
246 } else {
247 if ( matomo_is_app_request() ) {
248 // we can't install if matomo is requested... there's some circular reference
249 wp_safe_redirect( admin_url() );
250 exit;
251 } else {
252 if ( $installer->can_be_installed() ) {
253 $installer->install();
254 }
255 }
256 }
257 }
258 $tracking_code = new TrackingCode( self::$settings );
259 if ( self::$settings->is_tracking_enabled()
260 && self::$settings->get_global_option( 'track_ecommerce' )
261 && ! $tracking_code->is_hidden_user() ) {
262 $tracker = new AjaxTracker( self::$settings );
263
264 $sync_config = new SiteSync\SyncConfig( self::$settings );
265
266 if ( function_exists( 'WC' ) ) {
267 $woocommerce = new Woocommerce( $tracker, self::$settings, $sync_config );
268 $woocommerce->register_hooks();
269 }
270
271 $easy_digital_downloads = new EasyDigitalDownloads( $tracker, self::$settings, $sync_config );
272 $easy_digital_downloads->register_hooks();
273
274 $member_press = new MemberPress( $tracker, self::$settings, $sync_config );
275 $member_press->register_hooks();
276
277 do_action( 'matomo_ecommerce_init', $tracker );
278 }
279 }
280
281 private function declare_woocommerce_hpos_compatible() {
282 add_action(
283 'before_woocommerce_init',
284 function() {
285 if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
286 \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'matomo/matomo.php', true );
287 }
288 }
289 );
290 }
291
292 public static function is_async_archiving_manually_disabled() {
293 return ( defined( 'MATOMO_SUPPORT_ASYNC_ARCHIVING' ) && ! MATOMO_SUPPORT_ASYNC_ARCHIVING )
294 || self::is_async_archiving_disabled_by_setting();
295 }
296
297 private static function is_async_archiving_disabled_by_setting() {
298 return self::$settings->is_async_archiving_disabled_by_option();
299 }
300 }
301