PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.1.6
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.1.6
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
282 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 $tracking_code = new TrackingCode( self::$settings );
124 $tracking_code->register_hooks();
125 $annotations = new Annotations( self::$settings );
126 $annotations->register_hooks();
127
128 if ( defined( 'WP_CLI' ) && WP_CLI ) {
129 new MatomoCommands();
130 }
131
132 add_filter(
133 'plugin_action_links_' . plugin_basename( MATOMO_ANALYTICS_FILE ),
134 [
135 $this,
136 'add_settings_link',
137 ]
138 );
139
140 // TODO: need better way of doing ajax?
141 MarketplaceSetupWizard::register_ajax();
142 WpMatomo\Admin\TrackingSettings::register_ajax();
143 }
144
145 private function check_compatibility() {
146 if ( ! is_admin() ) {
147 return true;
148 }
149 if ( matomo_is_app_request() ) {
150 return true;
151 }
152
153 $paths = new Paths();
154 $upload_path = $paths->get_upload_base_dir();
155
156 if ( $upload_path
157 && ! is_writable( dirname( $upload_path ) ) ) {
158 add_action(
159 'init',
160 function () use ( $upload_path ) {
161 if ( self::is_admin_user() ) {
162 add_action(
163 'admin_notices',
164 function () use ( $upload_path ) {
165 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>';
166 }
167 );
168 }
169 }
170 );
171
172 return false;
173 }
174
175 return true;
176 }
177
178 public static function is_admin_user() {
179 if ( ! function_exists( 'is_multisite' )
180 || ! is_multisite() ) {
181 return current_user_can( 'administrator' );
182 }
183
184 return is_super_admin();
185 }
186
187 public static function is_safe_mode() {
188 if ( defined( 'MATOMO_SAFE_MODE' ) ) {
189 return MATOMO_SAFE_MODE;
190 }
191
192 return false;
193 }
194
195 private static function get_active_plugins() {
196 $plugins = [];
197 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
198 $muplugins = get_site_option( 'active_sitewide_plugins' );
199 $plugins = array_keys( $muplugins );
200 }
201 $plugins = array_merge( (array) get_option( 'active_plugins', [] ), $plugins );
202
203 return $plugins;
204 }
205
206 public static function should_disable_addhandler() {
207 return defined( 'MATOMO_DISABLE_ADDHANDLER' ) && MATOMO_DISABLE_ADDHANDLER;
208 }
209
210 public function add_settings_link( $links ) {
211 $get_started = new \WpMatomo\Admin\GetStarted( self::$settings );
212
213 if ( self::$settings->get_global_option( Settings::SHOW_GET_STARTED_PAGE ) && $get_started->can_user_manage() ) {
214 $links[] = '<a href="' . menu_page_url( Menu::SLUG_GET_STARTED, false ) . '">' . __( 'Get Started', 'matomo' ) . '</a>';
215 } elseif ( current_user_can( Capabilities::KEY_SUPERUSER ) ) {
216 $links[] = '<a href="' . menu_page_url( Menu::SLUG_SETTINGS, false ) . '">' . __( 'Settings', 'matomo' ) . '</a>';
217 }
218
219 return $links;
220 }
221
222 public function init_plugin() {
223 if ( ( is_admin() || matomo_is_app_request() ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
224 $installer = new Installer( self::$settings );
225 $installer->register_hooks();
226 if ( $installer->looks_like_it_is_installed() ) {
227 if ( is_admin() && ( ! defined( 'MATOMO_ENABLE_AUTO_UPGRADE' ) || MATOMO_ENABLE_AUTO_UPGRADE ) ) {
228 $updater = new Updater( self::$settings );
229 $updater->update_if_needed();
230 }
231 } else {
232 if ( matomo_is_app_request() ) {
233 // we can't install if matomo is requested... there's some circular reference
234 wp_safe_redirect( admin_url() );
235 exit;
236 } else {
237 if ( $installer->can_be_installed() ) {
238 $installer->install();
239 }
240 }
241 }
242 }
243 $tracking_code = new TrackingCode( self::$settings );
244 if ( self::$settings->is_tracking_enabled()
245 && self::$settings->get_global_option( 'track_ecommerce' )
246 && ! $tracking_code->is_hidden_user() ) {
247 $tracker = new AjaxTracker( self::$settings );
248
249 $woocommerce = new Woocommerce( $tracker, self::$settings );
250 $woocommerce->register_hooks();
251
252 $easy_digital_downloads = new EasyDigitalDownloads( $tracker, self::$settings );
253 $easy_digital_downloads->register_hooks();
254
255 $member_press = new MemberPress( $tracker, self::$settings );
256 $member_press->register_hooks();
257
258 do_action( 'matomo_ecommerce_init', $tracker );
259 }
260 }
261
262 private function declare_woocommerce_hpos_compatible() {
263 add_action(
264 'before_woocommerce_init',
265 function() {
266 if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
267 \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'matomo/matomo.php', true );
268 }
269 }
270 );
271 }
272
273 public static function is_async_archiving_manually_disabled() {
274 return ( defined( 'MATOMO_SUPPORT_ASYNC_ARCHIVING' ) && ! MATOMO_SUPPORT_ASYNC_ARCHIVING )
275 || self::is_async_archiving_disabled_by_setting();
276 }
277
278 private static function is_async_archiving_disabled_by_setting() {
279 return self::$settings->is_async_archiving_disabled_by_option();
280 }
281 }
282