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