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