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