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.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 5.2.1 All 155 releases
mainwp / pages / page-mainwp-overview.php

page-mainwp-overview.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 6.2.2, at pages/page-mainwp-overview.php

462 lines 18.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Overview Page.
4 *
5 * @package MainWP/Dashboard
6 */
7
8 namespace MainWP\Dashboard;
9
10 // Exit if accessed directly.
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit;
13 }
14
15 /**
16 * Class MainWP_Overview
17 *
18 * @package MainWP\Dashboard
19 */
20 class MainWP_Overview { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
21
22 /**
23 * Get Class Name
24 *
25 * @return string __CLASS__
26 */
27 public static function get_class_name() {
28 return __CLASS__;
29 }
30
31 /**
32 * The single instance of the class
33 *
34 * @var mixed Default null
35 */
36 protected static $instance = null;
37
38 /**
39 * Screen dashdoard ID value.
40 *
41 * @var int $dashBoard default 0.
42 */
43 public $dashBoard = 0;
44
45 /**
46 * Enabled widgets
47 *
48 * @var array $enable_widgets
49 */
50 private static $enable_widgets = array(
51 'overview' => true,
52 'connection_status' => true,
53 'uptime_monitoring_status' => true,
54 'recent_posts' => true,
55 'recent_pages' => true,
56 'security_issues' => true,
57 'backup_tasks' => true,
58 'non_mainwp_changes' => true,
59 'clients' => true,
60 'get-started' => true,
61 );
62
63 /**
64 * Check if there is a session,
65 * if there isn't one create it.
66 *
67 * @return static::singlton Overview Page Session.
68 *
69 * @uses \MainWP\Dashboard\MainWP_Overview
70 */
71 public static function get() {
72 if ( null === static::$instance ) {
73 static::$instance = new MainWP_Overview();
74 }
75
76 return static::$instance;
77 }
78
79 /**
80 * MainWP_Overview constructor.
81 *
82 * Run each time the class is called.
83 */
84 public function __construct() {
85 add_filter( 'screen_layout_columns', array( &$this, 'on_screen_layout_columns' ), 10, 2 );
86 add_action( 'admin_menu', array( &$this, 'on_admin_menu' ) );
87 add_action( 'mainwp_help_sidebar_content', array( &$this, 'mainwp_help_content' ) );
88 }
89
90 /**
91 * Set the number of page coumns.
92 *
93 * @param mixed $columns Number of Columns.
94 * @param mixed $screen Screen size.
95 *
96 * @return int $columns Number of desired page columns.
97 */
98 public function on_screen_layout_columns( $columns, $screen ) {
99 if ( $screen === $this->dashBoard ) {
100 $columns[ $this->dashBoard ] = 3;
101 }
102
103 return $columns;
104 }
105
106 /**
107 * Add MainWP Overview top level menu.
108 *
109 * @uses \MainWP\Dashboard\MainWP_System_Utility::is_admin()
110 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
111 */
112 public function on_admin_menu() {
113 if ( MainWP_System_Utility::is_admin() ) {
114
115 /**
116 * Current user global.
117 *
118 * @global string
119 */
120 global $current_user;
121
122 // The icon in Base64 format.
123 $icon_base64 = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNi4zLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA1MCA1MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTAgNTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM5Q0EyQTc7fQ0KPC9zdHlsZT4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNSwwLjVDMTEuNDcsMC41LDAuNSwxMS40NywwLjUsMjVjMCwxMy41MywxMC45NywyNC41LDI0LjUsMjQuNVM0OS41LDM4LjUzLDQ5LjUsMjUNCglDNDkuNSwxMS40NywzOC41MywwLjUsMjUsMC41eiBNMjUsNDQuNmwtOC4zMy00LjlsNi4wOS0yNS4wN2MtMS41Ny0wLjgyLTIuNjYtMi40NC0yLjY2LTQuMzNjMC0yLjcxLDIuMTktNC45LDQuOS00LjkNCglzNC45LDIuMTksNC45LDQuOWMwLDEuODktMS4wOSwzLjUyLTIuNjYsNC4zM2w2LjA5LDI1LjA3TDI1LDQ0LjZ6Ii8+DQo8L3N2Zz4NCg==';
124
125 // The icon in the data URI scheme.
126 $icon_data_uri = 'data:image/svg+xml;base64,' . $icon_base64;
127
128 delete_user_option( $current_user->ID, 'screen_layout_toplevel_page_mainwp_tab' );
129
130 $this->dashBoard = add_menu_page(
131 'MainWP',
132 'MainWP',
133 'read',
134 'mainwp_tab',
135 array(
136 $this,
137 'on_show_page',
138 ),
139 $icon_data_uri,
140 '2.00001'
141 );
142
143 add_submenu_page(
144 'mainwp_tab',
145 'MainWP',
146 __( 'Operations', 'mainwp' ),
147 'read',
148 'mainwp_tab',
149 array(
150 $this,
151 'on_show_page',
152 )
153 );
154
155 $val = get_user_option( 'screen_layout_' . $this->dashBoard );
156 if ( ! MainWP_Utility::ctype_digit( $val ) ) {
157 update_user_option( $current_user->ID, 'screen_layout_' . $this->dashBoard, 2, true );
158 }
159 add_action( 'load-' . $this->dashBoard, array( &$this, 'on_load_page' ) );
160 static::init_left_menu();
161
162 }
163 }
164
165 /**
166 * Instantiate the MainWP Overview Menu item.
167 *
168 * @uses \MainWP\Dashboard\MainWP_Menu::add_left_menu()
169 */
170 public static function init_left_menu() {
171 MainWP_Menu::add_left_menu(
172 array(
173 'title' => esc_html__( 'Operations', 'mainwp' ),
174 'parent_key' => 'mainwp_tab',
175 'slug' => 'mainwp_tab',
176 'href' => 'admin.php?page=mainwp_tab',
177 'icon' => '<i class="th large icon"></i>',
178 ),
179 0
180 );
181 }
182
183 /**
184 * Method on_load_page()
185 *
186 * Run on page load.
187 */
188 public function on_load_page() {
189 wp_enqueue_script( 'common' );
190 wp_enqueue_script( 'wp-lists' );
191 wp_enqueue_script( 'postbox' );
192 wp_enqueue_script( 'dashboard' );
193 wp_enqueue_script( 'widgets' );
194
195 static::add_meta_boxes( $this->dashBoard );
196 }
197
198 /**
199 * Method add_meta_boxes()
200 *
201 * Add MainWP Overview Page Widgets.
202 *
203 * @param array $page Current page.
204 *
205 * @uses \MainWP\Dashboard\MainWP_System_Handler::apply_filters()
206 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
207 * @uses \MainWP\Dashboard\MainWP_UI::add_widget_box()
208 * @uses \MainWP\Dashboard\MainWP_Connection_Status::get_class_name()
209 * @uses \MainWP\Dashboard\MainWP_Recent_Pages::get_class_name()
210 * @uses \MainWP\Dashboard\MainWP_Recent_Posts::get_class_name()
211 * @uses \MainWP\Dashboard\MainWP_Security_Issues_Widget::get_class_name()
212 * @uses \MainWP\Dashboard\MainWP_Updates_Overview::get_class_name()
213 */
214 public static function add_meta_boxes( $page ) { // phpcs:ignore -- NOSONAR - complex method. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
215
216 /**
217 * Get getmetaboxes
218 *
219 * Adds metaboxes (widgets) to the Operations page.
220 *
221 * @since Unknown
222 */
223 $extMetaBoxs = MainWP_System_Handler::instance()->apply_filters( 'mainwp-getmetaboxes', array() );
224 $extMetaBoxs = MainWP_System_Handler::instance()->apply_filters( 'mainwp_getmetaboxes', $extMetaBoxs ); // hooks to load widgets for general overview dashboard page.
225
226 foreach ( $extMetaBoxs as $box ) {
227 if ( isset( $box['plugin'] ) ) {
228 $name = basename( $box['plugin'], '.php' );
229 static::$enable_widgets[ $name ] = true;
230 }
231 }
232
233 $values = static::$enable_widgets;
234
235 /**
236 * Unset unwanted Widgets
237 *
238 * Contains the list of enabled widgets and allows user to unset unwanted widgets.
239 *
240 * @param array $values Array containing enabled widgets.
241 * @param int $dashboard_siteid Child site (Overview) ID.
242 *
243 * @since 4.0
244 */
245 $values = apply_filters( 'mainwp_overview_enabled_widgets', $values, null );
246 static::$enable_widgets = array_merge( static::$enable_widgets, $values );
247
248 // Load the Updates Overview widget.
249 if ( static::$enable_widgets['overview'] ) {
250 MainWP_UI::add_widget_box( 'overview', array( MainWP_Updates_Overview::get_class_name(), 'render' ), $page, array( 0, 0, 12, 20 ) );
251 }
252
253 // Load the Clients widget.
254 if ( static::$enable_widgets['clients'] && \mainwp_current_user_can( 'dashboard', 'manage_clients' ) ) {
255 MainWP_UI::add_widget_box( 'clients', array( MainWP_Clients::get_class_name(), 'render' ), $page, array( -1, -1, 4, 30 ) );
256 }
257
258 // Load the Non-MainWP Changes widget.
259 if ( static::$enable_widgets['non_mainwp_changes'] ) {
260 MainWP_UI::add_widget_box( 'non_mainwp_changes', array( MainWP_Site_Actions::get_class_name(), 'render' ), $page, array( -1, -1, 4, 30 ) );
261 }
262
263 // Load the Connection Status widget.
264 if ( ! MainWP_System_Utility::get_current_wpid() && static::$enable_widgets['connection_status'] ) {
265 MainWP_UI::add_widget_box( 'connection_status', array( MainWP_Connection_Status::get_class_name(), 'render' ), $page, array( -1, -1, 4, 30 ) );
266 }
267
268 // Load the Connection Status widget.
269 if ( MainWP_Uptime_Monitoring_Edit::is_enable_global_monitoring() && ! MainWP_System_Utility::get_current_wpid() && static::$enable_widgets['uptime_monitoring_status'] ) {
270 MainWP_UI::add_widget_box( 'uptime_monitoring_status', array( MainWP_Uptime_Monitoring_Status::get_class_name(), 'render_status' ), $page, array( -1, -1, 4, 30 ) );
271 }
272
273 // Load the Security Issues widget.
274 if ( \mainwp_current_user_can( 'dashboard', 'manage_security_issues' ) && static::$enable_widgets['security_issues'] ) {
275 MainWP_UI::add_widget_box( 'security_issues', array( MainWP_Security_Issues_Widget::get_class_name(), 'render_widget' ), $page, array( -1, -1, 4, 30 ) );
276 }
277
278 // Load the Recent Pages widget.
279 if ( \mainwp_current_user_can( 'dashboard', 'manage_pages' ) && static::$enable_widgets['recent_pages'] ) {
280 MainWP_UI::add_widget_box( 'recent_pages', array( MainWP_Recent_Pages::get_class_name(), 'render' ), $page, array( -1, -1, 4, 30 ) );
281 }
282
283 // Load the Recent Posts widget.
284 if ( \mainwp_current_user_can( 'dashboard', 'manage_posts' ) && static::$enable_widgets['recent_posts'] ) {
285 MainWP_UI::add_widget_box( 'recent_posts', array( MainWP_Recent_Posts::get_class_name(), 'render' ), $page, array( -1, -1, 4, 30 ) );
286 }
287
288 $i = 1;
289 foreach ( $extMetaBoxs as $metaBox ) {
290 $enabled = true;
291 if ( isset( $metaBox['plugin'] ) ) {
292 $name = basename( $metaBox['plugin'], '.php' );
293 if ( isset( static::$enable_widgets[ $name ] ) && ! static::$enable_widgets[ $name ] ) {
294 $enabled = false;
295 }
296 }
297
298 $id = isset( $metaBox['id'] ) ? $metaBox['id'] : $i++;
299 $id = 'advanced-' . $id;
300
301 $wg_layout = isset( $metaBox['layout'] ) && is_array( $metaBox['layout'] ) ? $metaBox['layout'] : array( -1, -1, 6, 30 );
302
303 if ( $enabled ) {
304 MainWP_UI::add_widget_box( $id, $metaBox['callback'], $page, $wg_layout );
305 }
306 }
307 }
308
309 /**
310 * Method on_show_page()
311 *
312 * When the page loads render the body content.
313 *
314 * @uses \MainWP\Dashboard\MainWP_UI::render_top_header()
315 * @uses \MainWP\Dashboard\MainWP_UI::render_second_top_header()
316 */
317 public function on_show_page() {
318 if ( ! \mainwp_current_user_can( 'dashboard', 'access_global_dashboard' ) ) {
319 \mainwp_do_not_have_permissions( esc_html__( 'global dashboard', 'mainwp' ) );
320 return;
321 }
322
323 /**
324 * Screen layout columns array.
325 *
326 * @global object
327 */
328 global $screen_layout_columns;
329
330 $params = array(
331 'title' => esc_html__( 'Operations', 'mainwp' ),
332 );
333
334 MainWP_UI::render_top_header( $params );
335
336 MainWP_UI::render_second_top_header();
337
338 static::render_dashboard_body();
339 ?>
340 </div>
341 <?php
342 }
343
344
345 /**
346 * Method render_dashboard_body()
347 *
348 * Render the Dashboard Body content.
349 *
350 * @param object $websites Object containing child sites info.
351 *
352 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
353 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_page_id()
354 * @uses \MainWP\Dashboard\MainWP_UI::do_widget_boxes()
355 * @uses \MainWP\Dashboard\MainWP_Utility::show_mainwp_message()
356 */
357 public static function render_dashboard_body( $websites = array() ) {
358 $current_wp_id = MainWP_System_Utility::get_current_wpid();
359 $website = null;
360 if ( ! empty( $current_wp_id ) ) {
361 $website = $websites[0];
362 }
363 $screen = get_current_screen();
364 ?>
365 <div class="mainwp-primary-content-wrap">
366 <div class="ui segment">
367 <?php if ( ! empty( $current_wp_id ) && ! empty( $website->sync_errors ) ) : ?>
368 <div class="ui red message" style="margin: 1em;">
369 <?php echo '<strong>' . esc_html( stripslashes( $website->name ) ) . '</strong>' . esc_html__( ' is Disconnected. Click the Reconnect button to establish the connection again.', 'mainwp' ); ?>
370 </div>
371 <?php endif; ?>
372 <div id="mainwp-message-zone" class="ui message" style="display:none;"></div>
373 <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'widgets' ) ) : ?>
374 <div class="ui message" style="margin: 1em;">
375 <i class="close icon mainwp-notice-dismiss" notice-id="widgets"></i>
376 <?php /* translators: 1: bulb emoji, 2: cog icon, 3: layout icon */ printf( esc_html__( '%1$s Tip: You can drag and drop widgets to reorder your dashboard, use Page Settings (%2$s) to show or hide widgets, and use Layout (%3$s) in the header to save and load your widget layouts.', 'mainwp' ), '<em data-emoji=":bulb:" class="small"></em>', '<i class="cog fitted icon"></i>', '<i class="all border fitted icon"></i>' ); ?>
377 </div>
378 <?php endif; ?>
379 <?php do_action( 'mainwp_module_log_render_db_update_notice' ); ?>
380 <?php do_action( 'mainwp_module_log_render_db_size_notice', 300, 'overview' ); ?>
381
382 <?php
383 /**
384 * Action: mainwp_before_overview_widgets
385 *
386 * Fires at the top of the Operations page (before first widget).
387 *
388 * @since 4.1
389 */
390 do_action( 'mainwp_before_overview_widgets', 'dashboard', $current_wp_id, $website );
391 ?>
392 <div id="mainwp-grid-wrapper" class="gridster">
393 <div id="mainwp-widgets-placeholder" class="ui page dimmer">
394 <div class="ui double text loader"><?php esc_html_e( 'Loading...', 'mainwp' ); ?></div>
395 </div>
396 <script>
397 jQuery( document ).ready( function () {
398 jQuery('#mainwp-widgets-placeholder').dimmer('show');
399 });
400 </script>
401 <?php MainWP_UI::do_widget_boxes( $screen->id ); ?>
402 </div>
403 <?php
404 /**
405 * Action: 'mainwp_after_overview_widgets'
406 *
407 * Fires at the bottom of the Operations page (after the last widget).
408 *
409 * @since 4.1
410 */
411 do_action( 'mainwp_after_overview_widgets', 'dashboard' );
412 ?>
413 </div>
414 <script type="text/javascript">
415 jQuery( document ).ready( function( $ ) {
416 jQuery( '.mainwp-widget .mainwp-dropdown-tab .item' ).tab();
417 mainwp_get_icon_start();
418 } );
419 </script>
420 <?php
421 MainWP_Ui_Manage_Widgets_Layout::render_modal_save_layout();
422 MainWP_UI::render_modal_upload_icon();
423 MainWP_Updates::render_plugin_details_modal();
424 MainWP_Updates::render_changes_history_modal();
425 }
426
427 /**
428 * Method mainwp_help_content()
429 *
430 * Creates the MainWP Help Documentation List for the help component in the sidebar.
431 */
432 public static function mainwp_help_content() {
433 if ( isset( $_GET['page'] ) && 'mainwp_tab' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
434 ?>
435 <p><?php esc_html_e( 'If you need help with your MainWP Dashboard, please review following help documents', 'mainwp' ); ?></p>
436 <div class="ui list">
437 <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/getting-started/mainwp-user-interface" target="_blank">Understanding MainWP Dashboard UI</a></div>
438 <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/getting-started/mainwp-user-interface#navigation" target="_blank">MainWP Navigation</a></div>
439 <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/getting-started/mainwp-user-interface#page-settings" target="_blank">Page Settings</a></div>
440 <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/getting-started/mainwp-user-interface#widgetized-pages" target="_blank">Widgetized Page Layout</a></div>
441 <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/getting-started/mainwp-user-interface#tables" target="_blank">MainWP Tables</a></div>
442 <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/getting-started/mainwp-user-interface#individual-site-mode" target="_blank">Individual Child Site Mode</a></div>
443 <?php
444 /**
445 * Action: mainwp_overview_help_item
446 *
447 * Fires at the bottom of the help articles list in the Help sidebar on the Operations page.
448 *
449 * Suggested HTML markup:
450 *
451 * <div class="item"><a href="Your custom URL">Your custom text</a></div>
452 *
453 * @since 4.1
454 */
455 do_action( 'mainwp_overview_help_item' );
456 ?>
457 </div>
458 <?php
459 }
460 }
461 }
462