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