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