PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.2.2
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.2.2
6.2.3 6.2.2 6.2.1 6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 All 156 releases
← All changes | class/class-mainwp-system.php +2041 -1152 5.0.2 → 6.2.2 View file →
@@ -6,9 +6,17 @@
6 6 */
7 7
8 8 namespace MainWP\Dashboard;
9 9
10 +use MainWP\Dashboard\Module\Log\Log_Manage_Insights_Events_Page;
11 +
12 +// Exit if accessed directly.
13 +if ( ! defined( 'ABSPATH' ) ) {
14 + exit;
15 +}
16 +
10 17 // phpcs:disable Generic.Metrics.CyclomaticComplexity -- complexity.
18 +// phpcs:disable plugin_updater_detected -- not a self-updater; injects update data exclusively for licensed MainWP premium extensions hosted on mainwp.com.
11 19
12 20 const MAINWP_VIEW_PER_SITE = 1;
13 21 const MAINWP_VIEW_PER_PLUGIN_THEME = 0;
14 22 const MAINWP_VIEW_PER_GROUP = 2;
@@ -19,1330 +27,2211 @@
19 27 * Class MainWP_System
20 28 *
21 29 * @package MainWP\Dashboard
22 30 */
23 -class MainWP_System {
31 +class MainWP_System { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
24 32
25 - /**
26 - * Public static variable to hold the current plugin version.
27 - *
28 - * @var string Current plugin version.
29 - */
30 - public static $version = '5.0.2';
33 + /**
34 + * Public static variable to hold the current plugin version.
35 + *
36 + * @var string Current plugin version.
37 + */
38 + public static $version = '6.2.2'; // NOSONAR.
31 39
32 - /**
33 - * Private static variable to hold the single instance of the class.
34 - *
35 - * @var mixed Default null
36 - */
37 - private static $instance = null;
40 + /**
41 + * Private static variable to hold the single instance of the class.
42 + *
43 + * @var mixed Default null
44 + */
45 + private static $instance = null;
38 46
39 - /**
40 - * Public variable to hold the Metaboxes instance.
41 - *
42 - * @var object Metaboxes.
43 - */
44 - public $metaboxes;
47 + /**
48 + * Public variable to hold the Metaboxes instance.
49 + *
50 + * @var object Metaboxes.
51 + */
52 + public $metaboxes;
45 53
46 - /**
47 - * Private variable to hold the current version.
48 - *
49 - * @var string The plugin current version.
50 - */
51 - private $current_version = null;
54 + /**
55 + * Private variable to hold the current version.
56 + *
57 + * @var string The plugin current version.
58 + */
59 + private $current_version = null;
52 60
53 61
54 - /**
55 - * Private variable to hold the check update version number.
56 - *
57 - * @var string The plugin current update version.
58 - */
59 - private $check_ver_update = '0.0.5';
62 + /**
63 + * Private variable to hold the check update version number.
64 + *
65 + * @var string The plugin current update version.
66 + */
67 + private $check_ver_update = '0.0.8';
60 68
61 - /**
62 - * Private variable to hold the plugin slug (mainwp/mainwp.php)
63 - *
64 - * @var string Plugin slug.
65 - */
66 - private $plugin_slug;
69 + /**
70 + * Private variable to hold the plugin slug (mainwp/mainwp.php)
71 + *
72 + * @var string Plugin slug.
73 + */
74 + private $plugin_slug;
67 75
68 - /**
69 - * Method instance()
70 - *
71 - * Create a public static instance.
72 - *
73 - * @static
74 - * @return MainWP_System
75 - */
76 - public static function instance() {
77 - return self::$instance;
78 - }
79 76
80 - /**
81 - * MainWP_System constructor.
82 - *
83 - * Runs any time class is called.
84 - *
85 - * @param string $mainwp_plugin_file Plugn slug.
86 - *
87 - * @uses \MainWP\Dashboard\MainWP_Bulk_Post
88 - * @uses \MainWP\Dashboard\MainWP_Hooks
89 - * @uses \MainWP\Dashboard\MainWP_Menu::get_class_name()
90 - * @uses \MainWP\Dashboard\MainWP_Menu
91 - * @uses \MainWP\Dashboard\MainWP_Meta_Boxes
92 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::init_cron_jobs()
93 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs
94 - * @uses \MainWP\Dashboard\MainWP_System_Handler
95 - * @uses \MainWP\Dashboard\MainWP_System_Utility::get_class_name()
96 - * @uses \MainWP\Dashboard\MainWP_System_View::get_class_name()
97 - * @uses \MainWP\Dashboard\MainWP_UI::get_class_name()
98 - * @uses \MainWP\Dashboard\MainWP_WP_CLI_Command::init()
99 - * @uses \MainWP\Dashboard\MainWP_Updates_Overview::init()
100 - * @uses \MainWP\Dashboard\MainWP_Extensions::init()
101 - * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_class_name()
102 - * @uses \MainWP\Dashboard\MainWP_Install_Bulk::init()
103 - * @uses \MainWP\Dashboard\MainWP_Manage_Backups::init()
104 - * @uses \MainWP\Dashboard\MainWP_Manage_Sites::init()
105 - * @uses \MainWP\Dashboard\MainWP_Overview::get()
106 - * @uses \MainWP\Dashboard\MainWP_Page::init()
107 - * @uses \MainWP\Dashboard\MainWP_Plugins::init()
108 - * @uses \MainWP\Dashboard\MainWP_Post::init()
109 - * @uses \MainWP\Dashboard\MainWP_Settings::init()
110 - * @uses \MainWP\Dashboard\MainWP_Themes::init()
111 - * @uses \MainWP\Dashboard\MainWP_Updates::init()
112 - * @uses \MainWP\Dashboard\MainWP_User::init()
113 - * @uses \MainWP\Dashboard\MainWP_Updates::init()
114 - * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
115 - */
116 - public function __construct( $mainwp_plugin_file ) {
117 - self::$instance = $this;
77 + /**
78 + * Private variable to hold the defer js handle.
79 + *
80 + * @var array Defer js handle.
81 + */
82 + private static $defer_js_handle = array();
118 83
119 - MainWP_Execution_Helper::instance()->init_exec_time();
120 84
121 - new MainWP_Includes();
85 + /**
86 + * Method instance()
87 + *
88 + * Create a public static instance.
89 + *
90 + * @static
91 + * @return MainWP_System
92 + */
93 + public static function instance() {
94 + return static::$instance;
95 + }
122 96
123 - MainWP_Keys_Manager::auto_load_files();
97 + /**
98 + * MainWP_System constructor.
99 + *
100 + * Runs any time class is called.
101 + *
102 + * @param string $mainwp_plugin_file Plugn slug.
103 + *
104 + * @uses \MainWP\Dashboard\MainWP_Bulk_Post
105 + * @uses \MainWP\Dashboard\MainWP_Hooks
106 + * @uses \MainWP\Dashboard\MainWP_Menu::get_class_name()
107 + * @uses \MainWP\Dashboard\MainWP_Menu
108 + * @uses \MainWP\Dashboard\MainWP_Meta_Boxes
109 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::init_cron_jobs()
110 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs
111 + * @uses \MainWP\Dashboard\MainWP_System_Handler
112 + * @uses \MainWP\Dashboard\MainWP_System_Utility::get_class_name()
113 + * @uses \MainWP\Dashboard\MainWP_System_View::get_class_name()
114 + * @uses \MainWP\Dashboard\MainWP_UI::get_class_name()
115 + * @uses \MainWP\Dashboard\MainWP_WP_CLI_Command::init()
116 + * @uses \MainWP\Dashboard\MainWP_Updates_Overview::init()
117 + * @uses \MainWP\Dashboard\MainWP_Extensions::init()
118 + * @uses \MainWP\Dashboard\MainWP_Extensions_Handler::get_class_name()
119 + * @uses \MainWP\Dashboard\MainWP_Install_Bulk::init()
120 + * @uses \MainWP\Dashboard\MainWP_Manage_Backups::init()
121 + * @uses \MainWP\Dashboard\MainWP_Manage_Sites::init()
122 + * @uses \MainWP\Dashboard\MainWP_Overview::get()
123 + * @uses \MainWP\Dashboard\MainWP_Page::init()
124 + * @uses \MainWP\Dashboard\MainWP_Plugins::init()
125 + * @uses \MainWP\Dashboard\MainWP_Post::init()
126 + * @uses \MainWP\Dashboard\MainWP_Settings::init()
127 + * @uses \MainWP\Dashboard\MainWP_Themes::init()
128 + * @uses \MainWP\Dashboard\MainWP_Updates::init()
129 + * @uses \MainWP\Dashboard\MainWP_User::init()
130 + * @uses \MainWP\Dashboard\MainWP_Updates::init()
131 + * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
132 + */
133 + public function __construct( $mainwp_plugin_file ) { //phpcs:ignore -- NOSONAR - complex.
134 + static::$instance = $this;
124 135
125 - $this->load_all_options();
136 + MainWP_Execution_Helper::instance()->init_exec_time();
126 137
127 - $this->update_install();
128 - $this->plugin_slug = plugin_basename( $mainwp_plugin_file );
138 + $includer = new MainWP_Includes();
139 + $includer->includes();
129 140
130 - do_action( 'mainwp_system_init' );
141 + MainWP_Keys_Manager::auto_load_files();
142 + MainWP_Keys_Manager::register_migration_hooks();
131 143
132 - // includes rest api work.
133 - require 'class-mainwp-rest-api.php';
134 - Rest_Api::instance()->init();
144 + $this->load_all_options();
135 145
136 - if ( is_admin() ) {
137 - include_once ABSPATH . 'wp-admin' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'plugin.php';
138 - $pluginData = get_plugin_data( $mainwp_plugin_file, true, false ); // to fix issue of user language setting.
139 - $this->current_version = $pluginData['Version'];
140 - $currentVersion = get_option( 'mainwp_plugin_version' );
146 + $this->update_install();
147 + $this->plugin_slug = plugin_basename( $mainwp_plugin_file );
141 148
142 - if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '4.0', '<' ) && version_compare( $this->current_version, '4.0', '>=' ) ) {
143 - add_action( 'mainwp_before_header', array( MainWP_System_View::get_class_name(), 'mainwp_4_update_notice' ) );
144 - }
149 + add_action( 'shutdown', array( $this, 'hook_wp_shutdown' ) );
145 150
146 - if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '5.0', '<' ) && version_compare( $this->current_version, '5.0', '>=' ) ) {
147 - add_action( 'mainwp_before_header', array( MainWP_System_View::get_class_name(), 'mainwp_ver5_update_notice' ) );
148 - }
151 + do_action( 'mainwp_system_init' );
149 152
150 - if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '5.0.2', '<' ) && version_compare( $this->current_version, '5.0.2', '>=' ) ) {
151 - add_action( 'mainwp_before_header', array( MainWP_System_View::get_class_name(), 'mainwp_ver502_update_notice' ) );
152 - }
153 + if ( is_admin() ) {
154 + include_once ABSPATH . 'wp-admin' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'plugin.php'; // NOSONAR - WP compatible.
155 + $pluginData = get_plugin_data( $mainwp_plugin_file, true, false ); // to fix issue of user language setting.
156 + $this->current_version = $pluginData['Version'];
157 + $currentVersion = get_option( 'mainwp_plugin_version' );
153 158
154 - MainWP_Utility::update_option( 'mainwp_plugin_version', $this->current_version );
155 - }
159 + if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '4.0', '<' ) && version_compare( $this->current_version, '4.0', '>=' ) ) {
160 + add_action( 'mainwp_after_header', array( MainWP_System_View::get_class_name(), 'mainwp_4_update_notice' ) );
161 + }
156 162
157 - if ( ! defined( 'MAINWP_VERSION' ) ) {
163 + if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '5.0', '<' ) && version_compare( $this->current_version, '5.0', '>=' ) ) {
164 + add_action( 'mainwp_after_header', array( MainWP_System_View::get_class_name(), 'mainwp_ver5_update_notice' ) );
165 + }
158 166
159 - /**
160 - * Defines MainWP Version.
161 - *
162 - * @const ( string )
163 - * @source https://code-reference.mainwp.com/classes/MainWP.Dashboard.MainWP_System.html
164 - */
165 - define( 'MAINWP_VERSION', $this->current_version );
166 - }
167 + if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '5.0.2', '<' ) && version_compare( $this->current_version, '5.0.2', '>=' ) ) {
168 + add_action( 'mainwp_after_header', array( MainWP_System_View::get_class_name(), 'mainwp_ver502_update_notice' ) );
169 + }
167 170
168 - if ( get_option( 'mainwp_setting_demo_mode_enabled' ) ) {
169 - if ( ! defined( 'MAINWP_DEMO_MODE' ) ) {
170 - define( 'MAINWP_DEMO_MODE', true );
171 - }
172 - }
171 + // Use 6.0.12 as the lower bound so 6.1-er.x builds trigger this notice.
172 + if ( ! empty( $currentVersion ) && version_compare( $currentVersion, '6.1', '<' ) && version_compare( $currentVersion, '6.0.12', '>' ) ) {
173 + add_action( 'mainwp_after_header', array( MainWP_System_View::get_class_name(), 'mainwp_ver61_update_notice' ) );
174 + }
173 175
174 - $ssl_api_verifyhost = ( ( get_option( 'mainwp_api_sslVerifyCertificate' ) === false ) || ( 1 === (int) get_option( 'mainwp_api_sslVerifyCertificate' ) ) ) ? 1 : 0;
175 - if ( empty( $ssl_api_verifyhost ) ) {
176 - add_filter(
177 - 'http_request_args',
178 - array(
179 - MainWP_Extensions_Handler::get_class_name(),
180 - 'no_ssl_filter_extension_upgrade',
181 - ),
182 - 99,
183 - 2
184 - );
185 - }
176 + MainWP_Utility::update_option( 'mainwp_plugin_version', $this->current_version );
177 + }
186 178
187 - MainWP_Extensions::init();
188 - MainWP_Extensions_Groups::init();
179 + if ( ! defined( 'MAINWP_VERSION' ) ) {
189 180
190 - $systemHandler = MainWP_System_Handler::instance();
181 + /**
182 + * Defines MainWP Version.
183 + *
184 + * @const ( string )
185 + * @source https://code-reference.mainwp.com/classes/MainWP.Dashboard.MainWP_System.html
186 + */
187 + define( 'MAINWP_VERSION', $this->current_version );
188 + }
191 189
192 - add_action( 'plugins_loaded', array( &$this, 'localization' ) );
193 - add_filter( 'site_transient_update_plugins', array( $systemHandler, 'check_update_custom' ) );
194 - add_filter( 'pre_set_site_transient_update_plugins', array( $systemHandler, 'pre_check_update_custom' ) );
195 - add_filter( 'plugins_api', array( $systemHandler, 'plugins_api_extension_info' ), 10, 3 );
196 - add_filter( 'plugins_api_result', array( $systemHandler, 'plugins_api_wp_plugins_api_result' ), 10, 3 );
190 + if ( get_option( 'mainwp_setting_demo_mode_enabled' ) && ! defined( 'MAINWP_DEMO_MODE' ) ) {
191 + define( 'MAINWP_DEMO_MODE', true );
192 + }
197 193
198 - $this->metaboxes = new MainWP_Meta_Boxes();
194 + $ssl_api_verifyhost = ( ( get_option( 'mainwp_api_sslVerifyCertificate' ) === false ) || ( 1 === (int) get_option( 'mainwp_api_sslVerifyCertificate' ) ) ) ? 1 : 0;
195 + if ( empty( $ssl_api_verifyhost ) ) {
196 + add_filter(
197 + 'http_request_args',
198 + array(
199 + MainWP_Extensions_Handler::get_class_name(),
200 + 'no_ssl_filter_extension_upgrade',
201 + ),
202 + 99,
203 + 2
204 + );
205 + }
199 206
200 - MainWP_Overview::get();
201 - MainWP_Client_Overview::instance();
207 + MainWP_Extensions::init();
208 + MainWP_Extensions_Groups::init();
202 209
203 - MainWP_Manage_Sites::init();
204 - new MainWP_Hooks();
205 - new MainWP_Menu();
210 + $systemHandler = MainWP_System_Handler::instance();
206 211
207 - add_action( 'admin_menu', array( MainWP_Menu::get_class_name(), 'init_mainwp_menus' ) );
208 - add_filter( 'admin_footer', array( &$this, 'admin_footer' ), 15 );
209 - add_action( 'admin_head', array( MainWP_System_View::get_class_name(), 'admin_head' ) );
210 - add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_styles' ) );
211 - add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) );
212 - add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts_fix_conflict' ), 9 );
213 - add_action( 'admin_body_class', array( MainWP_System_View::get_class_name(), 'admin_body_class' ) );
212 + add_action( 'init', array( &$this, 'localization' ) );
213 + add_filter( 'site_transient_update_plugins', array( $systemHandler, 'check_update_custom' ) ); // phpcs:ignore PluginCheck.CodeAnalysis.Sniffs.UpdatingPluginTransientFound -- not a self-updater; injects update data exclusively for licensed MainWP premium extensions (hosted on mainwp.com), not for the Dashboard plugin itself.
214 + add_filter( 'pre_set_site_transient_update_plugins', array( $systemHandler, 'pre_check_update_custom' ) ); // phpcs:ignore PluginCheck.CodeAnalysis.Sniffs.UpdatingPluginTransientFound -- same as above; pre-populates update info for MainWP premium extensions before WordPress saves the transient.
215 + add_filter( 'plugins_api', array( $systemHandler, 'plugins_api_extension_info' ), 10, 3 );
216 + add_filter( 'plugins_api_result', array( $systemHandler, 'plugins_api_wp_plugins_api_result' ), 10, 3 );
217 + add_filter( 'upgrader_pre_download', array( $systemHandler, 'hook_refresh_trusted_extension_package_url' ), 10, 4 );
214 218
215 - new MainWP_Bulk_Post();
219 + $this->metaboxes = new MainWP_Meta_Boxes();
216 220
217 - add_action( 'admin_init', array( &$this, 'admin_init' ), 20 );
218 - add_action( 'admin_init', array( $this, 'hook_admin_update_check' ) );
219 - add_action( 'after_setup_theme', array( &$this, 'after_setup_theme' ) );
221 + MainWP_Overview::get();
222 + MainWP_Client_Overview::instance();
220 223
221 - add_action( 'init', array( &$this, 'parse_init' ) );
222 - add_action( 'init', array( &$this, 'init' ), 9999 );
223 - add_action( 'admin_init', array( $this, 'admin_redirects' ) );
224 - add_action( 'admin_menu', array( &$this, 'admin_menu' ) );
225 - add_action( 'admin_print_styles', array( MainWP_System_View::get_class_name(), 'admin_print_styles' ) );
224 + MainWP_Manage_Sites::init();
225 + MainWP_Uptime_Monitoring_Handle::instance();
226 226
227 - add_action( 'wp_logout', array( &$this, 'clear_sessions' ) );
227 + MainWP_Hooks::get_instance();
228 + MainWP_Menu::get_instance();
228 229
229 - MainWP_Install_Bulk::init();
230 + add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ), 9 );
231 + add_action( 'admin_menu', array( MainWP_Menu::get_class_name(), 'init_mainwp_menus' ) );
232 + add_filter( 'admin_footer', array( &$this, 'admin_footer' ), 15 );
233 + add_action( 'admin_head', array( MainWP_System_View::get_class_name(), 'admin_head' ) );
234 + add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_styles' ) );
235 + add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) );
236 + add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts_fix_conflict' ), 9 );
237 + add_action( 'admin_body_class', array( MainWP_System_View::get_class_name(), 'admin_body_class' ) );
230 238
231 - MainWP_System_Cron_Jobs::instance()->init_cron_jobs();
239 + MainWP_Bulk_Post::get_instance();
232 240
233 - add_action( 'mainwp_before_header', array( MainWP_System_View::get_class_name(), 'admin_notices' ) );
234 - add_action( 'admin_notices', array( MainWP_System_View::get_class_name(), 'wp_admin_notices' ) );
235 - add_action( 'wp_mail_failed', array( &$this, 'wp_mail_failed' ) );
241 + add_action( 'admin_init', array( &$this, 'admin_init' ), 20 );
242 + add_action( 'admin_init', array( $this, 'hook_admin_update_check' ) );
243 + add_action( 'admin_init', array( $this, 'admin_init_update' ) );
244 + add_action( 'after_setup_theme', array( &$this, 'after_setup_theme' ) );
236 245
237 - add_action( 'after_plugin_row', array( MainWP_System_View::get_class_name(), 'after_extensions_plugin_row' ), 10, 3 );
246 + add_action( 'init', array( &$this, 'parse_init' ) );
247 + add_action( 'init', array( &$this, 'init_jobs' ) );
248 + add_action( 'init', array( &$this, 'init' ), 9999 );
238 249
239 - add_filter( 'mainwp-activated-check', array( &$this, 'activated_check' ) ); // @deprecated Use 'mainwp_activated_check' instead.
240 - add_filter( 'mainwp_activated_check', array( &$this, 'activated_check' ) );
250 + add_action( 'admin_init', array( $this, 'admin_redirects' ) );
251 + add_action( 'current_screen', array( &$this, 'current_screen_redirects' ), 15 );
252 + add_filter( 'plugin_action_links', array( $this, 'hook_plugin_action_links' ), 10, 4 );
253 + add_action( 'admin_menu', array( &$this, 'admin_menu' ) );
254 + add_action( 'admin_print_styles', array( MainWP_System_View::get_class_name(), 'admin_print_styles' ) );
241 255
242 - do_action_deprecated( 'mainwp-activated', array(), '4.0.7.2', 'mainwp_activated' ); // @deprecated Use 'mainwp_activated' instead.
256 + add_action( 'wp_logout', array( &$this, 'clear_sessions' ) );
243 257
244 - /**
245 - * Action: mainwp_activated
246 - *
247 - * Fires upon MainWP plugin activation.
248 - *
249 - * @since Unknown
250 - */
251 - do_action( 'mainwp_activated' );
258 + MainWP_Install_Bulk::init();
252 259
253 - MainWP_Updates::init();
254 - MainWP_Post::init();
255 - MainWP_Settings::init();
256 - if ( get_option( 'mainwp_enableLegacyBackupFeature' ) ) {
257 - MainWP_Manage_Backups::init();
258 - }
259 - MainWP_Manage_Groups::init();
260 - MainWP_User::init();
261 - MainWP_Page::init();
262 - MainWP_Themes::init();
263 - MainWP_Plugins::init();
264 - MainWP_Updates_Overview::init();
265 - MainWP_Client::init();
266 - MainWP_Rest_Api_Page::init();
267 - MainWP_Non_MainWP_Actions::instance();
260 + add_action( 'mainwp_after_header', array( MainWP_System_View::get_class_name(), 'admin_notices' ) );
261 + add_action( 'admin_notices', array( MainWP_System_View::get_class_name(), 'wp_admin_notices' ) );
262 + add_action( 'wp_mail_failed', array( &$this, 'wp_mail_failed' ) );
268 263
269 - if ( defined( 'WP_CLI' ) && WP_CLI ) {
270 - MainWP_WP_CLI_Command::init();
271 - }
272 - if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
273 - if ( isset( $_GET['mainwp_run'] ) && 'test' === $_GET['mainwp_run'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
274 - add_action( 'init', array( MainWP_System_Cron_Jobs::instance(), 'cron_active' ), PHP_INT_MAX );
275 - }
276 - }
277 - }
264 + add_action( 'after_plugin_row', array( MainWP_System_View::get_class_name(), 'after_extensions_plugin_row' ), 10, 3 );
278 265
279 - /**
280 - * Method get_dashboard_version()
281 - *
282 - * Get dashboard version.
283 - *
284 - * @return string $version Version.
285 - */
286 - public function get_dashboard_version() {
287 - return self::$version;
288 - }
266 + add_filter( 'mainwp-activated-check', array( &$this, 'activated_check' ) ); // @deprecated Use 'mainwp_activated_check' instead.
267 + add_filter( 'mainwp_activated_check', array( &$this, 'activated_check' ) );
289 268
290 - /**
291 - * Method load_all_options()
292 - *
293 - * Load all wp_options data.
294 - *
295 - * @return array $alloptions Array of all options.
296 - */
297 - public function load_all_options() {
269 + do_action_deprecated( 'mainwp-activated', array(), '4.0.7.2', 'mainwp_activated' ); // @deprecated Use 'mainwp_activated' instead. NOSONAR - not IP.
298 270
299 - /**
300 - * WordPress Database instance.
301 - *
302 - * @global object $wpdb
303 - */
304 - global $wpdb;
271 + /**
272 + * Action: mainwp_activated
273 + *
274 + * Fires upon MainWP plugin activation.
275 + *
276 + * @since Unknown
277 + */
278 + do_action( 'mainwp_activated' );
305 279
306 - if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) {
307 - $alloptions = wp_cache_get( 'alloptions', 'options' );
308 - } else {
309 - $alloptions = false;
310 - }
280 + MainWP_Updates::init();
281 + MainWP_Post::init();
282 + MainWP_Settings::init();
283 + if ( get_option( 'mainwp_enableLegacyBackupFeature' ) ) {
284 + MainWP_Manage_Backups::init();
285 + }
286 + MainWP_Manage_Groups::init();
287 + MainWP_User::init();
288 + MainWP_Password_Policy_Settings::init();
289 + MainWP_Page::init();
290 + MainWP_Themes::init();
291 + MainWP_Plugins::init();
292 + MainWP_Updates_Overview::init();
293 + MainWP_Client::init();
294 + MainWP_Rest_Api_Page::init();
295 + MainWP_Logger::instance();
311 296
312 - if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) {
313 - $notoptions = wp_cache_get( 'notoptions', 'options' );
314 - } else {
315 - $notoptions = false;
316 - }
297 + if ( class_exists( '\MainWP\Dashboard\Module\Log\Log_Manage_Insights_Events_Page' ) ) {
298 + Log_Manage_Insights_Events_Page::instance();
299 + }
317 300
318 - if ( ! isset( $alloptions['mainwp_db_version'] ) ) {
319 - $suppress = $wpdb->suppress_errors();
320 - $options = array(
321 - 'mainwp_db_version',
322 - 'mainwp_plugin_version',
323 - 'mainwp_upgradeVersionInfo',
324 - 'mainwp_extensions',
325 - 'mainwp_activated',
326 - 'mainwp_api_sslVerifyCertificate',
327 - 'mainwp_automaticDailyUpdate',
328 - 'mainwp_backup_before_upgrade',
329 - 'mainwp_enableLegacyBackupFeature',
330 - 'mainwp_maximumInstallUpdateRequests',
331 - 'mainwp_maximumSyncRequests',
332 - 'mainwp_primaryBackup',
333 - 'mainwp_security',
334 - 'mainwp_use_favicon',
335 - 'mainwp_wp_cron',
336 - 'mainwp_timeDailyUpdate',
337 - 'mainwp_frequencyDailyUpdate',
338 - 'mainwp_delay_autoupdate',
339 - 'mainwp_wpcreport_extension',
340 - 'mainwp_daily_digest_plain_text',
341 - 'mainwp_hide_update_everything',
342 - 'mainwp_disable_update_confirmations',
343 - 'mainwp_settings_show_widgets',
344 - 'mainwp_clients_show_widgets',
345 - 'mainwp_settings_show_manage_sites_columns',
346 - 'mainwp_disableSitesChecking',
347 - 'mainwp_disableSitesHealthMonitoring',
348 - 'mainwp_frequencySitesChecking',
349 - 'mainwp_sitehealthThreshold',
350 - 'mainwp_settings_notification_emails',
351 - 'mainwp_ignore_HTTP_response_status',
352 - 'mainwp_check_http_response',
353 - 'mainwp_extmenu',
354 - 'mainwp_opensslLibLocation',
355 - 'mainwp_notice_wp_mail_failed',
356 - 'mainwp_show_language_updates',
357 - 'mainwp_logger_check_daily',
358 - 'mainwp_site_actions_notification_enable',
359 - 'mainwp_update_check_version',
360 - 'mainwp_setting_demo_mode_enabled',
361 - 'mainwp_log_wait_lasttime',
362 - 'mainwp_updatescheck_start_last_schedule_timestamp',
363 - 'mainwp_cron_license_deactivated_alert_lasttime',
364 - );
301 + MainWP_Uptime_Monitoring_Schedule::instance();
365 302
366 - $options = apply_filters( 'mainwp_init_load_all_options', $options );
303 + if ( defined( 'WP_CLI' ) && WP_CLI ) {
304 + MainWP_WP_CLI_Command::init();
305 + }
306 + MainWP_Unhooks_Helper::instance();
307 + MainWP_Cache_Warm_Helper::instance();
308 + MainWP_System_Utility::instance();
367 309
368 - $query = "SELECT option_name, option_value FROM $wpdb->options WHERE option_name in (";
369 - foreach ( $options as $option ) {
370 - $query .= "'" . $option . "', ";
371 - }
372 - $query = substr( $query, 0, strlen( $query ) - 2 );
373 - $query .= ")"; // phpcs:ignore -- ignore double quotes auto-correction.
374 - $alloptions_db = $wpdb->get_results( $query ); // phpcs:ignore -- unprepared SQL ok.
375 - $wpdb->suppress_errors( $suppress );
376 - if ( ! is_array( $alloptions ) ) {
377 - $alloptions = array();
378 - }
379 - if ( is_array( $alloptions_db ) ) {
380 - foreach ( (array) $alloptions_db as $o ) {
381 - $alloptions[ $o->option_name ] = $o->option_value;
382 - unset( $options[ array_search( $o->option_name, $options ) ] );
383 - }
384 - if ( ! is_array( $notoptions ) ) {
385 - $notoptions = array();
386 - }
387 - foreach ( $options as $option ) {
388 - $notoptions[ $option ] = true;
389 - }
390 - if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) {
391 - wp_cache_set( 'alloptions', $alloptions, 'options' );
392 - wp_cache_set( 'notoptions', $notoptions, 'options' );
393 - }
394 - }
395 - }
310 + add_action(
311 + 'wp_ajax_nopriv_mainwp_self_connect',
312 + array( MainWP_Post_Handler::instance(), 'ajax_self_connect' )
313 + );
314 + }
396 315
397 - return $alloptions;
398 - }
316 + /**
317 + * Method get_dashboard_version()
318 + *
319 + * Get dashboard version.
320 + *
321 + * @return string $version Version.
322 + */
323 + public function get_dashboard_version() {
324 + return static::$version;
325 + }
399 326
400 - /**
401 - * Method localization()
402 - *
403 - * Loads plugin language files.
404 - */
405 - public function localization() {
406 - $load = apply_filters( 'mainwp_load_text_domain', true );
407 - if ( $load ) {
408 - load_plugin_textdomain( 'mainwp', false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' );
409 - }
410 - }
327 + /**
328 + * Method get_mainwp_version()
329 + *
330 + * Get dashboard version.
331 + *
332 + * @return string $version Version.
333 + */
334 + public static function get_mainwp_version() { //phpcs:ignore -- NOSONAR same function body.
335 + return static::$version;
336 + }
411 337
412 - /**
413 - * Method wp_mail_failed()
414 - *
415 - * Check if there has been a wp mail failer.
416 - *
417 - * @param string $error Array of error messages.
418 - *
419 - * @uses \MainWP\Dashboard\MainWP_Logger::debug()
420 - * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
421 - */
422 - public function wp_mail_failed( $error ) {
423 - $mail_failed = get_option( 'mainwp_notice_wp_mail_failed' );
424 - if ( is_object( $error ) && empty( $mail_failed ) ) {
425 - MainWP_Utility::update_option( 'mainwp_notice_wp_mail_failed', 'yes' );
426 - $er = $error->get_error_message();
427 - if ( ! empty( $er ) ) {
428 - MainWP_Logger::instance()->debug( 'Error :: wp_mail :: [error=' . $er . ']' );
429 - }
430 - }
431 - }
338 + /**
339 + * Method load_all_options()
340 + *
341 + * Load all wp_options data.
342 + *
343 + * @return array $alloptions Array of all options.
344 + */
345 + public function load_all_options() { //phpcs:ignore -- NOSONAR - complex.
432 346
433 - /**
434 - * Method get_version()
435 - *
436 - * Get current plugin version.
437 - *
438 - * @return string Current plugin version.
439 - */
440 - public function get_version() {
441 - return $this->current_version;
442 - }
347 + /**
348 + * WordPress Database instance.
349 + *
350 + * @global object $wpdb
351 + */
352 + global $wpdb;
443 353
444 - /**
445 - * Method mainwp_cronpingchilds_action()
446 - *
447 - * Run cron ping child's action.
448 - *
449 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_ping_childs()
450 - */
451 - public function mainwp_cronpingchilds_action() {
452 - MainWP_System_Cron_Jobs::instance()->cron_ping_childs();
453 - }
354 + if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) {
355 + $alloptions = wp_cache_get( 'alloptions', 'options' );
356 + } else {
357 + $alloptions = false;
358 + }
454 359
455 - /**
456 - * Method mainwp_cronbackups_continue_action()
457 - *
458 - * Run cron backups continue action.
459 - *
460 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_backups_continue()
461 - */
462 - public function mainwp_cronbackups_continue_action() {
463 - MainWP_System_Cron_Jobs::instance()->cron_backups_continue();
464 - }
360 + if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) {
361 + $notoptions = wp_cache_get( 'notoptions', 'options' );
362 + } else {
363 + $notoptions = false;
364 + }
465 365
466 - /**
467 - * Method mainwp_cronbackups_action()
468 - *
469 - * Run cron backups action.
470 - *
471 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_backups()
472 - */
473 - public function mainwp_cronbackups_action() {
474 - MainWP_System_Cron_Jobs::instance()->cron_backups();
475 - }
366 + if ( ! isset( $alloptions['mainwp_db_version'] ) ) {
367 + $suppress = $wpdb->suppress_errors();
368 + $options = array(
369 + 'mainwp_db_version',
370 + 'mainwp_plugin_version',
371 + 'mainwp_upgradeVersionInfo',
372 + 'mainwp_extensions',
373 + 'mainwp_activated',
374 + 'mainwp_api_sslVerifyCertificate',
375 + 'mainwp_automaticDailyUpdate',
376 + 'mainwp_pluginAutomaticDailyUpdate',
377 + 'mainwp_themeAutomaticDailyUpdate',
378 + 'mainwp_backup_before_upgrade',
379 + 'mainwp_enableLegacyBackupFeature',
380 + 'mainwp_maximumInstallUpdateRequests',
381 + 'mainwp_maximumSyncRequests',
382 + 'mainwp_primaryBackup',
383 + 'mainwp_use_favicon',
384 + 'mainwp_wp_cron',
385 + 'mainwp_timeDailyUpdate',
386 + 'mainwp_frequencyDailyUpdate',
387 + 'mainwp_delay_autoupdate',
388 + 'mainwp_wpcreport_extension',
389 + 'mainwp_daily_digest_plain_text',
390 + 'mainwp_hide_update_everything',
391 + 'mainwp_disable_update_confirmations',
392 + 'mainwp_settings_show_widgets',
393 + 'mainwp_clients_show_widgets',
394 + 'mainwp_settings_show_manage_sites_columns',
395 + 'mainwp_individual_uptime_monitoring_schedule_enabled',
396 + 'mainwp_disableSitesHealthMonitoring',
397 + 'mainwp_sitehealthThreshold',
398 + 'mainwp_check_http_response',
399 + 'mainwp_extmenu',
400 + 'mainwp_opensslLibLocation',
401 + 'mainwp_notice_wp_mail_failed',
402 + 'mainwp_show_language_updates',
403 + 'mainwp_logger_check_daily',
404 + 'mainwp_site_actions_notification_enable',
405 + 'mainwp_update_check_version',
406 + 'mainwp_admin_init_update_data',
407 + 'mainwp_setting_demo_mode_enabled',
408 + 'mainwp_log_wait_lasttime',
409 + 'mainwp_cron_license_deactivated_alert_lasttime',
410 + 'mainwp_updatescheck_is_running',
411 + 'mainwp_automatic_updates_is_running',
412 + 'mainwp_frequency_AutoUpdate',
413 + 'mainwp_batch_updates_is_running',
414 + 'mainwp_batch_individual_updates_is_running',
415 + 'mainwp_maximum_uptime_monitoring_requests',
416 + 'mainwp_actionlogs',
417 + 'mainwp_process_uptime_notification_run_status',
418 + 'mainwp_warm_cache_pages_ttl',
419 + 'mainwp_module_log_settings_logs_selection_data',
420 + );
476 421
477 - /**
478 - * Method mainwp_cronreconnect_action()
479 - *
480 - * Run cron stats action.
481 - *
482 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_reconnect()
483 - */
484 - public function mainwp_cronreconnect_action() {
485 - MainWP_System_Cron_Jobs::instance()->cron_reconnect();
486 - }
422 + $options = apply_filters( 'mainwp_init_load_all_options', $options );
487 423
488 - /**
489 - * Method mainwp_cronupdatescheck_action()
490 - *
491 - * Run cron updates check action.
492 - *
493 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_updates_check()
494 - */
495 - public function mainwp_cronupdatescheck_action() {
496 - MainWP_System_Cron_Jobs::instance()->cron_updates_check();
497 - }
424 + $query = "SELECT option_name, option_value FROM $wpdb->options WHERE option_name in (";
425 + foreach ( $options as $option ) {
426 + $query .= "'" . $option . "', ";
427 + }
428 + $query = substr( $query, 0, strlen( $query ) - 2 );
429 + $query .= ")"; // phpcs:ignore -- ignore double quotes auto-correction.
430 + $alloptions_db = $wpdb->get_results( $query ); // phpcs:ignore -- unprepared SQL ok.
431 + $wpdb->suppress_errors( $suppress );
432 + if ( ! is_array( $alloptions ) ) {
433 + $alloptions = array();
434 + }
435 + if ( is_array( $alloptions_db ) ) {
436 + foreach ( (array) $alloptions_db as $o ) {
437 + $alloptions[ $o->option_name ] = $o->option_value;
438 + unset( $options[ array_search( $o->option_name, $options ) ] );
439 + }
440 + if ( ! is_array( $notoptions ) ) {
441 + $notoptions = array();
442 + }
443 + foreach ( $options as $option ) {
444 + $notoptions[ $option ] = true;
445 + }
446 + if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) {
447 + wp_cache_set( 'alloptions', $alloptions, 'options' );
448 + wp_cache_set( 'notoptions', $notoptions, 'options' );
449 + }
450 + }
451 + }
498 452
499 - /**
500 - * Method mainwp_crondeactivatedlicensesalert_action()
501 - *
502 - * Run cron activated licenses alert action.
503 - */
504 - public function mainwp_crondeactivatedlicensesalert_action() {
505 - MainWP_System_Cron_Jobs::instance()->cron_deactivated_licenses_alert();
506 - }
453 + return $alloptions;
454 + }
507 455
508 - /**
509 - * Method mainwp_croncheckstatus_action()
510 - *
511 - * Run cron check sites status action.
512 - *
513 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_check_websites_status()
514 - */
515 - public function mainwp_croncheckstatus_action() {
516 - MainWP_System_Cron_Jobs::instance()->cron_check_websites_status();
517 - }
456 + /**
457 + * Method localization()
458 + *
459 + * Loads plugin language files.
460 + */
461 + public function localization() {
462 + $load = apply_filters( 'mainwp_load_text_domain', true );
463 + if ( $load ) {
464 + load_plugin_textdomain( 'mainwp', false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' ); // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound -- kept for older WP versions (<4.6) and to support local/custom translation files loaded from the plugin's languages directory.
465 + }
466 + }
518 467
519 - /**
520 - * Method mainwp_cronchecksitehealth_action()
521 - *
522 - * Run cron check sites health action.
523 - *
524 - * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_check_websites_health()
525 - */
526 - public function mainwp_cronchecksitehealth_action() {
527 - MainWP_System_Cron_Jobs::instance()->cron_check_websites_health();
528 - }
529 468
530 - /**
531 - * Method is_mainwp_pages()
532 - *
533 - * Get the current page and check it for "mainwp_".
534 - *
535 - * @return boolean ture|false.
536 - */
537 - public static function is_mainwp_pages() {
538 - $screen = get_current_screen();
539 - if ( $screen && strpos( $screen->base, 'mainwp_' ) !== false && strpos( $screen->base, 'mainwp_child_tab' ) === false ) {
540 - return true;
541 - }
469 + /**
470 + * Method wp_mail_failed()
471 + *
472 + * Check if there has been a wp mail failer.
473 + *
474 + * @param string $error Array of error messages.
475 + *
476 + * @uses \MainWP\Dashboard\MainWP_Logger::debug()
477 + * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
478 + */
479 + public function wp_mail_failed( $error ) {
480 + $mail_failed = get_option( 'mainwp_notice_wp_mail_failed' );
481 + if ( is_object( $error ) && empty( $mail_failed ) ) {
482 + MainWP_Utility::update_option( 'mainwp_notice_wp_mail_failed', 'yes' );
483 + $er = $error->get_error_message();
484 + if ( ! empty( $er ) ) {
485 + MainWP_Logger::instance()->debug( 'Error :: wp_mail :: [error=' . $er . ']' );
486 + }
487 + }
488 + }
542 489
543 - return false;
544 - }
490 + /**
491 + * Method get_version()
492 + *
493 + * Get current plugin version.
494 + *
495 + * @return string Current plugin version.
496 + */
497 + public function get_version() {
498 + return $this->current_version;
499 + }
545 500
546 - /**
547 - * Method is_mainwp_site_page()
548 - *
549 - * Checks if the current page is under the site mode.
550 - *
551 - * @return boolean ture|false.
552 - */
553 - public static function is_mainwp_site_page() {
554 - //phpcs:disable WordPress.Security.NonceVerification.Recommended
555 - if ( isset( $_GET['page'] ) && 'CostTrackerAdd' !== $_GET['page'] ) {
556 - if ( ( isset( $_GET['id'] ) && ! empty( $_GET['id'] ) ) || ( isset( $_GET['dashboard'] ) && ! empty( $_GET['dashboard'] ) ) || ( isset( $_GET['updateid'] ) && ! empty( $_GET['updateid'] ) ) || ( isset( $_GET['emailsettingsid'] ) && ! empty( $_GET['emailsettingsid'] ) ) || ( isset( $_GET['scanid'] ) && ! empty( $_GET['scanid'] ) ) ) {
557 - return true;
558 - } elseif ( 'ServerInformation' === $_GET['page'] || 'ServerInformationCron' === $_GET['page'] || 'ErrorLog' === $_GET['page'] || 'ActionLogs' === $_GET['page'] || 'PluginPrivacy' === $_GET['page'] ) {
559 - return true;
560 - } elseif ( 'Settings' === $_GET['page'] || 'SettingsAdvanced' === $_GET['page'] || 'SettingsEmail' === $_GET['page'] || 'MainWPTools' === $_GET['page'] || 'SettingsInsights' === $_GET['page'] || 'SettingsApiBackups' === $_GET['page'] ) {
561 - return true;
562 - }
563 - }
564 - //phpcs:enable
565 - return false;
566 - }
501 + /**
502 + * Method mainwp_cronpingchilds_action()
503 + *
504 + * Run cron ping child's action.
505 + *
506 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_ping_childs()
507 + */
508 + public function mainwp_cronpingchilds_action() {
509 + MainWP_System_Cron_Jobs::instance()->cron_ping_childs();
510 + }
567 511
568 - /**
569 - * Method init()
570 - *
571 - * Instantiate Plugin.
572 - */
573 - public function init() {
512 + /**
513 + * Method mainwp_cronbackups_continue_action()
514 + *
515 + * Run cron backups continue action.
516 + *
517 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_backups_continue()
518 + */
519 + public function mainwp_cronbackups_continue_action() {
520 + MainWP_System_Cron_Jobs::instance()->cron_backups_continue();
521 + }
574 522
575 - /**
576 - * MainWP disabled menu items array.
577 - *
578 - * @global object $_mainwp_disable_menus_items
579 - */
580 - global $_mainwp_disable_menus_items;
523 + /**
524 + * Method mainwp_cronbackups_action()
525 + *
526 + * Run cron backups action.
527 + *
528 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_backups()
529 + */
530 + public function mainwp_cronbackups_action() {
531 + MainWP_System_Cron_Jobs::instance()->cron_backups();
532 + }
581 533
582 - $_mainwp_disable_menus_items = apply_filters( 'mainwp_disablemenuitems', $_mainwp_disable_menus_items );
534 + /**
535 + * Method mainwp_cronreconnect_action()
536 + *
537 + * Run cron stats action.
538 + *
539 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_reconnect()
540 + */
541 + public function mainwp_cronreconnect_action() {
542 + MainWP_System_Cron_Jobs::instance()->cron_reconnect();
543 + }
583 544
584 - /**
585 - * Filter: mainwp_main_menu_disable_menu_items
586 - *
587 - * Filters disabled MainWP navigation items.
588 - *
589 - * @since Unknown
590 - */
591 - $_mainwp_disable_menus_items = apply_filters( 'mainwp_main_menu_disable_menu_items', $_mainwp_disable_menus_items );
545 + /**
546 + * Method mainwp_cronupdatescheck_action()
547 + *
548 + * Run cron updates check action.
549 + *
550 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_updates_check()
551 + */
552 + public function mainwp_cronupdatescheck_action() {
553 + MainWP_System_Cron_Jobs::instance()->cron_updates_check();
554 + }
592 555
593 - if ( ! function_exists( 'MainWP\Dashboard\mainwp_current_user_have_right' ) ) {
556 + /**
557 + * Method mainwp_cron_uptime_monitoring_check_action()
558 + *
559 + * Run cron uptime monitoring check action.
560 + */
561 + public function mainwp_cron_uptime_monitoring_check_action() {
562 + MainWP_Uptime_Monitoring_Schedule::instance()->cron_uptime_check();
563 + }
594 564
595 - /**
596 - * Method mainwp_current_user_have_right()
597 - *
598 - * Check permission level by hook mainwp_currentusercan of Team Control extension.
599 - *
600 - * @param string $cap_type group or type of capabilities.
601 - * @param string $cap capabilities for current user.
602 - *
603 - * @return bool true|false
604 - *
605 - * @uses \MainWP\Dashboard\MainWP_System_Handler::handle_settings_post()
606 - */
607 - function mainwp_current_user_have_right( $cap_type = '', $cap = '' ) {
565 + /**
566 + * Method mainwp_cron_perform_general_schedules_action()
567 + *
568 + * Run cron uptime monitoring check action.
569 + */
570 + public function mainwp_cron_perform_general_schedules_action() {
571 + MainWP_System_Cron_Jobs::instance()->cron_perform_general_process();
572 + }
608 573
609 - /**
610 - * Current user global.
611 - *
612 - * @global string
613 - */
614 - global $current_user;
615 574
616 - if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
617 - return true;
618 - }
575 + /**
576 + * Method mainwp_crondeactivatedlicensesalert_action()
577 + *
578 + * Run cron activated licenses alert action.
579 + */
580 + public function mainwp_crondeactivatedlicensesalert_action() {
581 + MainWP_System_Cron_Jobs::instance()->cron_deactivated_licenses_alert();
582 + }
619 583
620 - if ( defined( 'WP_CLI' ) && WP_CLI ) {
621 - return true;
622 - }
584 + /**
585 + * Method mainwp_cronchecksitehealth_action()
586 + *
587 + * Run cron check sites health action.
588 + *
589 + * @uses \MainWP\Dashboard\MainWP_System_Cron_Jobs::cron_check_websites_health()
590 + */
591 + public function mainwp_cronchecksitehealth_action() {
592 + MainWP_System_Cron_Jobs::instance()->cron_check_websites_health();
593 + }
623 594
624 - if ( defined( 'MAINWP_REST_API_DOING' ) && MAINWP_REST_API_DOING ) {
625 - return true;
626 - }
595 + /**
596 + * Method is_mainwp_pages()
597 + *
598 + * Get the current page and check it for "mainwp_".
599 + *
600 + * @return boolean ture|false.
601 + */
602 + public static function is_mainwp_pages() {
603 + $screen = get_current_screen();
604 + if ( $screen && strpos( $screen->base, 'mainwp_' ) !== false && strpos( $screen->base, 'mainwp_child_tab' ) === false ) {
605 + return true;
606 + }
627 607
628 - if ( empty( $current_user ) ) {
629 - if ( ! function_exists( 'wp_get_current_user' ) ) {
630 - require_once ABSPATH . WPINC . '/pluggable.php';
631 - }
632 - }
608 + return false;
609 + }
633 610
634 - return apply_filters( 'mainwp_currentusercan', true, $cap_type, $cap );
635 - }
636 - }
611 + /**
612 + * Method is_mainwp_site_page()
613 + *
614 + * Checks if the current page is under the site mode.
615 + *
616 + * @return boolean ture|false.
617 + */
618 + public static function is_mainwp_site_page() {
619 + $is_page = false;
620 + //phpcs:disable WordPress.Security.NonceVerification.Recommended
621 + if ( isset( $_GET['page'] ) && 'CostTrackerAdd' !== $_GET['page'] && ( ( ( isset( $_GET['id'] ) && ! empty( $_GET['id'] ) ) || ( isset( $_GET['dashboard'] ) && ! empty( $_GET['dashboard'] ) ) || ( isset( $_GET['updateid'] ) && ! empty( $_GET['updateid'] ) ) || ( isset( $_GET['monitor_wpid'] ) && ! empty( $_GET['monitor_wpid'] ) ) || ( isset( $_GET['emailsettingsid'] ) && ! empty( $_GET['emailsettingsid'] ) ) || ( isset( $_GET['scanid'] ) && ! empty( $_GET['scanid'] ) ) ) || ( 'ServerInformation' === $_GET['page'] || 'ServerInformationCron' === $_GET['page'] || 'ErrorLog' === $_GET['page'] || 'ActionLogs' === $_GET['page'] || 'PluginPrivacy' === $_GET['page'] || 'Settings' === $_GET['page'] || 'SettingsAdvanced' === $_GET['page'] || 'SettingsEmail' === $_GET['page'] || 'PremiumUpdates' === $_GET['page'] || 'MainWPTools' === $_GET['page'] || 'SettingsInsights' === $_GET['page'] || 'SettingsApiBackups' === $_GET['page'] || 'MonitoringSettings' === $_GET['page'] ) ) ) {
622 + $is_page = true;
623 + }
624 + //phpcs:enable
637 625
638 - MainWP_System_Handler::instance()->handle_settings_post();
639 - }
626 + /**
627 + * Hook mainwp_is_mainwp_site_page.
628 + *
629 + * @since 5.4.1
630 + */
631 + return apply_filters( 'mainwp_is_mainwp_site_page', $is_page );
632 + }
640 633
641 - /**
642 - * Method parse_init()
643 - *
644 - * Initiate plugin installation & then run the Quick Setup Wizard.
645 - *
646 - * @uses \MainWP\Dashboard\MainWP_System_Handler::upload_file()
647 - * @uses \MainWP\Dashboard\MainWP_System_Utility::get_mainwp_dir()
648 - * @uses \MainWP\Dashboard\MainWP_System_Utility::get_wp_file_system()
649 - * @uses \MainWP\Dashboard\MainWP_System_Utility::is_admin()
650 - * @uses \MainWP\Dashboard\MainWP_Setup_Wizard()
651 - */
652 - public function parse_init() {
653 - // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
654 - if ( isset( $_GET['mwpdl'] ) && isset( $_GET['sig'] ) ) {
655 - $mwpDir = MainWP_System_Utility::get_mainwp_dir();
656 - $mwpDir = $mwpDir[0];
657 - $mwpdl = isset( $_REQUEST['mwpdl'] ) ? wp_unslash( $_REQUEST['mwpdl'] ) : '';
658 - $file = trailingslashit( $mwpDir ) . rawurldecode( $mwpdl );
659 634
660 - if ( stristr( rawurldecode( $mwpdl ), '..' ) ) {
661 - return;
662 - }
635 + /**
636 + * Method plugins_loaded()
637 + *
638 + * Load plugin text domain.
639 + */
640 + public function plugins_loaded() { // phpcs:ignore -- NOSONAR - complex.
641 + /**
642 + * Action: mainwp_system_plugins_loaded
643 + *
644 + * Fires after all plugins are loaded.
645 + *
646 + * @since 6.1.0
647 + */
648 + do_action( 'mainwp_system_plugins_loaded' );
663 649
664 - $hasWPFileSystem = MainWP_System_Utility::get_wp_file_system();
650 + if ( ! function_exists( 'MainWP\Dashboard\mainwp_current_user_have_right' ) ) {
665 651
666 - /**
667 - * WordPress files system object.
668 - *
669 - * @global object
670 - */
671 - global $wp_filesystem;
672 - $sig_value = wp_unslash( $_GET['sig'] );
673 - $valid_sig = MainWP_System_Utility::valid_download_sig( $file, $sig_value );
652 + /**
653 + * Method \mainwp_current_user_can()
654 + *
655 + * Check permission level by hook mainwp_currentusercan of Team Control extension.
656 + *
657 + * @param string $cap_type group or type of capabilities.
658 + * @param string $cap capabilities for current user.
659 + *
660 + * @return bool true|false
661 + *
662 + * @uses \MainWP\Dashboard\MainWP_System_Handler::handle_settings_post()
663 + */
664 + function mainwp_current_user_have_right( $cap_type = '', $cap = '' ) {
674 665
675 - if ( ! $valid_sig ) {
676 - MainWP_Logger::instance()->debug( ' :: download :: invalid sig :: ' . base64_decode( $sig_value ) ); // phpcs:ignore -- for debug logging.
677 - }
666 + /**
667 + * Current user global.
668 + *
669 + * @global string
670 + */
671 + global $current_user;
678 672
679 - if ( $hasWPFileSystem && $wp_filesystem->exists( $file ) && $valid_sig ) {
680 - MainWP_System_Handler::instance()->upload_file( $file );
681 - exit();
682 - }
683 - } elseif ( isset( $_GET['page'] ) ) {
684 - if ( MainWP_System_Utility::is_admin() ) {
685 - switch ( $_GET['page'] ) {
686 - case 'mainwp-setup':
687 - new MainWP_Setup_Wizard();
688 - break;
689 - }
690 - }
691 - }
692 - // phpcs:enable
693 - }
673 + if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
674 + return true;
675 + }
694 676
695 - /**
696 - * Method after_setup_theme()
697 - *
698 - * After setup theme hook, to support post thumbnails.
699 - */
700 - public function after_setup_theme() {
701 - add_theme_support( 'post-thumbnails' );
702 - }
677 + if ( defined( 'WP_CLI' ) && WP_CLI ) {
678 + return true;
679 + }
703 680
681 + if ( defined( 'MAINWP_REST_API_DOING' ) && MAINWP_REST_API_DOING ) {
682 + return true;
683 + }
704 684
705 - /**
706 - * Method hook_admin_update_check()
707 - */
708 - public function hook_admin_update_check() {
709 - $current_ver = $this->check_ver_update;
710 - $saved_ver = get_option( 'mainwp_update_check_version', false );
685 + if ( empty( $current_user ) && ! function_exists( 'wp_get_current_user' ) ) {
686 + require_once ABSPATH . WPINC . '/pluggable.php'; // NOSONAR - WP compatible.
687 + }
711 688
712 - if ( false === $saved_ver ) {
713 - return;
714 - }
689 + return apply_filters( 'mainwp_currentusercan', true, $cap_type, $cap );
690 + }
691 + }
692 + }
715 693
716 - if ( version_compare( $saved_ver, $current_ver, '=' ) ) {
717 - return;
718 - }
694 + /**
695 + * Method init()
696 + *
697 + * Instantiate Plugin.
698 + */
699 + public function init() { //phpcs:ignore -- NOSONAR - complex.
719 700
720 - if ( version_compare( $saved_ver, '0.0.4', '<' ) ) {
721 - $sched = wp_next_scheduled( 'mainwp_cronstats_action' );
722 - if ( ! empty( $sched ) ) {
723 - wp_unschedule_event( $sched, 'mainwp_cronstats_action' );
724 - }
725 - global $wpdb;
726 - $wpdb->query( 'DELETE FROM ' . $wpdb->usermeta . ' WHERE meta_key = "mainwp_widgets_sorted_toplevel_page_mainwp_tab" OR meta_key="mainwp_settings_show_widgets"' );//phpcs:ignore -- safe.
727 - }
701 + /**
702 + * MainWP disabled menu items array.
703 + *
704 + * @global object $_mainwp_disable_menus_items
705 + */
706 + global $_mainwp_disable_menus_items;
728 707
729 - if ( version_compare( $saved_ver, '0.0.5', '<' ) ) {
730 - $all_ext = MainWP_Extensions_View::get_available_extensions();
731 - foreach ( $all_ext as $slug => $info ) {
732 - $data = MainWP_Api_Manager::instance()->get_activation_info( $slug );
733 - if ( is_array( $data ) && isset( $data['api_key'] ) ) {
734 - $data['api_key'] = '';
735 - $data['activated_key'] = 'Deactivated';
736 - MainWP_Api_Manager::instance()->set_activation_info( $slug, $data );
737 - }
738 - }
739 - update_option( 'mainwp_extensions_all_activation_cached', '' );
740 - }
708 + $_mainwp_disable_menus_items = apply_filters( 'mainwp_disablemenuitems', $_mainwp_disable_menus_items );
741 709
742 - MainWP_Utility::update_option( 'mainwp_update_check_version', $current_ver );
743 - }
710 + /**
711 + * Filter: mainwp_main_menu_disable_menu_items
712 + *
713 + * Filters disabled MainWP navigation items.
714 + *
715 + * @since Unknown
716 + */
717 + $_mainwp_disable_menus_items = apply_filters( 'mainwp_main_menu_disable_menu_items', $_mainwp_disable_menus_items );
744 718
745 - /**
746 - * Method admin_init()
747 - *
748 - * Do nothing if current user is not an Admin else display the page.
749 - *
750 - * @uses \MainWP\Dashboard\MainWP_Post_Backup_Handler::init()
751 - * @uses \MainWP\Dashboard\MainWP_Post_Extension_Handler::init()
752 - * @uses \MainWP\Dashboard\MainWP_Post_Handler::init()
753 - * @uses \MainWP\Dashboard\MainWP_Post_Plugin_Theme_Handler::init()
754 - * @uses \MainWP\Dashboard\MainWP_Post_Site_Handler::init()
755 - * @uses \MainWP\Dashboard\MainWP_System_Handler::activate_extension()
756 - * @uses \MainWP\Dashboard\MainWP_System_Utility::is_admin()
757 - * @uses \MainWP\Dashboard\MainWP_System_View::get_class_name()
758 - * @uses \MainWP\Dashboard\MainWP_System_View::get_mainwp_translations()
759 - */
760 - public function admin_init() { // phpcs:ignore -- complex function.
719 + MainWP_System_Handler::instance()->handle_settings_post();
720 + }
761 721
762 - if ( ! MainWP_System_Utility::is_admin() ) {
763 - return;
764 - }
722 + /**
723 + * Method parse_init()
724 + *
725 + * Initiate plugin installation & then run the Quick Setup Wizard.
726 + *
727 + * @uses \MainWP\Dashboard\MainWP_System_Handler::upload_file()
728 + * @uses \MainWP\Dashboard\MainWP_System_Utility::get_mainwp_dir()
729 + * @uses \MainWP\Dashboard\MainWP_System_Utility::get_wp_file_system()
730 + * @uses \MainWP\Dashboard\MainWP_System_Utility::is_admin()
731 + * @uses \MainWP\Dashboard\MainWP_Setup_Wizard()
732 + */
733 + public function parse_init() {
734 + // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
735 + if ( isset( $_GET['mwpdl'] ) && isset( $_GET['sig'] ) ) {
736 + $mwpDir = MainWP_System_Utility::get_mainwp_dir();
737 + $mwpDir = $mwpDir[0];
738 + $mwpdl = isset( $_REQUEST['mwpdl'] ) ? wp_unslash( $_REQUEST['mwpdl'] ) : '';
739 + $file = trailingslashit( $mwpDir ) . rawurldecode( $mwpdl );
765 740
766 - add_action( 'mainwp_activate_extention', array( MainWP_System_Handler::instance(), 'activate_extension' ), 10, 2 ); // @deprecated Use 'mainwp_activate_extension' instead.
767 - add_action( 'mainwp_deactivate_extention', array( MainWP_System_Handler::instance(), 'deactivate_extension' ), 10, 3 ); // @deprecated Use 'mainwp_deactivate_extension' instead.
741 + if ( stristr( rawurldecode( $mwpdl ), '..' ) ) {
742 + return;
743 + }
768 744
769 - add_action( 'mainwp_activate_extension', array( MainWP_System_Handler::instance(), 'activate_extension' ), 10, 2 );
770 - add_action( 'mainwp_deactivate_extension', array( MainWP_System_Handler::instance(), 'deactivate_extension' ), 10, 3 );
745 + $hasWPFileSystem = MainWP_System_Utility::get_wp_file_system();
771 746
772 - /**
773 - * MainWP use external primary backup method.
774 - *
775 - * @global string
776 - */
777 - global $mainwpUseExternalPrimaryBackupsMethod;
747 + /**
748 + * WordPress files system object.
749 + *
750 + * @global object
751 + */
752 + global $wp_filesystem;
753 + $sig_value = wp_unslash( $_GET['sig'] );
754 + $valid_sig = MainWP_System_Utility::valid_download_sig( $file, $sig_value );
778 755
779 - if ( null === $mainwpUseExternalPrimaryBackupsMethod ) {
780 - $return = '';
756 + if ( ! $valid_sig ) {
757 + MainWP_Logger::instance()->debug( ' :: download :: invalid sig :: ' . base64_decode( $sig_value ) ); // phpcs:ignore -- for debug logging.
758 + }
781 759
782 - /*
783 - * @deprecated Use 'mainwp_getprimarybackup_activated' instead.
784 - *
785 - */
786 - $return = apply_filters_deprecated( 'mainwp-getprimarybackup-activated', array( $return ), '4.0.7.2', 'mainwp_getprimarybackup_activated' );
787 - $mainwpUseExternalPrimaryBackupsMethod = apply_filters( 'mainwp_getprimarybackup_activated', $return );
788 - }
760 + if ( $hasWPFileSystem && $wp_filesystem->exists( $file ) && $valid_sig ) {
761 + MainWP_System_Handler::instance()->upload_file( $file );
762 + exit();
763 + }
764 + } elseif ( isset( $_GET['page'] ) ) {
765 + if ( MainWP_System_Utility::is_admin() && 'mainwp-setup' === $_GET['page'] ) {
766 + MainWP_Setup_Wizard::get_instance();
767 + }
768 + }
769 + // phpcs:enable
770 + }
789 771
790 - add_action( 'mainwp_before_header', array( MainWP_System_View::get_class_name(), 'mainwp_warning_notice' ) );
772 + /**
773 + * Method init_jobs()
774 + *
775 + * Initiate mainwp schedule jobs.
776 + */
777 + public function init_jobs() {
778 + MainWP_System_Cron_Jobs::instance()->init_cron_jobs();
779 + }
791 780
792 - MainWP_Post_Handler::instance()->init();
793 - MainWP_Post_Site_Handler::instance()->init();
794 - MainWP_Post_Plugin_Theme_Handler::instance()->init();
795 - MainWP_Post_Extension_Handler::instance()->init();
796 - MainWP_Post_Backup_Handler::instance()->init();
797 - MainWP_Manage_Sites_Filter_Segment::get_instance()->admin_init();
798 781
799 - /**
800 - * Filter: mainwp_ui_use_wp_calendar
801 - *
802 - * Filters whether default jQuery datepicker should be used to avoid potential problems with Senatic UI Calendar library.
803 - *
804 - * @since 4.0.5
805 - */
806 - $use_wp_datepicker = apply_filters( 'mainwp_ui_use_wp_calendar', false );
807 - if ( $use_wp_datepicker ) {
808 - wp_enqueue_script( 'jquery-ui-datepicker' );
809 - }
810 - wp_enqueue_script( 'jquery-ui-dialog' );
811 - $en_params = array( 'jquery-ui-dialog' );
812 - if ( $use_wp_datepicker ) {
813 - $en_params[] = 'jquery-ui-datepicker';
814 - }
815 - wp_enqueue_script( 'mainwp', MAINWP_PLUGIN_URL . 'assets/js/mainwp.js', $en_params, $this->current_version, true );
782 + /**
783 + * Method after_setup_theme()
784 + *
785 + * After setup theme hook, to support post thumbnails.
786 + */
787 + public function after_setup_theme() {
788 + add_theme_support( 'post-thumbnails' );
789 + }
816 790
817 - $enableLegacyBackupFeature = get_option( 'mainwp_enableLegacyBackupFeature' );
818 - $primaryBackup = get_option( 'mainwp_primaryBackup' );
819 - $disable_backup_checking = true; // removed option.
820 791
821 - $mainwpParams = array(
822 - 'image_url' => MAINWP_PLUGIN_URL . 'assets/images/',
823 - 'backup_before_upgrade' => 1 === (int) get_option( 'mainwp_backup_before_upgrade' ),
824 - 'disable_checkBackupBeforeUpgrade' => $disable_backup_checking,
825 - 'admin_url' => admin_url(),
826 - 'use_wp_datepicker' => $use_wp_datepicker ? 1 : 0,
827 - 'date_format' => get_option( 'date_format' ),
828 - 'time_format' => get_option( 'time_format' ),
829 - 'installedBulkSettingsManager' => is_plugin_active( 'mainwp-bulk-settings-manager/mainwp-bulk-settings-manager.php' ) ? 1 : 0,
830 - 'maximumSyncRequests' => ( get_option( 'mainwp_maximumSyncRequests' ) === false ) ? 8 : get_option( 'mainwp_maximumSyncRequests' ),
831 - 'maximumInstallUpdateRequests' => ( get_option( 'mainwp_maximumInstallUpdateRequests' ) === false ) ? 3 : get_option( 'mainwp_maximumInstallUpdateRequests' ),
832 - '_wpnonce' => wp_create_nonce( 'mainwp-admin-nonce' ),
833 - 'demoMode' => MainWP_Demo_Handle::is_demo_mode() ? 1 : 0,
834 - );
835 - wp_localize_script( 'mainwp', 'mainwpParams', $mainwpParams );
792 + /**
793 + * Method hook_admin_update_check()
794 + */
795 + public function hook_admin_update_check() {
796 + $current_ver = $this->check_ver_update;
797 + $saved_ver = get_option( 'mainwp_update_check_version', '' );
836 798
837 - $mainwpTranslations = MainWP_System_View::get_mainwp_translations();
799 + if ( version_compare( $saved_ver, $current_ver, '=' ) ) {
800 + return;
801 + }
838 802
839 - wp_localize_script( 'mainwp', 'mainwpTranslations', $mainwpTranslations );
803 + if ( ! empty( $saved_ver ) && version_compare( $saved_ver, '0.0.4', '<' ) ) {
804 + $sched = wp_next_scheduled( 'mainwp_cronstats_action' );
805 + if ( ! empty( $sched ) ) {
806 + wp_unschedule_event( $sched, 'mainwp_cronstats_action' );
807 + }
808 + global $wpdb;
809 + $wpdb->query( 'DELETE FROM ' . $wpdb->usermeta . ' WHERE meta_key = "mainwp_widgets_sorted_toplevel_page_mainwp_tab" OR meta_key="mainwp_settings_show_widgets"' );//phpcs:ignore -- safe.
810 + }
840 811
841 - $security_nonces = MainWP_Post_Handler::instance()->create_security_nonces(); // to fix conflict with Post S M T P plugin.
842 - $nonces_filter = apply_filters( 'mainwp_security_nonces', array() );
843 - if ( is_array( $nonces_filter ) && ! empty( $nonces_filter ) ) {
844 - $security_nonces = array_merge( $security_nonces, $nonces_filter );
845 - }
846 - wp_localize_script( 'mainwp', 'security_nonces', $security_nonces );
812 + if ( ! empty( $saved_ver ) && version_compare( $saved_ver, '0.0.5', '<' ) ) {
813 + $all_ext = MainWP_Extensions_View::get_available_extensions();
814 + foreach ( $all_ext as $slug => $info ) {
815 + $data = MainWP_Api_Manager::instance()->get_activation_info( $slug );
816 + if ( is_array( $data ) && isset( $data['api_key'] ) ) {
817 + $data['api_key'] = '';
818 + $data['activated_key'] = 'Deactivated';
819 + MainWP_Api_Manager::instance()->set_activation_info( $slug, $data );
820 + }
821 + }
822 + update_option( 'mainwp_extensions_all_activation_cached', '' );
823 + }
847 824
848 - wp_enqueue_script( 'thickbox' );
849 - wp_enqueue_script( 'user-profile' );
850 - wp_enqueue_style( 'thickbox' );
825 + if ( version_compare( $saved_ver, '0.0.8', '<' ) ) {
826 + static::handle_admin_perform_update( 'attempted_repair_primary_monitors' ); // init attempted repair.
827 + }
851 828
852 - $load_gridster = false;
829 + MainWP_Utility::update_option( 'mainwp_update_check_version', $current_ver );
830 + }
853 831
854 - // phpcs:disable WordPress.Security.NonceVerification
855 - if ( isset( $_GET['page'] ) && ( 'mainwp_tab' === $_GET['page'] || ( 'managesites' === $_GET['page'] && isset( $_GET['dashboard'] ) ) ) ) {
856 - $load_gridster = true;
857 - } elseif ( isset( $_GET['page'] ) && 'ManageClients' === $_GET['page'] && isset( $_GET['client_id'] ) ) {
858 - $load_gridster = true;
859 - } elseif ( isset( $_GET['page'] ) && 0 === strpos( wp_unslash( $_GET['page'] ), 'ManageSites' ) ) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- individual page.
860 - $load_gridster = true;
861 - }
862 832
863 - $load_gridster = apply_filters( 'mainwp_enqueue_script_gridster', $load_gridster );
833 + /**
834 + * Method admin_init_update()
835 + */
836 + public function admin_init_update() {
837 + static::handle_admin_perform_update();
838 + }
864 839
865 - if ( $load_gridster ) {
866 - wp_enqueue_script( 'gridster', MAINWP_PLUGIN_URL . 'assets/js/gridster/jquery.gridster.min.js', array(), $this->current_version, true );
867 - wp_enqueue_style( 'gridster', MAINWP_PLUGIN_URL . 'assets/js/gridster/jquery.gridster.min.css', array(), $this->current_version );
868 - }
869 840
870 - if ( isset( $_GET['page'] ) && ( 'managesites' === $_GET['page'] || 'MonitoringSites' === $_GET['page'] || 'ManageGroups' === $_GET['page'] ) ) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
871 - wp_enqueue_script( 'preview', MAINWP_PLUGIN_URL . 'assets/js/preview.js', array(), $this->current_version, true );
872 - wp_enqueue_style( 'preview', MAINWP_PLUGIN_URL . 'assets/css/preview.css', array(), $this->current_version );
873 - }
874 - // phpcs:enable
841 + /**
842 + * Method handle_admin_perform_update()
843 + *
844 + * @param string $action Init action.
845 + */
846 + public function handle_admin_perform_update( $action = '' ) {
875 847
876 - wp_enqueue_style( 'wp-color-picker' );
877 - wp_enqueue_script( 'wp-color-picker' );
848 + $update_actions = get_option( 'mainwp_admin_init_update_data' );
878 849
879 - $this->init_session();
850 + /**
851 + * Filters the update actions.
852 + *
853 + * @param array $update_actions The available update actions.
854 + * @param string $action The current update action.
855 + *
856 + * @since 6.2.1
857 + *
858 + * @return array The filtered update actions.
859 + */
860 + $update_actions = apply_filters( 'mainwp_admin_init_update_data', $update_actions, $action );
880 861
881 - if ( ! current_user_can( 'update_core' ) ) {
882 - remove_action( 'admin_notices', 'update_nag', 3 );
883 - }
884 - }
862 + if ( ! empty( $action ) ) {
863 + if ( ! is_array( $update_actions ) ) {
864 + $update_actions = array();
865 + }
866 + if ( 'attempted_repair_primary_monitors' === $action ) {
867 + $update_actions['attempted_repair_primary_monitors'] = 0;
868 + }
869 + }
885 870
886 - /**
887 - * Method admin_redirects()
888 - *
889 - * MainWP admin redirects.
890 - */
891 - public function admin_redirects() {
892 - if ( ( defined( 'DOING_CRON' ) && DOING_CRON ) || defined( 'DOING_AJAX' ) ) {
893 - return;
894 - }
871 + if ( is_array( $update_actions ) ) {
872 + $update = false;
873 + if ( isset( $update_actions['attempted_repair_primary_monitors'] ) ) {
874 + $result = MainWP_DB_Uptime_Monitoring::instance()->repair_missing_primary_monitors( $update_actions['attempted_repair_primary_monitors'] );
875 + if ( is_array( $result ) && ! empty( $result['attempted'] ) ) {
876 + $update_actions['attempted_repair_primary_monitors'] = $result['attempted'];
877 + } else {
878 + unset( $update_actions['attempted_repair_primary_monitors'] );
879 + }
880 + $update = true;
881 + }
895 882
896 - if ( ! empty( $_GET['page'] ) && in_array( $_GET['page'], array( 'mainwp-setup' ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
897 - return;
898 - }
883 + if ( $update ) {
884 + MainWP_Utility::update_option( 'mainwp_admin_init_update_data', $update_actions );
885 + }
886 + }
887 + }
899 888
900 - $quick_setup = get_option( 'mainwp_run_quick_setup', false );
901 - if ( 'yes' === $quick_setup ) {
902 - wp_safe_redirect( admin_url( 'admin.php?page=mainwp-setup' ) );
903 - exit;
904 - }
889 + /**
890 + * Method admin_init()
891 + *
892 + * Do nothing if current user is not an Admin else display the page.
893 + *
894 + * @uses \MainWP\Dashboard\MainWP_Post_Backup_Handler::init()
895 + * @uses \MainWP\Dashboard\MainWP_Post_Extension_Handler::init()
896 + * @uses \MainWP\Dashboard\MainWP_Post_Handler::init()
897 + * @uses \MainWP\Dashboard\MainWP_Post_Plugin_Theme_Handler::init()
898 + * @uses \MainWP\Dashboard\MainWP_Post_Site_Handler::init()
899 + * @uses \MainWP\Dashboard\MainWP_System_Handler::activate_extension()
900 + * @uses \MainWP\Dashboard\MainWP_System_Utility::is_admin()
901 + * @uses \MainWP\Dashboard\MainWP_System_View::get_class_name()
902 + * @uses \MainWP\Dashboard\MainWP_System_View::get_mainwp_translations()
903 + */
904 + public function admin_init() { // phpcs:ignore -- NOSONAR - complex function.
905 905
906 - if ( 'yes' === get_option( 'mainwp_activated' ) ) {
907 - delete_option( 'mainwp_activated' );
908 - wp_cache_delete( 'mainwp_activated', 'options' );
909 - wp_cache_delete( 'alloptions', 'options' );
910 - wp_safe_redirect( admin_url( 'admin.php?page=mainwp_tab' ) );
906 + if ( ! MainWP_System_Utility::is_admin() ) {
907 + return;
908 + }
911 909
912 - return;
913 - }
910 + add_action( 'mainwp_activate_extention', array( MainWP_System_Handler::instance(), 'activate_extension' ), 10, 2 ); // @deprecated Use 'mainwp_activate_extension' instead.
911 + add_action( 'mainwp_deactivate_extention', array( MainWP_System_Handler::instance(), 'deactivate_extension' ), 10, 3 ); // @deprecated Use 'mainwp_deactivate_extension' instead.
914 912
915 - $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
916 - $_pos = strlen( $request_uri ) - strlen( '/wp-admin/' );
917 - if ( ! empty( $request_uri ) && strpos( $request_uri, '/wp-admin/' ) !== false && strpos( $request_uri, '/wp-admin/' ) === $_pos ) {
918 - $referer = wp_get_referer();
919 - if ( ! empty( $referer ) && strpos( $referer, 'wp-login.php?redirect_to' ) !== false && strpos( $referer, '&reauth=1' ) !== false ) {
920 - if ( mainwp_current_user_have_right( 'dashboard', 'access_global_dashboard' ) ) {
921 - wp_safe_redirect( admin_url( 'admin.php?page=mainwp_tab' ) );
922 - die();
923 - }
924 - }
925 - }
913 + add_action( 'mainwp_activate_extension', array( MainWP_System_Handler::instance(), 'activate_extension' ), 10, 2 );
914 + add_action( 'mainwp_deactivate_extension', array( MainWP_System_Handler::instance(), 'deactivate_extension' ), 10, 3 );
926 915
927 - MainWP_Logger::instance()->check_log_daily();
928 - }
916 + /**
917 + * MainWP use external primary backup method.
918 + *
919 + * @global string
920 + */
921 + global $mainwpUseExternalPrimaryBackupsMethod;
929 922
930 - /**
931 - * Method init_session()
932 - *
933 - * Check current page & initiate a session.
934 - *
935 - * @uses \MainWP\Dashboard\MainWP_Cache::init_session()
936 - */
937 - public function init_session() {
938 - $page = isset( $_GET['page'] ) ? wp_unslash( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
939 - if ( ! empty( $page ) && in_array(
940 - $page,
941 - array(
942 - 'PostBulkManage',
943 - 'PageBulkManage',
944 - 'PluginsManage',
945 - 'PluginsAutoUpdate',
946 - 'ThemesManage',
947 - 'ThemesAutoUpdate',
948 - 'UserBulkManage',
949 - )
950 - )
951 - ) {
952 - MainWP_Cache::init_session();
953 - }
954 - }
923 + if ( null === $mainwpUseExternalPrimaryBackupsMethod ) {
924 + $return = '';
955 925
956 - /**
957 - * Method clear_sessions()
958 - *
959 - * When logout clear the sessions to reset.
960 - */
961 - public function clear_sessions() {
962 - MainWP_Cache::init_session();
963 - $clear_cached = array(
964 - 'Post',
965 - 'Page',
966 - );
967 - foreach ( $clear_cached as $ca ) {
968 - MainWP_Cache::init_cache( $ca ); // to re-set cache.
969 - }
970 - }
926 + /*
927 + * @deprecated Use 'mainwp_getprimarybackup_activated' instead.
928 + *
929 + */
930 + $return = apply_filters_deprecated( 'mainwp-getprimarybackup-activated', array( $return ), '4.0.7.2', 'mainwp_getprimarybackup_activated' ); // NOSONAR - not IP.
931 + $mainwpUseExternalPrimaryBackupsMethod = apply_filters( 'mainwp_getprimarybackup_activated', $return );
932 + }
971 933
972 - /**
973 - * Method admin_enqueue_scripts()
974 - *
975 - * Enqueue all Mainwp Admin Scripts.
976 - */
977 - public function admin_enqueue_scripts() {
934 + add_action( 'mainwp_after_header', array( MainWP_System_View::get_class_name(), 'mainwp_warning_notice' ) );
978 935
979 - $load_cust_scripts = false;
936 + MainWP_Post_Handler::instance()->init();
937 + MainWP_Post_Site_Handler::instance()->init();
938 + MainWP_Post_Plugin_Theme_Handler::instance()->init();
939 + MainWP_Post_Extension_Handler::instance()->init();
940 + MainWP_Post_Backup_Handler::instance()->init();
941 + MainWP_Manage_Sites_Filter_Segment::get_instance()->admin_init();
942 + MainWP_Ui_Manage_Widgets_Layout::get_instance()->admin_init();
980 943
981 - /**
982 - * Current pagenow.
983 - *
984 - * @global string
985 - */
986 - global $pagenow;
944 + /**
945 + * Filter: mainwp_ui_use_wp_calendar
946 + *
947 + * Filters whether default jQuery datepicker should be used to avoid potential problems with Senatic UI Calendar library.
948 + *
949 + * @since 4.0.5
950 + */
951 + $use_wp_datepicker = apply_filters( 'mainwp_ui_use_wp_calendar', false );
952 + if ( $use_wp_datepicker ) {
953 + wp_enqueue_script( 'jquery-ui-datepicker' );
954 + }
955 + wp_enqueue_script( 'jquery-ui-dialog' );
956 + $en_params = array( 'jquery-ui-dialog' );
957 + if ( $use_wp_datepicker ) {
958 + $en_params[] = 'jquery-ui-datepicker';
959 + }
987 960
988 - if ( is_plugin_active( 'mainwp-custom-post-types/mainwp-custom-post-types.php' ) && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
989 - $load_cust_scripts = true;
990 - }
961 + static::$defer_js_handle = array_merge( static::$defer_js_handle, array( 'mainwp' ) );
991 962
992 - if ( self::is_mainwp_pages() ) {
993 - wp_enqueue_script( 'jquery-migrate' );
994 - wp_enqueue_script( 'mainwp-updates', MAINWP_PLUGIN_URL . 'assets/js/mainwp-updates.js', array(), $this->current_version, true );
995 - wp_enqueue_script( 'mainwp-managesites-action', MAINWP_PLUGIN_URL . 'assets/js/mainwp-managesites-action.js', array(), $this->current_version, true );
996 - wp_enqueue_script( 'mainwp-managesites-update', MAINWP_PLUGIN_URL . 'assets/js/mainwp-managesites-update.js', array(), $this->current_version, true );
997 - wp_enqueue_script( 'mainwp-managesites-import', MAINWP_PLUGIN_URL . 'assets/js/mainwp-managesites-import.js', array(), $this->current_version, true );
998 - wp_enqueue_script( 'mainwp-plugins-themes', MAINWP_PLUGIN_URL . 'assets/js/mainwp-plugins-themes.js', array(), $this->current_version, true );
999 - wp_enqueue_script( 'mainwp-backups', MAINWP_PLUGIN_URL . 'assets/js/mainwp-backups.js', array(), $this->current_version, true );
1000 - wp_enqueue_script( 'mainwp-posts', MAINWP_PLUGIN_URL . 'assets/js/mainwp-posts.js', array(), $this->current_version, true );
1001 - wp_enqueue_script( 'mainwp-users', MAINWP_PLUGIN_URL . 'assets/js/mainwp-users.js', array(), $this->current_version, true );
1002 - wp_enqueue_script( 'mainwp-clients', MAINWP_PLUGIN_URL . 'assets/js/mainwp-clients.js', array(), $this->current_version, true );
1003 - wp_enqueue_script( 'mainwp-extensions', MAINWP_PLUGIN_URL . 'assets/js/mainwp-extensions.js', array(), $this->current_version, true );
1004 - wp_enqueue_script( 'mainwp-moment', MAINWP_PLUGIN_URL . 'assets/js/moment/moment.min.js', array(), $this->current_version, true );
1005 - wp_enqueue_script( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.js', array( 'jquery' ), $this->current_version, false );
963 + wp_enqueue_script( 'mainwp', MAINWP_PLUGIN_URL . 'assets/js/mainwp.js', $en_params, $this->current_version, true );
964 + wp_enqueue_script( 'mainwp-cache-warm', MAINWP_PLUGIN_URL . 'assets/js/mainwp-cache-warm.js', array(), $this->current_version, true );
1006 965
1007 - wp_enqueue_script( 'datatables', MAINWP_PLUGIN_URL . 'assets/js/datatables/jquery.dataTables.js', array( 'jquery' ), $this->current_version, false );
1008 - wp_enqueue_script( 'datatables-semanticui', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.semanticui.js', array( 'jquery' ), $this->current_version, false );
1009 - wp_enqueue_script( 'datatables-fixedColumns', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.fixedColumns.min.js', array( 'jquery' ), $this->current_version, false );
1010 - wp_enqueue_script( 'datatables-scroller', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.scroller.js', array( 'jquery' ), $this->current_version, false );
1011 - wp_enqueue_script( 'datatables-colreorder', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.colReorder.min.js', array( 'jquery' ), $this->current_version, false );
1012 - wp_enqueue_script( 'datatables-responsive', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.responsive.min.js', array( 'jquery' ), $this->current_version, true );
966 + $disable_backup_checking = true; // removed option.
967 + $mainwpParams = array(
968 + 'image_url' => MAINWP_PLUGIN_URL . 'assets/images/',
969 + 'backup_before_upgrade' => 1 === (int) get_option( 'mainwp_backup_before_upgrade' ),
970 + 'disable_checkBackupBeforeUpgrade' => $disable_backup_checking,
971 + 'admin_url' => admin_url(),
972 + 'use_wp_datepicker' => $use_wp_datepicker ? 1 : 0,
973 + 'date_format' => get_option( 'date_format' ),
974 + 'time_format' => get_option( 'time_format' ),
975 + 'installedBulkSettingsManager' => is_plugin_active( 'mainwp-bulk-settings-manager/mainwp-bulk-settings-manager.php' ) ? 1 : 0,
976 + 'maximumSyncRequests' => ( get_option( 'mainwp_maximumSyncRequests' ) === false ) ? 8 : get_option( 'mainwp_maximumSyncRequests' ),
977 + 'maximumInstallUpdateRequests' => ( get_option( 'mainwp_maximumInstallUpdateRequests' ) === false ) ? 3 : get_option( 'mainwp_maximumInstallUpdateRequests' ),
978 + 'maximumUptimeMonitoringRequests' => (int) get_option( 'mainwp_maximum_uptime_monitoring_requests', 10 ),
979 + '_wpnonce' => wp_create_nonce( 'mainwp-admin-nonce' ),
980 + 'quickThemeChangeNonce' => wp_create_nonce( 'mainwp_quick_theme_change' ),
981 + 'demoMode' => MainWP_Demo_Handle::is_demo_mode() ? 1 : 0,
982 + 'roll_ui_icon' => MainWP_Updates_Helper::get_roll_icon( '', true ),
983 + 'admin_url_base' => admin_url(),
984 + 'mainwpVersion' => static::$version,
985 + );
986 + wp_localize_script( 'mainwp', 'mainwpParams', $mainwpParams );
1013 987
1014 - wp_enqueue_script( 'hamburger', MAINWP_PLUGIN_URL . 'assets/js/hamburger/hamburger.js', array( 'jquery' ), $this->current_version, true );
1015 - wp_enqueue_script( 'datatables-natural-sorting', MAINWP_PLUGIN_URL . 'assets/js/sorting/natural.js', array( 'jquery' ), $this->current_version, true );
988 + $mainwpTranslations = MainWP_System_View::get_mainwp_translations();
1016 989
1017 - wp_enqueue_script( 'mainwp-clipboard', MAINWP_PLUGIN_URL . 'assets/js/clipboard/clipboard.min.js', array( 'jquery' ), $this->current_version, true );
1018 - wp_enqueue_script( 'mainwp-rest-api', MAINWP_PLUGIN_URL . 'assets/js/mainwp-rest-api.js', array(), $this->current_version, true );
990 + wp_localize_script( 'mainwp', 'mainwpTranslations', $mainwpTranslations );
1019 991
1020 - if ( isset( $_GET['page'] ) && 'ManageGroups' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1021 - wp_enqueue_script( 'mainwp-groups', MAINWP_PLUGIN_URL . 'assets/js/mainwp-groups.js', array(), $this->current_version, true );
1022 - }
1023 - $enqueue_scripts = apply_filters( 'mainwp_admin_enqueue_scripts', array() );
1024 - if ( is_array( $enqueue_scripts ) ) {
1025 - if ( ! empty( $enqueue_scripts['apexcharts'] ) ) {
1026 - wp_enqueue_script(
1027 - 'mainwp-apexcharts',
1028 - MAINWP_PLUGIN_URL . 'assets/js/apexcharts/apexcharts.js',
1029 - array(
1030 - 'jquery',
1031 - 'mainwp',
1032 - ),
1033 - $this->current_version,
1034 - true
1035 - );
1036 - }
1037 - }
1038 - }
992 + $security_nonces = MainWP_Post_Handler::instance()->create_security_nonces(); // to fix conflict with Post S M T P plugin.
993 + $nonces_filter = apply_filters( 'mainwp_security_nonces', array() );
994 + if ( is_array( $nonces_filter ) && ! empty( $nonces_filter ) ) {
995 + $security_nonces = array_merge( $security_nonces, $nonces_filter );
996 + }
997 + wp_localize_script( 'mainwp', 'security_nonces', $security_nonces );
1039 998
1040 - if ( $load_cust_scripts ) {
1041 - wp_enqueue_script( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.js', array( 'jquery' ), $this->current_version, true );
1042 - }
999 + wp_enqueue_script( 'thickbox' );
1000 + wp_enqueue_script( 'user-profile' );
1001 + wp_enqueue_style( 'thickbox' );
1043 1002
1044 - wp_enqueue_script( 'mainwp-ui', MAINWP_PLUGIN_URL . 'assets/js/mainwp-ui.js', array(), $this->current_version, true );
1045 - wp_enqueue_script( 'mainwp-js-popup', MAINWP_PLUGIN_URL . 'assets/js/mainwp-popup.js', array(), $this->current_version, true );
1046 - wp_enqueue_script( 'mainwp-fileuploader', MAINWP_PLUGIN_URL . 'assets/js/fileuploader.js', array(), $this->current_version ); // phpcs:ignore -- fileuploader scripts need to load at header.
1047 - wp_enqueue_script( 'mainwp-date', MAINWP_PLUGIN_URL . 'assets/js/date.js', array(), $this->current_version, true );
1048 - wp_enqueue_script( 'mainwp-filesaver', MAINWP_PLUGIN_URL . 'assets/js/FileSaver.js', array(), $this->current_version, true );
1049 - }
1003 + $load_gridstack = false;
1050 1004
1051 - /**
1052 - * Method admin_enqueue_scripts_fix_conflict()
1053 - *
1054 - * Enqueue Admin Scripts fix conflict.
1055 - */
1056 - public function admin_enqueue_scripts_fix_conflict() {
1057 - if ( self::is_mainwp_pages() ) {
1058 - // to fix conflict with the SVG Support plugin.
1059 - remove_action( 'admin_enqueue_scripts', 'bodhi_svgs_admin_multiselect' );
1060 - }
1061 - }
1005 + // phpcs:disable WordPress.Security.NonceVerification
1006 + if ( ( isset( $_GET['page'] ) && ( 'mainwp_tab' === $_GET['page'] || ( 'managesites' === $_GET['page'] && isset( $_GET['dashboard'] ) ) ) ) || ( isset( $_GET['page'] ) && 'ManageClients' === $_GET['page'] && isset( $_GET['client_id'] ) ) || ( isset( $_GET['page'] ) && 0 === strpos( wp_unslash( $_GET['page'] ), 'ManageSites' ) ) ) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- individual page.
1007 + $load_gridstack = true;
1008 + }
1062 1009
1063 - /**
1064 - * Method admin_enqueue_styles()
1065 - *
1066 - * Enqueue all Mainwp Admin Styles.
1067 - */
1068 - public function admin_enqueue_styles() {
1010 + // compatible filter.
1011 + $load_gridstack = apply_filters( 'mainwp_enqueue_script_gridster', $load_gridstack );
1069 1012
1070 - wp_enqueue_style( 'mainwp', MAINWP_PLUGIN_URL . 'assets/css/mainwp.css', array(), $this->current_version );
1071 - wp_enqueue_style( 'mainwp-responsive-layouts', MAINWP_PLUGIN_URL . 'assets/css/mainwp-responsive-layouts.css', array(), $this->current_version );
1013 + if ( $load_gridstack ) {
1014 + static::$defer_js_handle[] = 'mainwp_gridstack';
1015 + wp_enqueue_script( 'mainwp_gridstack', MAINWP_PLUGIN_URL . 'assets/js/gridstack/gridstack-all.js', array( 'jquery' ), $this->current_version, true );
1016 + wp_enqueue_style( 'mainwp_gridstack', MAINWP_PLUGIN_URL . 'assets/js/gridstack/gridstack.min.css', array(), $this->current_version );
1017 + }
1072 1018
1073 - if ( isset( $_GET['hideall'] ) && 1 === (int) $_GET['hideall'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1074 - remove_action( 'admin_footer', 'wp_admin_bar_render', 1000 );
1075 - }
1019 + if ( isset( $_GET['page'] ) && ( 'managesites' === $_GET['page'] || 'MonitoringSites' === $_GET['page'] || 'ManageGroups' === $_GET['page'] ) ) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1020 + wp_enqueue_script( 'preview', MAINWP_PLUGIN_URL . 'assets/js/preview.js', array(), $this->current_version, true );
1021 + wp_enqueue_style( 'preview', MAINWP_PLUGIN_URL . 'assets/css/preview.css', array(), $this->current_version );
1022 + }
1023 + // phpcs:enable
1076 1024
1077 - /**
1078 - * Current pagenow.
1079 - *
1080 - * @global string
1081 - */
1082 - global $pagenow;
1025 + wp_enqueue_style( 'wp-color-picker' );
1026 + wp_enqueue_script( 'wp-color-picker' );
1083 1027
1084 - $load_cust_scripts = false;
1085 - if ( is_plugin_active( 'mainwp-custom-post-types/mainwp-custom-post-types.php' ) && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
1086 - $load_cust_scripts = true;
1087 - }
1028 + $this->init_session();
1088 1029
1089 - if ( self::is_mainwp_pages() ) {
1090 - wp_enqueue_style( 'mainwp-fonts', MAINWP_PLUGIN_URL . 'assets/css/mainwp-fonts.css', array(), $this->current_version );
1091 - wp_enqueue_style( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.css', array(), $this->current_version );
1092 - wp_enqueue_style( 'mainwp-fomantic', MAINWP_PLUGIN_URL . 'assets/css/mainwp-fomantic.css', array(), $this->current_version );
1030 + if ( ! current_user_can( 'update_core' ) ) {
1031 + remove_action( 'admin_notices', 'update_nag', 3 );
1032 + }
1033 + }
1093 1034
1094 - wp_enqueue_style( 'datatables', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.semanticui.css', array(), $this->current_version );
1095 - wp_enqueue_style( 'datatables-colreorder', MAINWP_PLUGIN_URL . 'assets/js/datatables/colReorder.dataTables.min.css', array(), $this->current_version );
1096 - wp_enqueue_style( 'datatables-fixedColumns', MAINWP_PLUGIN_URL . 'assets/js/datatables/fixedColumns.dataTables.min.css', array(), $this->current_version );
1097 - wp_enqueue_style( 'datatables-scroller', MAINWP_PLUGIN_URL . 'assets/js/datatables/scroller.semanticui.css', array(), $this->current_version );
1098 - wp_enqueue_style( 'datatables-responsive', MAINWP_PLUGIN_URL . 'assets/js/datatables/responsive.dataTables.min.css', array(), $this->current_version );
1099 1035
1100 - wp_enqueue_style( 'hamburger', MAINWP_PLUGIN_URL . 'assets/js/hamburger/hamburger.css', array(), $this->current_version );
1101 - // to fix conflict layout.
1102 - wp_enqueue_style( 'jquery-ui-style', MAINWP_PLUGIN_URL . 'assets/css/1.11.1/jquery-ui.min.css', array(), '1.11.1' );
1036 + /**
1037 + * Method hook_wp_shutdown()
1038 + */
1039 + public function hook_wp_shutdown() {
1040 + if ( MainWP_Logger::DISABLED !== (int) get_option( 'mainwp_actionlogs' ) ) {
1041 + $error = error_get_last();
1042 + if ( is_array( $error ) && isset( $error['type'] ) && ( E_ERROR === $error['type'] || E_CORE_ERROR === $error['type'] || E_COMPILE_ERROR === $error['type'] || E_PARSE === $error['type'] ) ) {
1043 + MainWP_Logger::instance()->log_action( '[Fatal ERROR detected=' . print_r( $error, true ) . ']', false, MainWP_Logger::WARNING_COLOR, true ); //phpcs:ignore -- NOSONAR.
1044 + }
1045 + }
1046 + MainWP_Cache_Helper::log_metrics();
1103 1047
1104 - // load custom MainWP theme.
1105 - $selected_theme = MainWP_Settings::get_instance()->get_selected_theme();
1106 - if ( ! empty( $selected_theme ) ) {
1107 - if ( 'dark' === $selected_theme ) {
1108 - wp_enqueue_style( 'mainwp-custom-dashboard-extension-dark-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-dark-theme.css', array(), $this->current_version );
1109 - } elseif ( 'wpadmin' === $selected_theme ) {
1110 - wp_enqueue_style( 'mainwp-custom-dashboard-extension-wp-admin-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-wpadmin-theme.css', array(), $this->current_version );
1111 - } elseif ( 'minimalistic' === $selected_theme ) {
1112 - wp_enqueue_style( 'mainwp-custom-dashboard-extension-minimalistic-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-minimalistic-theme.css', array(), $this->current_version );
1113 - } elseif ( 'default' === $selected_theme ) {
1114 - wp_enqueue_style( 'mainwp-custom-dashboard-extension-default-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-default-theme.css', array(), $this->current_version );
1115 - } else {
1116 - $dirs = MainWP_Settings::get_instance()->get_custom_theme_folder();
1117 - $custom_theme_url = $dirs[1];
1118 - wp_enqueue_style( 'mainwp-custom-dashboard-theme', $custom_theme_url . $selected_theme, array(), $this->current_version );
1119 - }
1120 - }
1121 - }
1048 + /**
1049 + * MainWP shutdown.
1050 + *
1051 + * @since 5.5.
1052 + */
1053 + do_action( 'mainwp_shutdown' );
1122 1054
1123 - if ( $load_cust_scripts ) {
1124 - wp_enqueue_style( 'mainwp-fonts', MAINWP_PLUGIN_URL . 'assets/css/mainwp-fonts.css', array(), $this->current_version );
1125 - wp_enqueue_style( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.css', array(), $this->current_version );
1126 - }
1127 - }
1055 + $exctime = MainWP_Execution_Helper::get_run_time();
1056 + MainWP_Logger::instance()->log_events( 'execution-time', 'Shutdown :: ' . $exctime );
1057 + MainWP_Logger::instance()->log_execution_sync( 'end' );
1058 + }
1128 1059
1129 - /**
1130 - * Method admin_menu()
1131 - *
1132 - * Add Bulk Post/Pages menue.
1133 - */
1134 - public function admin_menu() {
1060 + /**
1061 + * Method hook_plugin_action_links()
1062 + *
1063 + * @param string[] $actions An array of plugin action links. By default this can include
1064 + * 'activate', 'deactivate', and 'delete'. With Multisite active
1065 + * this can also include 'network_active' and 'network_only' items.
1066 + * @param string $plugin_file Path to the plugin file relative to the plugins directory.
1067 + * @param array $plugin_data An array of plugin data. See get_plugin_data()
1068 + * and the {@see 'plugin_row_meta'} filter for the list
1069 + * of possible values.
1070 + */
1071 + public function hook_plugin_action_links( $actions, $plugin_file, $plugin_data ) {
1072 + unset( $plugin_file ); // not use, compatible.
1073 + if ( is_array( $plugin_data ) && ! empty( $plugin_data['slug'] ) && ! empty( $plugin_data['plugin'] ) && 'mainwp' === $plugin_data['slug'] && 'mainwp/mainwp.php' === $plugin_data['plugin'] ) {
1074 + $tmp = array(
1075 + 'mainwp-setup' => '<a href="admin.php?page=mainwp-setup" id="mainwp-setup" aria-label="' . esc_html__( 'MainWP Dashboard Setup Wizard', 'mainwp' ) . '">' . esc_html__( 'Setup Wizard', 'mainwp' ) . '</a>',
1076 + );
1077 + if ( is_array( $actions ) ) {
1078 + foreach ( $actions as $key => $val ) {
1079 + $tmp[ $key ] = $val;
1135 1080
1136 - /**
1137 - * Admin menu array.
1138 - *
1139 - * @global object
1140 - */
1141 - global $menu;
1081 + }
1082 + }
1083 + return $tmp;
1084 + }
1085 + return $actions;
1086 + }
1142 1087
1143 - foreach ( $menu as $k => $item ) {
1144 - if ( 'edit.php?post_type=bulkpost' === $item[2] ) {
1145 - unset( $menu[ $k ] );
1146 - } elseif ( 'edit.php?post_type=bulkpage' === $item[2] ) {
1147 - unset( $menu[ $k ] );
1148 - }
1149 - }
1150 - }
1088 + /**
1089 + * Method current_screen_redirects()
1090 + *
1091 + * MainWP current screen redirects.
1092 + */
1093 + public function current_screen_redirects() {
1151 1094
1152 - /**
1153 - * Method enqueue_postbox_scripts()
1154 - *
1155 - * Enqueue postbox scripts.
1156 - */
1157 - public static function enqueue_postbox_scripts() {
1158 - wp_enqueue_script( 'common' );
1159 - wp_enqueue_script( 'wp-lists' );
1160 - wp_enqueue_script( 'postbox' );
1161 - }
1095 + if ( ( defined( 'DOING_CRON' ) && DOING_CRON ) || defined( 'DOING_AJAX' ) ) {
1096 + return;
1097 + }
1098 + if ( static::is_mainwp_pages() ) {
1099 + $quick_setup = get_option( 'mainwp_run_quick_setup', false );
1100 + if ( 'yes' === $quick_setup ) {
1101 + delete_option( 'mainwp_run_quick_setup' );
1102 + wp_safe_redirect( admin_url( 'admin.php?page=mainwp-setup' ) );
1103 + exit;
1104 + }
1105 + }
1162 1106
1163 - /**
1164 - * Method admin_footer()
1165 - *
1166 - * Create MainWP admin footer.
1167 - *
1168 - * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
1169 - * @uses \MainWP\Dashboard\MainWP_DB::query()
1170 - * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
1171 - * @uses \MainWP\Dashboard\MainWP_DB::free_result()
1172 - * @uses \MainWP\Dashboard\MainWP_Menu::init_subpages_menu()
1173 - * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
1174 - * @uses \MainWP\Dashboard\MainWP_System_View::render_footer_content()
1175 - * @uses \MainWP\Dashboard\MainWP_System_View::admin_footer()
1176 - */
1177 - public function admin_footer() {
1178 - if ( ! self::is_mainwp_pages() ) {
1179 - return;
1180 - }
1107 + if ( ! empty( $_GET['page'] ) && in_array( $_GET['page'], array( 'mainwp-setup' ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1108 + return;
1109 + }
1181 1110
1182 - ?>
1183 - <div class="ui large modal" id="mainwp-response-data-modal">
1184 - <i class="close icon"></i>
1185 - <div class="header"><?php esc_html_e( 'Child Site Response', 'mainwp' ); ?></div>
1186 - <div class="content">
1187 - <div class="ui info message"><?php esc_html_e( 'To see the response in a more readable way, you can copy it and paste it into some HTML render tool, such as Codepen.io.', 'mainwp' ); ?>
1188 - </div>
1189 - </div>
1190 - <div class="scrolling content content-response"></div>
1191 - <div class="actions">
1192 - <button class="ui green button mainwp-response-copy-button"><?php esc_html_e( 'Copy Response', 'mainwp' ); ?></button>
1193 - </div>
1194 - </div>
1195 - <div id="mainwp-response-data-container" resp-data=""></div>
1196 - <?php
1111 + if ( static::is_mainwp_pages() && 'yes' === get_option( 'mainwp_activated' ) ) {
1112 + delete_option( 'mainwp_activated' );
1113 + wp_cache_delete( 'mainwp_activated', 'options' );
1114 + wp_cache_delete( 'alloptions', 'options' );
1115 + wp_safe_redirect( admin_url( 'admin.php?page=mainwp_tab' ) );
1116 + exit;
1117 + }
1118 + }
1197 1119
1198 - if ( isset( $_GET['hideall'] ) && 1 === (int) $_GET['hideall'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1199 - return;
1200 - }
1201 - $current_wpid = MainWP_System_Utility::get_current_wpid();
1202 - if ( $current_wpid ) {
1203 - $website = MainWP_DB::instance()->get_website_by_id( $current_wpid );
1204 - $websites = array( $website );
1205 - } else {
1206 - $is_staging = 'no';
1207 - if ( isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1208 - if ( ( 'managesites' === $_GET['page'] ) && ! isset( $_GET['id'] ) && ! isset( $_GET['do'] ) && ! isset( $_GET['dashboard'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1209 - $group_ids = get_user_option( 'mainwp_managesites_filter_group' );
1210 - if ( ! empty( $group_ids ) ) {
1211 - $group_ids = explode( ',', $group_ids ); // convert to array.
1212 - }
1213 - if ( $group_ids ) {
1214 - $staging_group = get_option( 'mainwp_stagingsites_group_id' );
1215 - }
1216 - } elseif ( 'UpdatesManage' === $_GET['page'] || 'mainwp_tab' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1217 - $staging_enabled = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) ? true : false;
1218 - if ( $staging_enabled ) {
1219 - $staging_view = MainWP_System_Utility::get_staging_options_sites_view_for_current_users();
1220 - if ( 'staging' === $staging_view ) {
1221 - $is_staging = 'yes';
1222 - }
1223 - }
1224 - }
1225 - }
1226 - $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp_sync.dtsSync DESC, wp.url ASC', false, false, null, false, array(), $is_staging ) );
1227 - }
1120 + /**
1121 + * Method admin_redirects()
1122 + *
1123 + * MainWP admin redirects.
1124 + */
1125 + public function admin_redirects() {
1126 + if ( ( defined( 'DOING_CRON' ) && DOING_CRON ) || defined( 'DOING_AJAX' ) ) {
1127 + return;
1128 + }
1228 1129
1229 - MainWP_System_View::render_footer_content( $websites, $current_wpid );
1230 - if ( empty( $current_wpid ) ) {
1231 - MainWP_DB::free_result( $websites );
1232 - }
1130 + if ( ! empty( $_GET['page'] ) && in_array( $_GET['page'], array( 'mainwp-setup' ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1131 + return;
1132 + }
1233 1133
1234 - MainWP_System_View::admin_footer();
1235 - MainWP_System_View::render_plugins_install_check();
1134 + $quick_setup = get_option( 'mainwp_run_quick_setup', false );
1135 + if ( 'yes' === $quick_setup ) {
1136 + wp_safe_redirect( admin_url( 'admin.php?page=mainwp-setup' ) );
1137 + exit;
1138 + }
1236 1139
1237 - MainWP_Menu::init_sub_pages();
1140 + $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
1141 + $_pos = strlen( $request_uri ) - strlen( '/wp-admin/' );
1142 + if ( ! empty( $request_uri ) && strpos( $request_uri, '/wp-admin/' ) !== false && strpos( $request_uri, '/wp-admin/' ) === $_pos ) {
1143 + $referer = wp_get_referer();
1144 + if ( ! empty( $referer ) && strpos( $referer, 'wp-login.php?redirect_to' ) !== false && strpos( $referer, '&reauth=1' ) !== false && \mainwp_current_user_can( 'dashboard', 'access_global_dashboard' ) ) {
1145 + wp_safe_redirect( admin_url( 'admin.php?page=mainwp_tab' ) );
1146 + die();
1147 + }
1148 + }
1238 1149
1239 - /**
1240 - * MainWP disabled menu items array.
1241 - *
1242 - * @global object
1243 - */
1244 - global $_mainwp_disable_menus_items;
1150 + MainWP_Logger::instance()->check_log_daily();
1151 + }
1245 1152
1246 - $_mainwp_disable_menus_items = apply_filters( 'mainwp_all_disablemenuitems', $_mainwp_disable_menus_items );
1247 - }
1153 + /**
1154 + * Method init_session()
1155 + *
1156 + * Check current page & initiate a session.
1157 + *
1158 + * @uses \MainWP\Dashboard\MainWP_Cache::init_session()
1159 + */
1160 + public function init_session() {
1161 + $page = isset( $_GET['page'] ) ? wp_unslash( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1162 + if ( ! empty( $page ) && in_array(
1163 + $page,
1164 + array(
1165 + 'PostBulkManage',
1166 + 'PageBulkManage',
1167 + 'PluginsManage',
1168 + 'PluginsAutoUpdate',
1169 + 'ThemesManage',
1170 + 'ThemesAutoUpdate',
1171 + 'UserBulkManage',
1172 + )
1173 + )
1174 + ) {
1175 + MainWP_Cache::init_session();
1176 + }
1177 + }
1248 1178
1249 - /**
1250 - * Method activated_check()
1251 - *
1252 - * Activated check.
1253 - *
1254 - * @uses \MainWP\Dashboard\MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook()
1255 - */
1256 - public function activated_check() {
1257 - MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook();
1258 - return $this->get_version();
1259 - }
1179 + /**
1180 + * Method clear_sessions()
1181 + *
1182 + * When logout clear the sessions to reset.
1183 + */
1184 + public function clear_sessions() {
1185 + MainWP_Cache::init_session();
1186 + $clear_cached = array(
1187 + 'Post',
1188 + 'Page',
1189 + );
1190 + foreach ( $clear_cached as $ca ) {
1191 + MainWP_Cache::init_cache( $ca ); // to re-set cache.
1192 + }
1193 + }
1260 1194
1261 - /**
1262 - * Method activation()
1263 - *
1264 - * Activate MainWP.
1265 - *
1266 - * @uses \MainWP\Dashboard\MainWP_Install::install()
1267 - * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
1268 - */
1269 - public function activation() {
1270 - $this->update_install();
1271 - MainWP_Utility::update_option( 'mainwp_activated', 'yes' );
1272 - }
1273 1195
1274 - /**
1275 - * Method deactivation()
1276 - *
1277 - * Deactivate MainWP.
1278 - */
1279 - public function deactivation() {
1280 - update_option( 'mainwp_extensions_all_activation_cached', '' );
1281 - }
1196 + /**
1197 + * Method admin_enqueue_scripts()
1198 + *
1199 + * Enqueue all Mainwp Admin Scripts.
1200 + */
1201 + public function admin_enqueue_scripts() { // phpcs:ignore -- NOSONAR - complex function.
1282 1202
1283 - /**
1284 - * Method update_install()
1285 - *
1286 - * Update MainWP.
1287 - *
1288 - * @uses \MainWP\Dashboard\MainWP_Install::install()
1289 - */
1290 - public function update_install() {
1291 - MainWP_DB_Client::instance();
1292 - MainWP_DB_Site_Actions::instance();
1293 - MainWP_Install::instance()->install();
1294 - $this->check_to_updates();
1295 - }
1203 + $load_cust_scripts = false;
1296 1204
1205 + /**
1206 + * Current pagenow.
1207 + *
1208 + * @global string
1209 + */
1210 + global $pagenow;
1297 1211
1298 - /**
1299 - * Method check_to_updates()
1300 - *
1301 - * To check updates options.
1302 - */
1303 - public function check_to_updates() {
1304 - $update_ver = get_option( 'mainwp_update_check_version', false );
1305 - $current_ver = $this->check_ver_update;
1212 + if ( is_plugin_active( 'mainwp-custom-post-types/mainwp-custom-post-types.php' ) && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
1213 + $load_cust_scripts = true;
1214 + }
1306 1215
1307 - if ( false === $update_ver && version_compare( $current_ver, '0.0.1', '=' ) ) {
1308 - // to update new saving format.
1309 - MainWP_Api_Manager_Key::instance()->get_decrypt_master_api_key();
1310 - MainWP_Utility::update_option( 'mainwp_update_check_version', $current_ver );
1311 - }
1216 + if ( static::is_mainwp_pages() ) {
1217 + wp_enqueue_script( 'jquery-migrate' );
1218 + wp_enqueue_script( 'mainwp-updates', MAINWP_PLUGIN_URL . 'assets/js/mainwp-updates.js', array(), $this->current_version, true );
1219 + wp_enqueue_script( 'mainwp-managesites-action', MAINWP_PLUGIN_URL . 'assets/js/mainwp-managesites-action.js', array(), $this->current_version, true );
1220 + wp_enqueue_script( 'mainwp-managesites-update', MAINWP_PLUGIN_URL . 'assets/js/mainwp-managesites-update.js', array(), $this->current_version, true );
1221 + wp_enqueue_script( 'mainwp-managesites-import', MAINWP_PLUGIN_URL . 'assets/js/mainwp-managesites-import.js', array(), $this->current_version, true );
1222 + wp_enqueue_script( 'mainwp-plugins-themes', MAINWP_PLUGIN_URL . 'assets/js/mainwp-plugins-themes.js', array(), $this->current_version, true );
1223 + wp_enqueue_script( 'mainwp-backups', MAINWP_PLUGIN_URL . 'assets/js/mainwp-backups.js', array(), $this->current_version, true );
1224 + wp_enqueue_script( 'mainwp-posts', MAINWP_PLUGIN_URL . 'assets/js/mainwp-posts.js', array(), $this->current_version, true );
1225 + wp_enqueue_script( 'mainwp-users', MAINWP_PLUGIN_URL . 'assets/js/mainwp-users.js', array(), $this->current_version, true );
1226 + wp_enqueue_script( 'mainwp-clients', MAINWP_PLUGIN_URL . 'assets/js/mainwp-clients.js', array(), $this->current_version, true );
1227 + wp_enqueue_script( 'mainwp-extensions', MAINWP_PLUGIN_URL . 'assets/js/mainwp-extensions.js', array(), $this->current_version, true );
1228 + wp_enqueue_script( 'moment' );
1229 + wp_enqueue_script( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.js', array( 'jquery' ), $this->current_version, false );
1312 1230
1313 - if ( false === $update_ver ) {
1314 - return;
1315 - }
1316 - }
1231 + wp_enqueue_script( 'datatables', MAINWP_PLUGIN_URL . 'assets/js/datatables/datatables.min.js', array( 'jquery' ), $this->current_version, false );
1232 + wp_enqueue_script( 'datatables-semanticui', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.semanticui.min.js', array( 'datatables' ), $this->current_version, false );
1233 + wp_enqueue_script( 'datatables-select', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.select.min.js', array( 'datatables' ), $this->current_version, false );
1234 + wp_enqueue_script( 'datatables-add-ons', MAINWP_PLUGIN_URL . 'assets/js/datatables/add-ons.datatables.min.js', array( 'datatables' ), $this->current_version, false );
1317 1235
1318 - /**
1319 - * Method is_single_user()
1320 - *
1321 - * Check if single user environment.
1322 - *
1323 - * @return boolean true|false.
1324 - */
1325 - public function is_single_user() {
1326 - return true;
1327 - }
1236 + wp_enqueue_script( 'datatables-natural-sorting', MAINWP_PLUGIN_URL . 'assets/js/sorting/natural.min.js', array( 'jquery', 'datatables' ), $this->current_version, true );
1328 1237
1329 - /**
1330 - * Method is_multi_user()
1331 - *
1332 - * Check if multi user environment.
1333 - *
1334 - * @return boolean true|false.
1335 - */
1336 - public function is_multi_user() {
1337 - return ! $this->is_single_user();
1338 - }
1238 + wp_enqueue_script( 'clipboard' );
1239 + wp_enqueue_script( 'mainwp-rest-api', MAINWP_PLUGIN_URL . 'assets/js/mainwp-rest-api.js', array(), time(), true );
1339 1240
1340 - /**
1341 - * Method get_plugin_slug()
1342 - *
1343 - * Get MainWP Plugin Slug.
1344 - */
1345 - public function get_plugin_slug() {
1346 - return $this->plugin_slug;
1347 - }
1241 + if ( isset( $_GET['page'] ) && 'ManageGroups' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1242 + wp_enqueue_script( 'mainwp-groups', MAINWP_PLUGIN_URL . 'assets/js/mainwp-groups.js', array(), $this->current_version, true );
1243 + }
1244 + $enqueue_scripts = apply_filters( 'mainwp_admin_enqueue_scripts', array() );
1245 + if ( is_array( $enqueue_scripts ) && ! empty( $enqueue_scripts['apexcharts'] ) ) {
1246 + wp_enqueue_script(
1247 + 'mainwp-apexcharts',
1248 + MAINWP_PLUGIN_URL . 'assets/js/apexcharts/apexcharts.min.js',
1249 + array(
1250 + 'jquery',
1251 + 'mainwp',
1252 + ),
1253 + $this->current_version,
1254 + true
1255 + );
1256 + static::$defer_js_handle[] = 'mainwp-apexcharts';
1257 + }
1258 + wp_enqueue_script( 'mainwp-dropzone', MAINWP_PLUGIN_URL . 'assets/js/dropzone/dropzone.min.js', array(), $this->current_version, true );
1259 + wp_enqueue_script( 'mainwp-uptime', MAINWP_PLUGIN_URL . 'assets/js/mainwp-uptime.js', array( 'jquery', 'fomantic-ui' ), $this->current_version, true );
1260 + static::$defer_js_handle = array_merge( static::$defer_js_handle, array( 'mainwp-updates', 'mainwp-managesites-action', 'mainwp-managesites-update', 'mainwp-managesites-import', 'mainwp-plugins-themes', 'mainwp-managesites-import', 'mainwp-plugins-themes', 'mainwp-backups', 'mainwp-posts', 'mainwp-users', 'mainwp-clients', 'fomantic-ui', 'datatables', 'datatables-semanticui', 'datatables-select', 'datatables-add-ons', 'mainwp-dropzone', 'mainwp-uptime' ) );
1261 +
1262 + }
1263 +
1264 + if ( $load_cust_scripts ) {
1265 + static::$defer_js_handle[] = 'fomantic-ui';
1266 + wp_enqueue_script( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.js', array( 'jquery' ), $this->current_version, true );
1267 + }
1268 +
1269 + wp_enqueue_script( 'mainwp-ui', MAINWP_PLUGIN_URL . 'assets/js/mainwp-ui.js', array(), $this->current_version, true );
1270 + wp_localize_script(
1271 + 'mainwp-ui',
1272 + 'mainwpWidgetLayout',
1273 + array(
1274 + 'openNonce' => wp_create_nonce( 'mainwp-admin-nonce' ),
1275 + )
1276 + );
1277 + wp_enqueue_script( 'mainwp-js-popup', MAINWP_PLUGIN_URL . 'assets/js/mainwp-popup.js', array(), $this->current_version, true );
1278 + // to support extension uploader.
1279 + wp_enqueue_script( 'mainwp-fileuploader', MAINWP_PLUGIN_URL . 'assets/js/fileuploader.js', array(), $this->current_version ); // phpcs:ignore -- fileuploader scripts need to load at header.
1280 + wp_enqueue_script( 'mainwp-filesaver', MAINWP_PLUGIN_URL . 'assets/js/FileSaver.js', array(), $this->current_version, true );
1281 +
1282 + static::$defer_js_handle[] = 'mainwp-ui';
1283 +
1284 + if ( is_array( static::$defer_js_handle ) ) {
1285 + $defer_handle = array_filter( array_unique( static::$defer_js_handle ) );
1286 + foreach ( $defer_handle as $h ) {
1287 + if ( wp_script_is( $h, 'enqueued' ) || wp_script_is( $h, 'registered' ) ) {
1288 + wp_script_add_data( $h, 'strategy', 'defer' ); // adds defer to <script> tag.
1289 + }
1290 + }
1291 + }
1292 +
1293 + $this->enqueue_command_palette_script();
1294 + }
1295 +
1296 + /**
1297 + * Enqueue the MainWP command palette integration.
1298 + */
1299 + private function enqueue_command_palette_script() {
1300 +
1301 + if ( ! wp_script_is( 'wp-core-commands', 'enqueued' ) ) {
1302 + return;
1303 + }
1304 +
1305 + $palette_data = $this->get_command_palette_data();
1306 +
1307 + if ( empty( $palette_data['commands'] ) && empty( $palette_data['unregister'] ) ) {
1308 + return;
1309 + }
1310 +
1311 + wp_enqueue_script(
1312 + 'mainwp-command-palette',
1313 + MAINWP_PLUGIN_URL . 'assets/js/mainwp-command-palette.js',
1314 + array( 'wp-core-commands', 'wp-data' ),
1315 + $this->current_version,
1316 + true
1317 + );
1318 +
1319 + wp_add_inline_script(
1320 + 'mainwp-command-palette',
1321 + 'window.mainwpCommandPalette = ' . wp_json_encode( $palette_data, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ';',
1322 + 'before'
1323 + );
1324 + }
1325 +
1326 + /**
1327 + * Build the MainWP command palette configuration.
1328 + *
1329 + * @return array<string, array<int, mixed>> Command palette configuration.
1330 + */
1331 + private function get_command_palette_data() {
1332 + $registered_pages = $this->get_command_palette_registered_pages();
1333 + $registered_page_urls = array();
1334 +
1335 + foreach ( $registered_pages as $slug => $page_data ) {
1336 + $registered_page_urls[ $slug ] = $page_data['url'];
1337 + }
1338 +
1339 + $commands = $this->get_command_palette_menu_commands( $registered_pages );
1340 +
1341 + if ( empty( $commands ) ) {
1342 + return array(
1343 + 'commands' => array(),
1344 + 'unregister' => array(),
1345 + );
1346 + }
1347 +
1348 + $commands = apply_filters( 'mainwp_command_palette_commands', $commands, $registered_page_urls );
1349 +
1350 + $unregister = array( 'mainwp_tab' );
1351 + foreach ( array_keys( $registered_pages ) as $slug ) {
1352 + $unregister[] = 'mainwp_tab-' . $slug;
1353 + }
1354 +
1355 + $unregister = apply_filters( 'mainwp_command_palette_unregister', array_values( array_unique( $unregister ) ), $registered_page_urls );
1356 +
1357 + return array(
1358 + 'commands' => array_values( array_filter( $commands ) ),
1359 + 'unregister' => array_values( array_filter( $unregister ) ),
1360 + );
1361 + }
1362 +
1363 + /**
1364 + * Get registered MainWP submenu pages that can be opened from the palette.
1365 + *
1366 + * @return array<string, array<string, mixed>> Registered page map.
1367 + */
1368 + private function get_command_palette_registered_pages() {
1369 + global $submenu;
1370 +
1371 + if ( empty( $submenu['mainwp_tab'] ) || ! is_array( $submenu['mainwp_tab'] ) ) {
1372 + return array();
1373 + }
1374 +
1375 + $registered_pages = array();
1376 +
1377 + foreach ( $submenu['mainwp_tab'] as $submenu_item ) {
1378 + if ( empty( $submenu_item[2] ) || ( ! empty( $submenu_item[1] ) && ! current_user_can( $submenu_item[1] ) ) ) {
1379 + continue;
1380 + }
1381 +
1382 + $menu_slug = (string) $submenu_item[2];
1383 + $menu_url = '';
1384 +
1385 + if ( preg_match( '/\.php($|\?)/', $menu_slug ) || $this->is_command_palette_absolute_url( $menu_slug ) ) {
1386 + $menu_url = $menu_slug;
1387 + } elseif ( ! empty( menu_page_url( $menu_slug, false ) ) ) {
1388 + $menu_url = wp_specialchars_decode( menu_page_url( $menu_slug, false ), ENT_QUOTES );
1389 + }
1390 +
1391 + if ( empty( $menu_url ) ) {
1392 + continue;
1393 + }
1394 +
1395 + $raw_label = isset( $submenu_item[0] ) ? (string) $submenu_item[0] : '';
1396 +
1397 + $registered_pages[ $menu_slug ] = array(
1398 + 'label' => $this->clean_command_palette_label( $raw_label ),
1399 + 'url' => $menu_url,
1400 + 'hidden' => false !== strpos( $raw_label, 'mainwp-hidden' ),
1401 + );
1402 + }
1403 +
1404 + return $registered_pages;
1405 + }
1406 +
1407 + /**
1408 + * Build MainWP command-palette commands from runtime menu data.
1409 + *
1410 + * @param array<string, array<string, mixed>> $registered_pages Registered MainWP pages.
1411 + *
1412 + * @return array<int, array<string, mixed>> Command list.
1413 + */
1414 + private function get_command_palette_menu_commands( $registered_pages ) {
1415 + $menu_nodes = $this->get_command_palette_menu_nodes();
1416 +
1417 + if ( empty( $menu_nodes ) ) {
1418 + $menu_nodes = array();
1419 + }
1420 +
1421 + $nodes_by_id = array();
1422 + $nodes_by_slug = array();
1423 +
1424 + foreach ( $menu_nodes as $node ) {
1425 + $nodes_by_id[ $node['id'] ] = $node;
1426 +
1427 + if ( ! empty( $node['slug_key'] ) && ! isset( $nodes_by_slug[ $node['slug_key'] ] ) ) {
1428 + $nodes_by_slug[ $node['slug_key'] ] = $node['id'];
1429 + }
1430 + }
1431 +
1432 + $commands_by_url = array();
1433 + $command_page_slugs = array();
1434 +
1435 + foreach ( $menu_nodes as $node ) {
1436 + $path_titles = $this->get_command_palette_menu_path_titles( $node, $nodes_by_id, $nodes_by_slug );
1437 +
1438 + if ( empty( $path_titles ) ) {
1439 + continue;
1440 + }
1441 +
1442 + $label = sprintf( __( 'Go to: MainWP > %s', 'mainwp' ), implode( ' > ', $path_titles ) );
1443 +
1444 + $command_name = ! empty( $node['page_slug'] ) && isset( $registered_pages[ $node['page_slug'] ] )
1445 + ? 'mainwp_tab-' . $node['page_slug']
1446 + : 'mainwp-command-' . sanitize_key( ! empty( $node['page_slug'] ) ? $node['page_slug'] : md5( $node['url'] ) );
1447 +
1448 + $command = array(
1449 + 'name' => $command_name,
1450 + 'label' => $label,
1451 + 'url' => $node['url'],
1452 + 'keywords' => $this->get_command_palette_keywords( $path_titles, $node['page_slug'] ),
1453 + 'searchLabel' => $label,
1454 + '_depth' => count( $path_titles ),
1455 + );
1456 +
1457 + if ( ! isset( $commands_by_url[ $node['url'] ] ) || $command['_depth'] > $commands_by_url[ $node['url'] ]['_depth'] ) {
1458 + $commands_by_url[ $node['url'] ] = $command;
1459 + }
1460 +
1461 + if ( ! empty( $node['page_slug'] ) ) {
1462 + $command_page_slugs[ $node['page_slug'] ] = true;
1463 + }
1464 + }
1465 +
1466 + foreach ( $this->get_command_palette_utility_commands( $registered_pages ) as $command ) {
1467 + if ( empty( $command['url'] ) || empty( $command['label'] ) ) {
1468 + continue;
1469 + }
1470 +
1471 + $command['_depth'] = isset( $command['_depth'] ) ? (int) $command['_depth'] : 1;
1472 +
1473 + if (
1474 + ! isset( $commands_by_url[ $command['url'] ] ) ||
1475 + $command['_depth'] >= $commands_by_url[ $command['url'] ]['_depth']
1476 + ) {
1477 + $commands_by_url[ $command['url'] ] = $command;
1478 + }
1479 +
1480 + if ( ! empty( $command['_page_slug'] ) ) {
1481 + $command_page_slugs[ $command['_page_slug'] ] = true;
1482 + }
1483 + }
1484 +
1485 + foreach ( $registered_pages as $page_slug => $page_data ) {
1486 + if (
1487 + isset( $command_page_slugs[ $page_slug ] ) ||
1488 + empty( $page_data['label'] ) ||
1489 + empty( $page_data['url'] ) ||
1490 + ! empty( $page_data['hidden'] )
1491 + ) {
1492 + continue;
1493 + }
1494 +
1495 + if ( isset( $commands_by_url[ $page_data['url'] ] ) ) {
1496 + continue;
1497 + }
1498 +
1499 + $label = sprintf( __( 'Go to: MainWP > %s', 'mainwp' ), $page_data['label'] );
1500 +
1501 + $commands_by_url[ $page_data['url'] ] = array(
1502 + 'name' => 'mainwp_tab-' . $page_slug,
1503 + 'label' => $label,
1504 + 'url' => $page_data['url'],
1505 + 'keywords' => $this->get_command_palette_keywords( array( $page_data['label'] ), $page_slug ),
1506 + 'searchLabel' => $label,
1507 + '_depth' => 1,
1508 + );
1509 + }
1510 +
1511 + foreach ( $commands_by_url as &$command ) {
1512 + unset( $command['_depth'], $command['_page_slug'] );
1513 + }
1514 + unset( $command );
1515 +
1516 + return array_values( $commands_by_url );
1517 + }
1518 +
1519 + /**
1520 + * Build command-palette commands for MainWP pages that do not reliably exist in the global sidebar tree.
1521 + *
1522 + * @param array<string, array<string, mixed>> $registered_pages Registered MainWP pages.
1523 + *
1524 + * @return array<int, array<string, mixed>> Command list.
1525 + */
1526 + private function get_command_palette_utility_commands( $registered_pages ) {
1527 + return array_merge(
1528 + $this->get_command_palette_settings_commands( $registered_pages ),
1529 + $this->get_command_palette_info_commands( $registered_pages )
1530 + );
1531 + }
1532 +
1533 + /**
1534 + * Build Settings-section command palette commands.
1535 + *
1536 + * @param array<string, array<string, mixed>> $registered_pages Registered MainWP pages.
1537 + *
1538 + * @return array<int, array<string, mixed>> Command list.
1539 + */
1540 + private function get_command_palette_settings_commands( $registered_pages ) {
1541 + $commands = array();
1542 +
1543 + foreach ( MainWP_Settings::get_command_palette_items() as $item ) {
1544 + if ( empty( $item['slug'] ) || empty( $item['path_titles'] ) ) {
1545 + continue;
1546 + }
1547 +
1548 + $commands[] = $this->build_command_palette_registered_command(
1549 + $registered_pages,
1550 + $item['slug'],
1551 + $item['path_titles'],
1552 + array( 'mainwp settings' ),
1553 + isset( $item['href'] ) ? $item['href'] : ''
1554 + );
1555 + }
1556 +
1557 + return array_values( array_filter( $commands ) );
1558 + }
1559 +
1560 + /**
1561 + * Build System Info and profile utility command palette commands.
1562 + *
1563 + * @param array<string, array<string, mixed>> $registered_pages Registered MainWP pages.
1564 + *
1565 + * @return array<int, array<string, mixed>> Command list.
1566 + */
1567 + private function get_command_palette_info_commands( $registered_pages ) {
1568 + $commands = array();
1569 +
1570 + foreach ( MainWP_Server_Information::get_command_palette_items() as $item ) {
1571 + if ( empty( $item['slug'] ) || empty( $item['path_titles'] ) ) {
1572 + continue;
1573 + }
1574 +
1575 + $commands[] = $this->build_command_palette_registered_command(
1576 + $registered_pages,
1577 + $item['slug'],
1578 + $item['path_titles'],
1579 + array( 'system info', 'server info' ),
1580 + isset( $item['href'] ) ? $item['href'] : ''
1581 + );
1582 + }
1583 +
1584 + return array_values( array_filter( $commands ) );
1585 + }
1586 +
1587 + /**
1588 + * Build a command palette command for a registered page.
1589 + *
1590 + * @param array<string, array<string, mixed>> $registered_pages Registered MainWP pages.
1591 + * @param string $page_slug Registered page slug.
1592 + * @param array<int, string> $path_titles Breadcrumb path labels.
1593 + * @param array<int, string> $extra_keywords Additional search keywords.
1594 + * @param string $href Optional command href override.
1595 + *
1596 + * @return array<string, mixed>|null Command configuration.
1597 + */
1598 + private function build_command_palette_registered_command( $registered_pages, $page_slug, $path_titles, $extra_keywords = array(), $href = '' ) {
1599 + if ( empty( $registered_pages[ $page_slug ]['url'] ) ) {
1600 + return null;
1601 + }
1602 +
1603 + $path_titles = array_values(
1604 + array_filter(
1605 + array_map(
1606 + array( $this, 'clean_command_palette_label' ),
1607 + is_array( $path_titles ) ? $path_titles : array()
1608 + )
1609 + )
1610 + );
1611 +
1612 + if ( empty( $path_titles ) ) {
1613 + return null;
1614 + }
1615 +
1616 + $keywords = $this->get_command_palette_keywords( $path_titles, $page_slug );
1617 +
1618 + foreach ( $extra_keywords as $keyword ) {
1619 + $keyword = strtolower( $this->clean_command_palette_label( $keyword ) );
1620 +
1621 + if ( ! empty( $keyword ) ) {
1622 + $keywords[] = $keyword;
1623 + }
1624 + }
1625 +
1626 + $label = sprintf( __( 'Go to: MainWP > %s', 'mainwp' ), implode( ' > ', $path_titles ) );
1627 + $url = ! empty( $href ) ? $this->normalize_command_palette_url( $href, $page_slug ) : $registered_pages[ $page_slug ]['url'];
1628 +
1629 + if ( empty( $url ) ) {
1630 + return null;
1631 + }
1632 +
1633 + return array(
1634 + 'name' => 'mainwp_tab-' . $page_slug,
1635 + 'label' => $label,
1636 + 'url' => $url,
1637 + 'keywords' => array_values( array_unique( array_filter( $keywords ) ) ),
1638 + 'searchLabel' => $label,
1639 + '_depth' => count( $path_titles ),
1640 + '_page_slug' => $page_slug,
1641 + );
1642 + }
1643 +
1644 + /**
1645 + * Collect MainWP menu nodes from the runtime left-menu structures.
1646 + *
1647 + * @return array<int, array<string, string>> Menu nodes.
1648 + */
1649 + private function get_command_palette_menu_nodes() {
1650 + global $mainwp_leftmenu, $mainwp_sub_leftmenu;
1651 +
1652 + $left_menu = apply_filters( 'mainwp_main_menu', is_array( $mainwp_leftmenu ) ? $mainwp_leftmenu : array() );
1653 + $sub_left_menu = apply_filters( 'mainwp_main_menu_submenu', is_array( $mainwp_sub_leftmenu ) ? $mainwp_sub_leftmenu : array() );
1654 + $menu_nodes = array();
1655 +
1656 + if ( ! empty( $left_menu['leftbar'] ) && is_array( $left_menu['leftbar'] ) ) {
1657 + foreach ( $left_menu['leftbar'] as $item ) {
1658 + $this->add_command_palette_menu_node(
1659 + $menu_nodes,
1660 + isset( $item[0] ) ? $item[0] : '',
1661 + isset( $item[2] ) ? $item[2] : '',
1662 + isset( $item[1] ) ? $item[1] : '',
1663 + 'mainwp_tab'
1664 + );
1665 + }
1666 + }
1667 +
1668 + foreach ( $left_menu as $parent_key => $items ) {
1669 + if ( 'leftbar' === $parent_key || ! is_array( $items ) ) {
1670 + continue;
1671 + }
1672 +
1673 + foreach ( $items as $item ) {
1674 + $this->add_command_palette_menu_node(
1675 + $menu_nodes,
1676 + isset( $item[0] ) ? $item[0] : '',
1677 + isset( $item[2] ) ? $item[2] : '',
1678 + isset( $item[1] ) ? $item[1] : '',
1679 + $parent_key
1680 + );
1681 + }
1682 + }
1683 +
1684 + if ( ! empty( $sub_left_menu['leftbar'] ) && is_array( $sub_left_menu['leftbar'] ) ) {
1685 + foreach ( $sub_left_menu['leftbar'] as $parent_key => $items ) {
1686 + if ( ! is_array( $items ) ) {
1687 + continue;
1688 + }
1689 +
1690 + foreach ( $items as $item ) {
1691 + $this->add_command_palette_menu_node(
1692 + $menu_nodes,
1693 + isset( $item[0] ) ? $item[0] : '',
1694 + isset( $item[2] ) ? $item[2] : '',
1695 + isset( $item[1] ) ? $item[1] : '',
1696 + $parent_key
1697 + );
1698 + }
1699 + }
1700 + }
1701 +
1702 + foreach ( $sub_left_menu as $parent_key => $items ) {
1703 + if ( 'leftbar' === $parent_key || ! is_array( $items ) ) {
1704 + continue;
1705 + }
1706 +
1707 + foreach ( $items as $item ) {
1708 + $this->add_command_palette_menu_node(
1709 + $menu_nodes,
1710 + isset( $item[0] ) ? $item[0] : '',
1711 + isset( $item[1] ) ? $item[1] : '',
1712 + isset( $item[4] ) ? $item[4] : '',
1713 + $parent_key
1714 + );
1715 + }
1716 + }
1717 +
1718 + return $menu_nodes;
1719 + }
1720 +
1721 + /**
1722 + * Add a single node to the command palette source list.
1723 + *
1724 + * @param array<int, array<string, string>> $menu_nodes Menu nodes.
1725 + * @param string $title Menu title.
1726 + * @param string $href Menu href.
1727 + * @param string $slug Menu slug.
1728 + * @param string $parent_key Parent menu slug.
1729 + */
1730 + private function add_command_palette_menu_node( &$menu_nodes, $title, $href, $slug, $parent_key ) {
1731 + $title = $this->clean_command_palette_label( $title );
1732 + $url = $this->normalize_command_palette_url( $href, $slug );
1733 +
1734 + if ( empty( $title ) || empty( $url ) ) {
1735 + return;
1736 + }
1737 +
1738 + $page_slug = $this->get_command_palette_page_slug_from_url( $url );
1739 + $slug_key = ! empty( $slug ) ? (string) $slug : $page_slug;
1740 +
1741 + $menu_nodes[] = array(
1742 + 'id' => md5( $parent_key . '|' . $slug_key . '|' . $url . '|' . $title ),
1743 + 'parent' => (string) $parent_key,
1744 + 'page_slug' => $page_slug,
1745 + 'slug_key' => $slug_key,
1746 + 'title' => $title,
1747 + 'url' => $url,
1748 + );
1749 + }
1750 +
1751 + /**
1752 + * Build a node breadcrumb from the MainWP menu tree.
1753 + *
1754 + * @param array<string, string> $node Menu node.
1755 + * @param array<string, array<string, string>> $nodes_by_id Menu nodes indexed by id.
1756 + * @param array<string, string> $nodes_by_slug Menu nodes indexed by slug.
1757 + *
1758 + * @return array<int, string> Path titles.
1759 + */
1760 + private function get_command_palette_menu_path_titles( $node, $nodes_by_id, $nodes_by_slug ) {
1761 + $titles = array();
1762 + $current = $node;
1763 + $seen_nodes = array();
1764 +
1765 + while ( is_array( $current ) && ! empty( $current['id'] ) && ! isset( $seen_nodes[ $current['id'] ] ) ) {
1766 + $seen_nodes[ $current['id'] ] = true;
1767 +
1768 + if ( ! empty( $current['title'] ) ) {
1769 + array_unshift( $titles, $current['title'] );
1770 + }
1771 +
1772 + if ( empty( $current['parent'] ) || 'mainwp_tab' === $current['parent'] || ! isset( $nodes_by_slug[ $current['parent'] ] ) ) {
1773 + break;
1774 + }
1775 +
1776 + $parent_id = $nodes_by_slug[ $current['parent'] ];
1777 + $current = isset( $nodes_by_id[ $parent_id ] ) ? $nodes_by_id[ $parent_id ] : array();
1778 + }
1779 +
1780 + return $titles;
1781 + }
1782 +
1783 + /**
1784 + * Build search keywords for a MainWP command.
1785 + *
1786 + * @param array<int, string> $path_titles Path titles.
1787 + * @param string $page_slug Page slug.
1788 + *
1789 + * @return array<int, string> Search keywords.
1790 + */
1791 + private function get_command_palette_keywords( $path_titles, $page_slug = '' ) {
1792 + $keywords = array( 'mainwp' );
1793 +
1794 + foreach ( $path_titles as $title ) {
1795 + $keywords[] = strtolower( $title );
1796 + }
1797 +
1798 + if ( ! empty( $page_slug ) ) {
1799 + $keywords[] = strtolower( str_replace( array( '-', '_' ), ' ', $page_slug ) );
1800 + }
1801 +
1802 + return array_values( array_unique( array_filter( $keywords ) ) );
1803 + }
1804 +
1805 + /**
1806 + * Normalize menu text into readable plain text.
1807 + *
1808 + * @param string $label Raw menu label.
1809 + *
1810 + * @return string Plain-text label.
1811 + */
1812 + private function clean_command_palette_label( $label ) {
1813 + $label = wp_specialchars_decode( wp_strip_all_tags( (string) $label ), ENT_QUOTES );
1814 + $label = preg_replace( '/\s+/', ' ', $label );
1815 +
1816 + return trim( (string) $label );
1817 + }
1818 +
1819 + /**
1820 + * Check whether a command-palette URL is already absolute.
1821 + *
1822 + * @param string $url URL to check.
1823 + *
1824 + * @return bool True when the URL is an absolute HTTP(S) URL.
1825 + */
1826 + private function is_command_palette_absolute_url( $url ) {
1827 + return 1 === preg_match( '/^https?:\/\//i', trim( (string) $url ) );
1828 + }
1829 +
1830 + /**
1831 + * Normalize a MainWP menu href into a usable URL.
1832 + *
1833 + * @param string $href Menu href.
1834 + * @param string $slug Menu slug.
1835 + *
1836 + * @return string Normalized URL.
1837 + */
1838 + private function normalize_command_palette_url( $href, $slug = '' ) {
1839 + $href = trim( wp_specialchars_decode( (string) $href, ENT_QUOTES ) );
1840 + $slug = trim( (string) $slug );
1841 +
1842 + if ( empty( $href ) || '#' === $href || 0 === strpos( $href, 'javascript:' ) ) {
1843 + if ( empty( $slug ) || preg_match( '/\.php($|\?)/', $slug ) || $this->is_command_palette_absolute_url( $slug ) ) {
1844 + return '';
1845 + }
1846 +
1847 + return admin_url( 'admin.php?page=' . $slug );
1848 + }
1849 +
1850 + if ( $this->is_command_palette_absolute_url( $href ) ) {
1851 + return $href;
1852 + }
1853 +
1854 + return admin_url( ltrim( $href, '/' ) );
1855 + }
1856 +
1857 + /**
1858 + * Extract a page slug from a menu URL when one exists.
1859 + *
1860 + * @param string $url Menu URL.
1861 + *
1862 + * @return string Page slug.
1863 + */
1864 + private function get_command_palette_page_slug_from_url( $url ) {
1865 + $query = wp_parse_url( $url, PHP_URL_QUERY );
1866 +
1867 + if ( empty( $query ) ) {
1868 + return '';
1869 + }
1870 +
1871 + parse_str( $query, $query_args );
1872 +
1873 + if ( ! isset( $query_args['page'] ) ) {
1874 + return '';
1875 + }
1876 +
1877 + return preg_replace( '/[^A-Za-z0-9_-]/', '', (string) $query_args['page'] );
1878 + }
1879 +
1880 + /**
1881 + * Method admin_enqueue_scripts_fix_conflict()
1882 + *
1883 + * Enqueue Admin Scripts fix conflict.
1884 + */
1885 + public function admin_enqueue_scripts_fix_conflict() {
1886 + if ( static::is_mainwp_pages() ) {
1887 + // to fix conflict with the SVG Support plugin.
1888 + remove_action( 'admin_enqueue_scripts', 'bodhi_svgs_admin_multiselect' );
1889 + }
1890 + }
1891 +
1892 + /**
1893 + * Method admin_enqueue_styles()
1894 + *
1895 + * Enqueue all Mainwp Admin Styles.
1896 + */
1897 + public function admin_enqueue_styles() { //phpcs:ignore -- NOSONAR - complex.
1898 +
1899 + wp_enqueue_style( 'mainwp', MAINWP_PLUGIN_URL . 'assets/css/mainwp.css', array(), $this->current_version );
1900 + wp_enqueue_style( 'mainwp-responsive-layouts', MAINWP_PLUGIN_URL . 'assets/css/mainwp-responsive-layouts.css', array(), $this->current_version );
1901 +
1902 + if ( isset( $_GET['hideall'] ) && 1 === (int) $_GET['hideall'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1903 + remove_action( 'admin_footer', 'wp_admin_bar_render', 1000 );
1904 + }
1905 +
1906 + /**
1907 + * Current pagenow.
1908 + *
1909 + * @global string
1910 + */
1911 + global $pagenow;
1912 +
1913 + $load_cust_scripts = false;
1914 + if ( is_plugin_active( 'mainwp-custom-post-types/mainwp-custom-post-types.php' ) && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
1915 + $load_cust_scripts = true;
1916 + }
1917 +
1918 + if ( static::is_mainwp_pages() ) {
1919 + wp_enqueue_style( 'mainwp-fonts', MAINWP_PLUGIN_URL . 'assets/css/mainwp-fonts.css', array(), $this->current_version );
1920 + wp_enqueue_style( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.css', array(), $this->current_version );
1921 + wp_enqueue_style( 'mainwp-fomantic', MAINWP_PLUGIN_URL . 'assets/css/mainwp-fomantic.css', array(), $this->current_version );
1922 +
1923 + wp_enqueue_style( 'datatables', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.dataTables.min.css', array(), $this->current_version );
1924 + wp_enqueue_style( 'datatables-semanticui', MAINWP_PLUGIN_URL . 'assets/js/datatables/dataTables.semanticui.min.css', array(), $this->current_version );
1925 + wp_enqueue_style( 'datatables-select', MAINWP_PLUGIN_URL . 'assets/js/datatables/select.semanticui.min.css', array(), $this->current_version );
1926 + wp_enqueue_style( 'datatables-add-ons', MAINWP_PLUGIN_URL . 'assets/js/datatables/add-ons.datatables.min.css', array(), $this->current_version );
1927 + // to fix conflict layout.
1928 + wp_enqueue_style( 'jquery-ui-style', MAINWP_PLUGIN_URL . 'assets/css/1.11.1/jquery-ui.min.css', array(), '1.11.1' );
1929 +
1930 + // load custom MainWP theme.
1931 + $selected_theme = MainWP_Settings::get_instance()->get_selected_theme();
1932 + if ( ! empty( $selected_theme ) ) {
1933 + if ( 'dark' === $selected_theme ) {
1934 + wp_enqueue_style( 'mainwp-custom-dashboard-extension-dark-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-dark-theme.css', array(), $this->current_version );
1935 + } elseif ( 'wpadmin' === $selected_theme ) {
1936 + wp_enqueue_style( 'mainwp-custom-dashboard-extension-wp-admin-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-wpadmin-theme.css', array(), $this->current_version );
1937 + } elseif ( 'minimalistic' === $selected_theme ) {
1938 + wp_enqueue_style( 'mainwp-custom-dashboard-extension-minimalistic-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-minimalistic-theme.css', array(), $this->current_version );
1939 + } elseif ( 'default-2024' === $selected_theme ) {
1940 + wp_enqueue_style( 'mainwp-custom-dashboard-extension-default-2024-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-default-2024-theme.css', array(), $this->current_version );
1941 + } elseif ( 'default' === $selected_theme ) {
1942 + wp_enqueue_style( 'mainwp-custom-dashboard-extension-default-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-default-theme.css', array(), $this->current_version );
1943 + } elseif ( 'default-dark' === $selected_theme ) {
1944 + wp_enqueue_style( 'mainwp-custom-dashboard-extension-default-dark-theme', MAINWP_PLUGIN_URL . 'assets/css/themes/mainwp-default-dark-theme.css', array(), $this->current_version );
1945 + } else {
1946 + $dirs = MainWP_Settings::get_instance()->get_custom_theme_folder();
1947 + $custom_theme_url = $dirs[1];
1948 + wp_enqueue_style( 'mainwp-custom-dashboard-theme', $custom_theme_url . $selected_theme, array(), $this->current_version );
1949 + }
1950 + }
1951 + }
1952 +
1953 + if ( $load_cust_scripts ) {
1954 + wp_enqueue_style( 'mainwp-fonts', MAINWP_PLUGIN_URL . 'assets/css/mainwp-fonts.css', array(), $this->current_version );
1955 + wp_enqueue_style( 'fomantic-ui', MAINWP_PLUGIN_URL . 'assets/js/fomantic-ui/fomantic-ui.css', array(), $this->current_version );
1956 + }
1957 + }
1958 +
1959 + /**
1960 + * Method admin_menu()
1961 + *
1962 + * Add Bulk Post/Pages menue.
1963 + */
1964 + public function admin_menu() {
1965 +
1966 + /**
1967 + * Admin menu array.
1968 + *
1969 + * @global object
1970 + */
1971 + global $menu;
1972 +
1973 + foreach ( $menu as $k => $item ) {
1974 + if ( 'edit.php?post_type=bulkpost' === $item[2] || 'edit.php?post_type=bulkpage' === $item[2] ) {
1975 + unset( $menu[ $k ] );
1976 + }
1977 + }
1978 + }
1979 +
1980 + /**
1981 + * Method enqueue_postbox_scripts()
1982 + *
1983 + * Enqueue postbox scripts.
1984 + */
1985 + public static function enqueue_postbox_scripts() {
1986 + wp_enqueue_script( 'common' );
1987 + wp_enqueue_script( 'wp-lists' );
1988 + wp_enqueue_script( 'postbox' );
1989 + }
1990 +
1991 + /**
1992 + * Method admin_footer()
1993 + *
1994 + * Create MainWP admin footer.
1995 + *
1996 + * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
1997 + * @uses \MainWP\Dashboard\MainWP_DB::query()
1998 + * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
1999 + * @uses \MainWP\Dashboard\MainWP_DB::free_result()
2000 + * @uses \MainWP\Dashboard\MainWP_Menu::init_subpages_menu()
2001 + * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
2002 + * @uses \MainWP\Dashboard\MainWP_System_View::render_footer_content()
2003 + * @uses \MainWP\Dashboard\MainWP_System_View::admin_footer()
2004 + */
2005 + public function admin_footer() { //phpcs:ignore -- NOSONAR - complex.
2006 + if ( ! static::is_mainwp_pages() ) {
2007 + $sites_count = MainWP_DB::instance()->get_websites_count();
2008 + if ( empty( $sites_count ) ) {
2009 + ?>
2010 + <script type="text/javascript">
2011 + jQuery( function($){
2012 + $( 'li#toplevel_page_mainwp_tab .wp-submenu-wrap .wp-submenu-head' ).after('<li style="background: #FFD300 !important;" class="wp-first-item"><a href="admin.php?page=mainwp-setup" style="color: #000 !important;" class="wp-first-item"><?php esc_html_e( 'Quick Setup', 'mainwp' ); ?></a></li>');
2013 + });
2014 + </script>
2015 + <?php
2016 + }
2017 + return;
2018 + }
2019 +
2020 + ?>
2021 + <div class="ui large modal" id="mainwp-response-data-modal">
2022 + <i class="close icon"></i>
2023 + <div class="header"><?php esc_html_e( 'Child Site Response', 'mainwp' ); ?></div>
2024 + <div class="content">
2025 + <div class="ui info message"><?php esc_html_e( 'To see the response in a more readable way, you can copy it and paste it into some HTML render tool, such as Codepen.io.', 'mainwp' ); ?>
2026 + </div>
2027 + </div>
2028 + <div class="scrolling content content-response" contenteditable="true"></div>
2029 + <div class="actions">
2030 + <button class="ui green button mainwp-response-copy-button"><?php esc_html_e( 'Copy Response', 'mainwp' ); ?></button>
2031 + </div>
2032 + </div>
2033 + <div id="mainwp-response-data-container" resp-data=""></div>
2034 + <?php
2035 +
2036 + if ( isset( $_GET['hideall'] ) && 1 === (int) $_GET['hideall'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2037 + return;
2038 + }
2039 + $current_wpid = MainWP_System_Utility::get_current_wpid();
2040 + if ( $current_wpid ) {
2041 + $website = MainWP_DB::instance()->get_website_by_id( $current_wpid );
2042 + $websites = array( $website );
2043 + } else {
2044 + $is_staging = 'no';
2045 + if ( isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2046 + if ( ( 'managesites' === $_GET['page'] ) && ! isset( $_GET['id'] ) && ! isset( $_GET['do'] ) && ! isset( $_GET['dashboard'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2047 + $group_ids = get_user_option( 'mainwp_managesites_filter_group' );
2048 + if ( ! empty( $group_ids ) ) {
2049 + $group_ids = explode( ',', $group_ids ); // convert to array.
2050 + }
2051 + } elseif ( 'UpdatesManage' === $_GET['page'] || 'mainwp_tab' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2052 + $staging_enabled = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) ? true : false;
2053 + if ( $staging_enabled ) {
2054 + $staging_view = MainWP_System_Utility::get_select_staging_view_sites();
2055 + if ( 'staging' === $staging_view ) {
2056 + $is_staging = 'yes';
2057 + }
2058 + }
2059 + }
2060 + }
2061 + $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp_sync.dtsSync DESC, wp.url ASC', false, false, null, false, array(), $is_staging ) );
2062 + }
2063 +
2064 + MainWP_System_View::render_footer_content( $websites, $current_wpid );
2065 + if ( empty( $current_wpid ) ) {
2066 + MainWP_DB::free_result( $websites );
2067 + }
2068 +
2069 + MainWP_System_View::admin_footer();
2070 + MainWP_System_View::render_plugins_install_check();
2071 +
2072 + /**
2073 + * MainWP disabled menu items array.
2074 + *
2075 + * @global object
2076 + */
2077 + global $_mainwp_disable_menus_items;
2078 +
2079 + $_mainwp_disable_menus_items = apply_filters( 'mainwp_all_disablemenuitems', $_mainwp_disable_menus_items );
2080 + }
2081 +
2082 + /**
2083 + * Method activated_check()
2084 + *
2085 + * Activated check.
2086 + *
2087 + * @uses \MainWP\Dashboard\MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook()
2088 + */
2089 + public function activated_check() {
2090 + MainWP_Deprecated_Hooks::maybe_handle_deprecated_hook();
2091 + return $this->get_version();
2092 + }
2093 +
2094 + /**
2095 + * Method activation()
2096 + *
2097 + * Activate MainWP.
2098 + *
2099 + * @uses \MainWP\Dashboard\MainWP_Install::install()
2100 + * @uses \MainWP\Dashboard\MainWP_Utility::update_option()
2101 + */
2102 + public function activation() {
2103 + $this->update_install();
2104 + MainWP_Utility::update_option( 'mainwp_activated', 'yes' );
2105 + }
2106 +
2107 + /**
2108 + * Method deactivation()
2109 + *
2110 + * Deactivate MainWP.
2111 + */
2112 + public function deactivation() {
2113 + update_option( 'mainwp_extensions_all_activation_cached', '' );
2114 + $useWPCron = ( get_option( 'mainwp_wp_cron' ) === false ) || ( (int) get_option( 'mainwp_wp_cron' ) === 1 );
2115 + if ( $useWPCron ) {
2116 + $jobs = MainWP_System_Cron_Jobs::instance()->get_cron_jobs();
2117 + if ( $jobs ) {
2118 + foreach ( $jobs as $job => $recu ) {
2119 + wp_clear_scheduled_hook( $job );
2120 + }
2121 + }
2122 + }
2123 + }
2124 +
2125 + /**
2126 + * Method update_install()
2127 + *
2128 + * Update MainWP.
2129 + *
2130 + * @uses \MainWP\Dashboard\MainWP_Install::install()
2131 + */
2132 + public function update_install() {
2133 + MainWP_DB_Client::instance();
2134 + MainWP_DB_Site_Actions::instance();
2135 + MainWP_Install::instance()->install();
2136 + $this->check_to_updates();
2137 + }
2138 +
2139 +
2140 + /**
2141 + * Method check_to_updates()
2142 + *
2143 + * To check updates options.
2144 + */
2145 + public function check_to_updates() {
2146 + $update_ver = get_option( 'mainwp_update_check_version', false );
2147 + $current_ver = $this->check_ver_update;
2148 +
2149 + if ( false === $update_ver && version_compare( $current_ver, '0.0.1', '=' ) ) {
2150 + // to update new saving format.
2151 + MainWP_Api_Manager_Key::instance()->get_decrypt_master_api_key();
2152 + MainWP_Utility::update_option( 'mainwp_update_check_version', $current_ver );
2153 + }
2154 + }
2155 +
2156 + /**
2157 + * Method is_single_user()
2158 + *
2159 + * Check if single user environment.
2160 + *
2161 + * @return boolean true|false.
2162 + */
2163 + public function is_single_user() {
2164 + return true;
2165 + }
2166 +
2167 + /**
2168 + * Method is_multi_user()
2169 + *
2170 + * Check if multi user environment.
2171 + *
2172 + * @return boolean true|false.
2173 + */
2174 + public function is_multi_user() {
2175 + return ! $this->is_single_user();
2176 + }
2177 +
2178 + /**
2179 + * Method get_plugin_slug()
2180 + *
2181 + * Get MainWP Plugin Slug.
2182 + */
2183 + public function get_plugin_slug() {
2184 + return $this->plugin_slug;
2185 + }
2186 +
2187 + /**
2188 + * Method get_selected_sites_with_allowed_sites.
2189 + *
2190 + * @param array $selected_ids Selected sites IDs.
2191 + * @param array $current_sites Current sites IDs.
2192 + * @return array Not selected but in not allowed sites in current sites ids, and selected sites ids.
2193 + */
2194 + public static function get_selected_sites_with_allowed_sites( $selected_ids, $current_sites_ids = array() ) {
2195 +
2196 + $allowed_sites = apply_filters( 'mainwp_currentuserallowedaccesssites', 'all' );
2197 + if ( 'all' === $allowed_sites ) {
2198 + return $selected_ids;
2199 + }
2200 +
2201 + if ( ! is_array( $selected_ids ) ) {
2202 + $selected_ids = array();
2203 + }
2204 +
2205 + if ( ! is_array( $current_sites_ids ) ) {
2206 + $current_sites_ids = array();
2207 + }
2208 +
2209 + $allowed_sites = MainWP_DB::instance()->get_websites_for_current_user();
2210 + if ( empty( $allowed_sites ) ) {
2211 + return array();
2212 + }
2213 +
2214 + $allowed_ids = array_values(
2215 + array_map(
2216 + function ( $item ) {
2217 + return $item->id;
2218 + },
2219 + $allowed_sites
2220 + )
2221 + );
2222 +
2223 + $client_site_ids = array();
2224 + foreach ( $selected_ids as $id ) {
2225 + if ( in_array( $id, $allowed_ids ) ) {
2226 + $client_site_ids[] = $id;
2227 + }
2228 + }
2229 +
2230 + foreach ( $current_sites_ids as $id ) {
2231 + if ( ! in_array( $id, $selected_ids ) && ! in_array( $id, $allowed_ids ) ) { // If it’s not in the allowed site IDs, the user is not permitted to change it.
2232 + $client_site_ids[] = $id; // keep this site ids.
2233 + }
2234 + }
2235 + return $client_site_ids;
2236 + }
1348 2237 }