PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.2.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.2.1
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
← All changes | pages/page-mainwp-plugins.php +672 -470 5.2 → 6.2.1 View file →
@@ -6,8 +6,13 @@
6 6 */
7 7
8 8 namespace MainWP\Dashboard;
9 9
10 +// Exit if accessed directly.
11 +if ( ! defined( 'ABSPATH' ) ) {
12 + exit;
13 +}
14 +
10 15 /**
11 16 * Class MainWP_Plugins
12 17 *
13 18 * @package MainWP\Dashboard\
@@ -86,9 +91,9 @@
86 91 static::get_class_name(),
87 92 'render',
88 93 )
89 94 );
90 - if ( mainwp_current_user_have_right( 'dashboard', 'install_plugins' ) ) {
95 + if ( \mainwp_current_user_can( 'dashboard', 'install_plugins' ) ) {
91 96 $page = add_submenu_page(
92 97 'mainwp_tab',
93 98 __( 'Plugins', 'mainwp' ),
94 99 '<div class="mainwp-hidden">' . esc_html__( 'Install ', 'mainwp' ) . '</div>',
@@ -126,8 +131,19 @@
126 131 );
127 132 add_submenu_page(
128 133 'mainwp_tab',
129 134 __( 'Plugins', 'mainwp' ),
135 + '<div class="mainwp-hidden">' . esc_html__( 'Abandoned Plugins', 'mainwp' ) . '</div>',
136 + 'read',
137 + 'PluginsAbandoned',
138 + array(
139 + static::get_class_name(),
140 + 'render_abandoned_plugins',
141 + )
142 + );
143 + add_submenu_page(
144 + 'mainwp_tab',
145 + __( 'Plugins', 'mainwp' ),
130 146 '<div class="mainwp-hidden">' . esc_html__( 'Ignored Abandoned', 'mainwp' ) . '</div>',
131 147 'read',
132 148 'PluginsIgnoredAbandoned',
133 149 array(
@@ -187,9 +203,9 @@
187 203 <div class="wp-submenu sub-open" >
188 204 <div class="mainwp_boxout">
189 205 <div class="mainwp_boxoutin"></div>
190 206 <a href="<?php echo esc_url( admin_url( 'admin.php?page=PluginsManage' ) ); ?>" class="mainwp-submenu"><?php esc_html_e( 'Manage Plugins', 'mainwp' ); ?></a>
191 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'install_plugins' ) ) : ?>
207 + <?php if ( \mainwp_current_user_can( 'dashboard', 'install_plugins' ) ) : ?>
192 208 <?php if ( ! MainWP_Menu::is_disable_menu_item( 3, 'PluginsInstall' ) ) : ?>
193 209 <a href="<?php echo esc_url( admin_url( 'admin.php?page=PluginsInstall' ) ); ?>" class="mainwp-submenu"><?php esc_html_e( 'Install Plugins', 'mainwp' ); ?></a>
194 210 <?php endif; ?>
195 211 <?php endif; ?>
@@ -278,10 +294,10 @@
278 294 ),
279 295 array(
280 296 'title' => esc_html__( 'Abandoned Plugins', 'mainwp' ),
281 297 'parent_key' => 'PluginsManage',
282 - 'href' => 'admin.php?page=UpdatesManage&tab=abandoned-plugins',
283 - 'slug' => 'PluginsManage&tab=abandoned-plugins',
298 + 'href' => 'admin.php?page=PluginsAbandoned',
299 + 'slug' => 'PluginsAbandoned',
284 300 'right' => '',
285 301 'leftsub_order_level2' => 4.1,
286 302 ),
287 303 array(
@@ -328,9 +344,9 @@
328 344 'href' => 'admin.php?page=PluginsManage',
329 345 'active' => ( 'Manage' === $shownPage ) ? true : false,
330 346 );
331 347
332 - if ( mainwp_current_user_have_right( 'dashboard', 'install_plugins' ) && ! MainWP_Menu::is_disable_menu_item( 3, 'PluginsInstall' ) ) {
348 + if ( \mainwp_current_user_can( 'dashboard', 'install_plugins' ) && ! MainWP_Menu::is_disable_menu_item( 3, 'PluginsInstall' ) ) {
333 349 $renderItems[] = array(
334 350 'title' => esc_html__( 'Install', 'mainwp' ),
335 351 'href' => 'admin.php?page=PluginsInstall',
336 352 'active' => ( 'Install' === $shownPage ) ? true : false,
@@ -422,9 +438,9 @@
422 438 <div class="mainwp-main-content">
423 439 <div class="ui mini form mainwp-actions-bar">
424 440 <div class="ui stackable grid">
425 441 <div class="ui two column row">
426 - <div class="column" >
442 + <div class="middle aligned column">
427 443 <span id="mainwp-plugins-bulk-actions-wapper" style="margin-right:1rem">
428 444 <?php
429 445 if ( is_array( $cachedResult ) && isset( $cachedResult['bulk_actions'] ) ) {
430 446 echo $cachedResult['bulk_actions']; // phpcs:ignore WordPress.Security.EscapeOutput
@@ -442,9 +458,9 @@
442 458 */
443 459 do_action( 'mainwp_plugins_actions_bar_left' );
444 460 ?>
445 461 </div>
446 - <div class="right aligned column">
462 + <div class="right aligned middle aligned column">
447 463 <?php static::render_select_manage_view(); ?>
448 464
449 465 <?php
450 466 /**
@@ -459,21 +475,27 @@
459 475 </div>
460 476 </div>
461 477 </div>
462 478 </div>
463 - <div class="ui segment" id="mainwp-plugins-table-wrapper">
479 + <div class="ui padded segment" id="mainwp-plugins-table-wrapper">
464 480 <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-manage-plugins-info-message' ) ) : ?>
465 481 <div class="ui info message">
466 482 <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-manage-plugins-info-message"></i>
483 + <div class="header"><?php esc_html_e( 'How to Manage Plugins', 'mainwp' ); ?></div>
467 484 <div><?php echo esc_html__( 'Manage installed plugins on your child sites. Here you can activate, deactivate, and delete installed plugins.', 'mainwp' ); ?></div>
468 - <p><?php echo esc_html__( 'To Activate or Delete a specific plugin, you must search only for Inactive plugin on your child sites. If you search for Active or both Active and Inactive, the Activate and Delete actions will be disabled.', 'mainwp' ); ?></p>
469 - <p><?php echo esc_html__( 'To Deactivate a specific plugin, you must search only for Active plugins on your child sites. If you search for Inactive or both Active and Inactive, the Deactivate action will be disabled.', 'mainwp' ); ?></p>
470 - <p><?php printf( esc_html__( 'For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/" target="_blank">', '</a> <i class="external alternate icon"></i>' ); ?></p>
485 + <div class="ui bulleted list">
486 + <div class="item"><?php echo esc_html__( 'To Activate or Delete a specific plugin, you must search only for Inactive plugin on your child sites. If you search for Active or both Active and Inactive, the Activate and Delete actions will be disabled.', 'mainwp' ); ?></div>
487 + <div class="item"><?php echo esc_html__( 'To Deactivate a specific plugin, you must search only for Active plugins on your child sites. If you search for Inactive or both Active and Inactive, the Deactivate action will be disabled.', 'mainwp' ); ?></div>
488 + </div>
489 + <div><?php
490 + // translators: 1: Opening anchor tag. 2: Closing anchor tag.
491 + printf( esc_html__( 'For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp" target="_blank">', '</a> <i class="external alternate icon"></i>' );
492 + ?></div>
471 493 </div>
472 494 <?php endif; ?>
473 495 <div id="mainwp-message-zone" class="ui message" style="display:none"></div>
474 - <div id="mainwp-loading-plugins-row" class="ui active inverted dimmer" style="display:none">
475 - <div class="ui large text loader"><?php esc_html_e( 'Loading Plugins...', 'mainwp' ); ?></div>
496 + <div id="mainwp-loading-plugins-row" class="ui active page dimmer" style="display:none">
497 + <div class="ui text double loader"><?php esc_html_e( 'Loading...', 'mainwp' ); ?></div>
476 498 </div>
477 499 <div id="mainwp-plugins-main-content" <?php echo ( null !== $cachedSearch ) ? 'style="display: block;"' : ''; ?> >
478 500 <div id="mainwp-plugins-content">
479 501 <?php if ( is_array( $cachedResult ) && isset( $cachedResult['result'] ) ) : ?>
@@ -478,12 +500,9 @@
478 500 <div id="mainwp-plugins-content">
479 501 <?php if ( is_array( $cachedResult ) && isset( $cachedResult['result'] ) ) : ?>
480 502 <?php echo $cachedResult['result']; // phpcs:ignore WordPress.Security.EscapeOutput ?>
481 503 <?php else : ?>
482 - <div class="ui hidden divider"></div>
483 - <div class="ui hidden divider"></div>
484 - <div class="ui hidden divider"></div>
485 - <?php MainWP_UI::render_empty_element_placeholder( __( 'Use the search options to find the plugin you want to manage', 'mainwp' ) ); ?>
504 + <?php MainWP_UI::render_empty_page_placeholder( __( 'No plugins loaded yet.', 'mainwp' ), __( 'Select one or more Child Sites and click the Show Plugins button to view installed plugins.', 'mainwp' ), '<em data-emoji=":compass:" class="big"></em>' ); ?>
486 505 <?php endif; ?>
487 506 </div>
488 507 </div>
489 508 </div>
@@ -549,12 +568,9 @@
549 568 * @since 4.1
550 569 */
551 570 do_action( 'mainwp_manage_plugins_before_search_options' );
552 571 ?>
553 - <div class="ui info message">
554 - <i class="close icon mainwp-notice-dismiss" notice-id="plugins-manage-info"></i>
555 - <?php esc_html_e( 'A plugin needs to be Inactive for it to be Activated or Deleted.', 'mainwp' ); ?>
556 - </div>
572 +
557 573 <div class="ui mini form">
558 574 <div class="field">
559 575 <select class="ui fluid dropdown" id="mainwp_plugins_search_by_status">
560 576 <option value=""><?php esc_html_e( 'Select status', 'mainwp' ); ?></option>
@@ -615,8 +631,15 @@
615 631 ?>
616 632 </div>
617 633 <div style="clear:both"></div>
618 634 </div>
635 + <script type="text/javascript">
636 + jQuery( document ).ready( function ($) {
637 + if($('#mainwp-plugins-content .mainwp-manage-plugins-reload-data').length){
638 + mainwp_fetch_plugins();
639 + }
640 + } );
641 + </script>
619 642 <?php
620 643 static::render_footer( 'Manage' );
621 644 }
622 645
@@ -644,9 +667,9 @@
644 667 </div>
645 668 </div>
646 669 <div class="ui hidden fitted divider"></div>
647 670 <div class="field">
648 - <div class="ui toggle checkbox" data-tooltip="<?php esc_attr_e( 'Display sites not meeting the above search criteria.', 'mainwp' ); ?>" data-position="left center" data-inverted="">
671 + <div class="ui toggle checkbox" data-tooltip="<?php esc_attr_e( 'Display sites not meeting the above search criteria.', 'mainwp' ); ?>" data-position="center left" data-inverted="">
649 672 <input type="checkbox" <?php echo $disabledNegative ? 'disabled' : ''; ?> <?php echo $checkedNegative ? 'checked="true"' : ''; ?> value="1" id="display_sites_not_meeting_criteria" />
650 673 <label for="display_sites_not_meeting_criteria"><?php esc_html_e( 'Exclude plugin', 'mainwp' ); ?></label>
651 674 </div>
652 675 </div>
@@ -690,8 +713,9 @@
690 713 * @param mixed $groups Selected Child Site Groups.
691 714 * @param mixed $sites Selected individual Child Sites.
692 715 * @param mixed $not_criteria Show not criteria result.
693 716 * @param mixed $clients Selected Clients.
717 + * @param bool $not_fetchdata True|False fetch data or not.
694 718 *
695 719 * @return string Plugin Table.
696 720 *
697 721 * @uses MainWP_Cache::init_cache()
@@ -715,9 +739,9 @@
715 739 * @uses \MainWP\Dashboard\MainWP_Plugins_Handler::get_class_name()
716 740 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
717 741 * @uses \MainWP\Dashboard\MainWP_Utility::map_site()
718 742 */
719 - public static function render_table( $keyword, $status, $groups, $sites, $not_criteria, $clients ) { // phpcs:ignore -- NOSONAR -Current complexity required to achieve desired results. Pull request solutions appreciated.
743 + public static function render_table( $keyword, $status, $groups, $sites, $not_criteria, $clients, $not_fetchdata = false ) { // phpcs:ignore -- NOSONAR -Current complexity required to achieve desired results. Pull request solutions appreciated.
720 744 $keyword = trim( $keyword );
721 745 MainWP_Cache::init_cache( 'Plugins' );
722 746
723 747 $output = new \stdClass();
@@ -730,64 +754,129 @@
730 754
731 755 $data_fields = MainWP_System_Utility::get_default_map_site_fields();
732 756 $data_fields[] = 'plugins';
733 757 $data_fields[] = 'rollback_updates_data';
758 + $data_fields[] = 'site_info';
734 759
735 - if ( 1 === (int) get_option( 'mainwp_optimize', 1 ) || MainWP_Demo_Handle::is_demo_mode() ) {
760 + if ( ! $not_fetchdata ) {
736 761
737 - $multi_kws = explode( ',', $keyword );
738 - $multi_kws = array_filter( array_map( 'trim', $multi_kws ) );
762 + if ( 1 === (int) get_option( 'mainwp_optimize', 1 ) || MainWP_Demo_Handle::is_demo_mode() ) {
739 763
740 - if ( ! empty( $sites ) ) {
741 - foreach ( $sites as $v ) {
742 - if ( MainWP_Utility::ctype_digit( $v ) ) {
743 - $website = MainWP_DB::instance()->get_website_by_id( $v, false, array( 'rollback_updates_data' ) );
744 - $allPlugins = json_decode( $website->plugins, true );
745 - $_count = count( $allPlugins );
746 - $_count_installed = 0;
747 - for ( $i = 0; $i < $_count; $i++ ) {
748 - $plugin = $allPlugins[ $i ];
749 - $is_active = 'active' === $status ? 1 : 0;
750 - if ( ( 'active' === $status || 'inactive' === $status ) && $is_active !== (int) $plugin['active'] ) {
751 - continue;
752 - }
764 + $multi_kws = explode( ',', $keyword );
765 + $multi_kws = array_filter( array_map( 'trim', $multi_kws ) );
753 766
754 - if ( ! empty( $keyword ) ) {
755 - if ( $not_criteria ) {
756 - if ( MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
767 + if ( ! empty( $sites ) ) {
768 + foreach ( $sites as $v ) {
769 + if ( MainWP_Utility::ctype_digit( $v ) ) {
770 + $website = MainWP_DB::instance()->get_website_by_id( $v, false, array( 'rollback_updates_data', 'site_info' ) );
771 + $allPlugins = json_decode( $website->plugins, true );
772 + $_count = count( $allPlugins );
773 + $_count_installed = 0;
774 + for ( $i = 0; $i < $_count; $i++ ) {
775 + $plugin = $allPlugins[ $i ];
776 + $is_active = 'active' === $status ? 1 : 0;
777 + if ( ( 'active' === $status || 'inactive' === $status ) && $is_active !== (int) $plugin['active'] ) {
778 + continue;
779 + }
780 +
781 + if ( ! empty( $keyword ) ) {
782 + if ( $not_criteria ) {
783 + if ( MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
784 + continue;
785 + }
786 + } elseif ( ! MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
757 787 continue;
758 788 }
759 - } elseif ( ! MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
760 - continue;
761 789 }
790 +
791 + $plugin['websiteid'] = $website->id;
792 + $plugin['websiteurl'] = $website->url;
793 + $plugin['websitename'] = $website->name;
794 + $plugin['site_info'] = $website->site_info;
795 +
796 + $output->plugins[] = $plugin;
797 + ++$_count_installed;
762 798 }
763 799
764 - $plugin['websiteid'] = $website->id;
765 - $plugin['websiteurl'] = $website->url;
766 - $plugin['websitename'] = $website->name;
767 - $output->plugins[] = $plugin;
768 - ++$_count_installed;
800 + if ( 0 === $_count_installed && 'not_installed' === $status ) {
801 + for ( $i = 0; $i < $_count; $i++ ) {
802 + $plugin = $allPlugins[ $i ];
803 + $plugin['websiteid'] = $website->id;
804 + $plugin['websiteurl'] = $website->url;
805 + $plugin['websitename'] = $website->name;
806 + $plugin['site_info'] = $website->site_info;
807 + $output->plugins_installed[] = $plugin;
808 + }
809 + }
810 + $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data );
769 811 }
812 + }
813 + }
770 814
771 - if ( 0 === $_count_installed && 'not_installed' === $status ) {
772 - for ( $i = 0; $i < $_count; $i++ ) {
773 - $plugin = $allPlugins[ $i ];
774 - $plugin['websiteid'] = $website->id;
775 - $plugin['websiteurl'] = $website->url;
776 - $plugin['websitename'] = $website->name;
777 - $output->plugins_installed[] = $plugin;
815 + if ( '' !== $groups ) {
816 + foreach ( $groups as $v ) {
817 + if ( MainWP_Utility::ctype_digit( $v ) ) {
818 + $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_by_group_id( $v, false, 'wp.url', false, false, null, null, array( 'extra_view' => array( 'site_info', 'rollback_updates_data' ) ) ) );
819 + while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
820 + if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
821 + continue;
822 + }
823 + $allPlugins = json_decode( $website->plugins, true );
824 + $_count = count( $allPlugins );
825 + $_count_installed = 0;
826 + for ( $i = 0; $i < $_count; $i++ ) {
827 + $plugin = $allPlugins[ $i ];
828 + $is_active = 'active' === $status ? 1 : 0;
829 + if ( ( 'active' === $status || 'inactive' === $status ) && $is_active !== (int) $plugin['active'] ) {
830 + continue;
831 + }
832 +
833 + if ( ! empty( $keyword ) ) {
834 + if ( $not_criteria ) {
835 + if ( MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
836 + continue;
837 + }
838 + } elseif ( ! MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
839 + continue;
840 + }
841 + }
842 +
843 + $plugin['websiteid'] = $website->id;
844 + $plugin['websiteurl'] = $website->url;
845 + $plugin['websitename'] = $website->name;
846 + $plugin['site_info'] = $website->site_info;
847 +
848 + $output->plugins[] = $plugin;
849 + ++$_count_installed;
850 + }
851 +
852 + if ( 0 === $_count_installed && 'not_installed' === $status ) {
853 + for ( $i = 0; $i < $_count; $i++ ) {
854 + $plugin = $allPlugins[ $i ];
855 + $plugin['websiteid'] = $website->id;
856 + $plugin['websiteurl'] = $website->url;
857 + $plugin['websitename'] = $website->name;
858 + $plugin['site_info'] = $website->site_info;
859 + $output->plugins_installed[] = $plugin;
860 + }
861 + }
862 + $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data );
778 863 }
864 + MainWP_DB::free_result( $websites );
779 865 }
780 - $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data );
781 866 }
782 867 }
783 - }
784 868
785 - if ( '' !== $groups ) {
786 - foreach ( $groups as $v ) {
787 - if ( MainWP_Utility::ctype_digit( $v ) ) {
788 - $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_by_group_id( $v, false, 'wp.url', false, false, null, null, array( 'extra_view' => array( 'site_info', 'rollback_updates_data' ) ) ) );
789 - while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
869 + if ( '' !== $clients && is_array( $clients ) ) {
870 + $websites = MainWP_DB_Client::instance()->get_websites_by_client_ids(
871 + $clients,
872 + array(
873 + 'select_data' => $data_fields,
874 + 'extra_view' => array( 'rollback_updates_data', 'site_info' ),
875 + )
876 + );
877 + if ( $websites ) {
878 + foreach ( $websites as $website ) {
790 879 if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
791 880 continue;
792 881 }
793 882 $allPlugins = json_decode( $website->plugins, true );
@@ -793,11 +882,13 @@
793 882 $allPlugins = json_decode( $website->plugins, true );
794 883 $_count = count( $allPlugins );
795 884 $_count_installed = 0;
796 885 for ( $i = 0; $i < $_count; $i++ ) {
797 - $plugin = $allPlugins[ $i ];
798 - $is_active = 'active' === $status ? 1 : 0;
799 - if ( ( 'active' === $status || 'inactive' === $status ) && $is_active !== (int) $plugin['active'] ) {
886 + $plugin = $allPlugins[ $i ];
887 +
888 + $is_active = ( 'active' === $status ) ? 1 : 0;
889 +
890 + if ( ( ( 'active' === $status ) || ( 'inactive' === $status ) ) && ( $is_active !== (int) $plugin['active'] ) ) {
800 891 continue;
801 892 }
802 893
803 894 if ( ! empty( $keyword ) ) {
@@ -812,12 +903,12 @@
812 903
813 904 $plugin['websiteid'] = $website->id;
814 905 $plugin['websiteurl'] = $website->url;
815 906 $plugin['websitename'] = $website->name;
907 + $plugin['site_info'] = $website->site_info;
816 908 $output->plugins[] = $plugin;
817 909 ++$_count_installed;
818 910 }
819 -
820 911 if ( 0 === $_count_installed && 'not_installed' === $status ) {
821 912 for ( $i = 0; $i < $_count; $i++ ) {
822 913 $plugin = $allPlugins[ $i ];
823 914 $plugin['websiteid'] = $website->id;
@@ -822,97 +913,64 @@
822 913 $plugin = $allPlugins[ $i ];
823 914 $plugin['websiteid'] = $website->id;
824 915 $plugin['websiteurl'] = $website->url;
825 916 $plugin['websitename'] = $website->name;
917 + $plugin['site_info'] = $website->site_info;
826 918 $output->plugins_installed[] = $plugin;
827 919 }
828 920 }
829 921 $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data );
830 922 }
831 - MainWP_DB::free_result( $websites );
832 923 }
833 924 }
834 - }
925 + } else {
926 + $dbwebsites = array();
835 927
836 - if ( '' !== $clients && is_array( $clients ) ) {
837 - $websites = MainWP_DB_Client::instance()->get_websites_by_client_ids(
838 - $clients,
839 - array(
840 - 'select_data' => $data_fields,
841 - 'extra_view' => array( 'rollback_updates_data' ),
842 - )
843 - );
844 - if ( $websites ) {
845 - foreach ( $websites as $website ) {
846 - if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
847 - continue;
848 - }
849 - $allPlugins = json_decode( $website->plugins, true );
850 - $_count = count( $allPlugins );
851 - $_count_installed = 0;
852 - for ( $i = 0; $i < $_count; $i++ ) {
853 - $plugin = $allPlugins[ $i ];
928 + if ( '' !== $sites ) {
929 + foreach ( $sites as $v ) {
930 + if ( MainWP_Utility::ctype_digit( $v ) ) {
931 + $website = MainWP_DB::instance()->get_website_by_id( $v, false, array( 'rollback_updates_data', 'site_info' ) );
854 932
855 - $is_active = ( 'active' === $status ) ? 1 : 0;
856 -
857 - if ( ( ( 'active' === $status ) || ( 'inactive' === $status ) ) && ( $is_active !== (int) $plugin['active'] ) ) {
933 + if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
858 934 continue;
859 935 }
860 936
861 - if ( ! empty( $keyword ) ) {
862 - if ( $not_criteria ) {
863 - if ( MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
864 - continue;
865 - }
866 - } elseif ( ! MainWP_Utility::multi_find_keywords( $plugin['name'], $multi_kws ) ) {
867 - continue;
868 - }
869 - }
870 -
871 - $plugin['websiteid'] = $website->id;
872 - $plugin['websiteurl'] = $website->url;
873 - $plugin['websitename'] = $website->name;
874 - $output->plugins[] = $plugin;
875 - ++$_count_installed;
937 + $dbwebsites[ $website->id ] = MainWP_Utility::map_site(
938 + $website,
939 + $data_fields
940 + );
876 941 }
877 - if ( 0 === $_count_installed && 'not_installed' === $status ) {
878 - for ( $i = 0; $i < $_count; $i++ ) {
879 - $plugin = $allPlugins[ $i ];
880 - $plugin['websiteid'] = $website->id;
881 - $plugin['websiteurl'] = $website->url;
882 - $plugin['websitename'] = $website->name;
883 - $output->plugins_installed[] = $plugin;
884 - }
885 - }
886 - $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data );
887 942 }
888 943 }
889 - }
890 - } else {
891 - $dbwebsites = array();
892 944
893 - if ( '' !== $sites ) {
894 - foreach ( $sites as $v ) {
895 - if ( MainWP_Utility::ctype_digit( $v ) ) {
896 - $website = MainWP_DB::instance()->get_website_by_id( $v, false, array( 'rollback_updates_data' ) );
897 -
898 - if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
899 - continue;
945 + if ( '' !== $groups ) {
946 + foreach ( $groups as $v ) {
947 + if ( MainWP_Utility::ctype_digit( $v ) ) {
948 + $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_by_group_id( $v, false, 'wp.url', false, false, null, null, array( 'extra_view' => array( 'site_info', 'rollback_updates_data' ) ) ) );
949 + while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
950 + if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
951 + continue;
952 + }
953 + $dbwebsites[ $website->id ] = MainWP_Utility::map_site(
954 + $website,
955 + $data_fields
956 + );
957 + }
958 + MainWP_DB::free_result( $websites );
900 959 }
901 -
902 - $dbwebsites[ $website->id ] = MainWP_Utility::map_site(
903 - $website,
904 - $data_fields
905 - );
906 960 }
907 961 }
908 - }
909 962
910 - if ( '' !== $groups ) {
911 - foreach ( $groups as $v ) {
912 - if ( MainWP_Utility::ctype_digit( $v ) ) {
913 - $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_by_group_id( $v, false, 'wp.url', false, false, null, null, array( 'extra_view' => array( 'site_info', 'rollback_updates_data' ) ) ) );
914 - while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
963 + if ( '' !== $clients && is_array( $clients ) ) {
964 + $websites = MainWP_DB_Client::instance()->get_websites_by_client_ids(
965 + $clients,
966 + array(
967 + 'select_data' => $data_fields,
968 + 'extra_view' => array( 'rollback_updates_data', 'site_info' ),
969 + )
970 + );
971 + if ( $websites ) {
972 + foreach ( $websites as $website ) {
915 973 if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
916 974 continue;
917 975 }
918 976 $dbwebsites[ $website->id ] = MainWP_Utility::map_site(
@@ -919,59 +977,37 @@
919 977 $website,
920 978 $data_fields
921 979 );
922 980 }
923 - MainWP_DB::free_result( $websites );
924 981 }
925 982 }
926 - }
927 983
928 - if ( '' !== $clients && is_array( $clients ) ) {
929 - $websites = MainWP_DB_Client::instance()->get_websites_by_client_ids(
930 - $clients,
931 - array(
932 - 'select_data' => $data_fields,
933 - 'extra_view' => array( 'rollback_updates_data' ),
934 - )
984 + $post_data = array(
985 + 'keyword' => $keyword,
935 986 );
936 - if ( $websites ) {
937 - foreach ( $websites as $website ) {
938 - if ( '' !== $website->sync_errors || MainWP_System_Utility::is_suspended_site( $website ) ) {
939 - continue;
940 - }
941 - $dbwebsites[ $website->id ] = MainWP_Utility::map_site(
942 - $website,
943 - $data_fields
944 - );
945 - }
987 +
988 + if ( 'active' === $status || 'inactive' === $status ) {
989 + $post_data['status'] = $status;
990 + $post_data['filter'] = true;
991 + } else {
992 + $post_data['status'] = '';
993 + $post_data['filter'] = false;
946 994 }
947 - }
948 995
949 - $post_data = array(
950 - 'keyword' => $keyword,
951 - );
996 + if ( 'not_installed' === $status ) {
997 + $post_data['not_installed'] = true;
998 + }
952 999
953 - if ( 'active' === $status || 'inactive' === $status ) {
954 - $post_data['status'] = $status;
955 - $post_data['filter'] = true;
956 - } else {
957 - $post_data['status'] = '';
958 - $post_data['filter'] = false;
959 - }
960 -
961 - if ( 'not_installed' === $status ) {
962 - $post_data['not_installed'] = true;
963 - }
964 -
965 - $post_data['not_criteria'] = $not_criteria ? true : false;
966 - MainWP_Connect::fetch_urls_authed( $dbwebsites, 'get_all_plugins', $post_data, array( MainWP_Plugins_Handler::get_class_name(), 'plugins_search_handler' ), $output );
967 - // phpcs:disable WordPress.Security.EscapeOutput
968 - if ( ! empty( $output->errors ) ) {
969 - foreach ( $output->errors as $siteid => $error ) {
970 - $error_results .= MainWP_Utility::get_nice_url( $dbwebsites[ $siteid ]->url ) . ': ' . $error . ' <br/>';
1000 + $post_data['not_criteria'] = $not_criteria ? true : false;
1001 + MainWP_Connect::fetch_urls_authed( $dbwebsites, 'get_all_plugins', $post_data, array( MainWP_Plugins_Handler::get_class_name(), 'plugins_search_handler' ), $output );
1002 + // phpcs:disable WordPress.Security.EscapeOutput
1003 + if ( ! empty( $output->errors ) ) {
1004 + foreach ( $output->errors as $siteid => $error ) {
1005 + $error_results .= MainWP_Utility::get_nice_url( $dbwebsites[ $siteid ]->url ) . ': ' . $error . ' <br/>';
1006 + }
971 1007 }
1008 + // phpcs:enable
972 1009 }
973 - // phpcs:enable
974 1010 }
975 1011
976 1012 MainWP_Cache::add_context(
977 1013 'Plugins',
@@ -1003,9 +1039,9 @@
1003 1039
1004 1040 if ( 'not_installed' === $status ) {
1005 1041 if ( empty( $output->plugins_installed ) ) {
1006 1042 ?>
1007 - <div class="ui message yellow"><?php esc_html_e( 'No websites found.', 'mainwp' ); ?></div>
1043 + <div class="ui message yellow <?php echo $not_fetchdata ? 'mainwp-manage-plugins-reload-data' : ''; ?>"><?php esc_html_e( 'No websites found.', 'mainwp' ); ?></div>
1008 1044 <?php
1009 1045 } else {
1010 1046 $plugins_list = $output->plugins_installed;
1011 1047 $roll_items_list = ! empty( $output->roll_items ) ? $output->roll_items : array();
@@ -1012,9 +1048,9 @@
1012 1048 $view_mode = MAINWP_VIEW_PER_SITE;
1013 1049 }
1014 1050 } elseif ( empty( $output->plugins ) ) {
1015 1051 ?>
1016 - <div class="ui message yellow"><?php esc_html_e( 'No plugins found.', 'mainwp' ); ?></div>
1052 + <div class="ui message yellow <?php echo $not_fetchdata ? 'mainwp-manage-plugins-reload-data' : ''; ?>"><?php esc_html_e( 'No plugins found.', 'mainwp' ); ?></div>
1017 1053 <?php
1018 1054 } else {
1019 1055 $plugins_list = $output->plugins;
1020 1056 $roll_items_list = ! empty( $output->roll_items ) ? $output->roll_items : array();
@@ -1030,8 +1066,9 @@
1030 1066 $muPlugins = array();
1031 1067 $pluginsName = array();
1032 1068 $pluginsMainWP = array();
1033 1069 $pluginsRealVersion = array();
1070 + $pluginsSlug = array();
1034 1071
1035 1072 if ( ! empty( $plugins_list ) ) {
1036 1073
1037 1074 foreach ( $plugins_list as $plugin ) {
@@ -1038,8 +1075,9 @@
1038 1075 $slug_ver = esc_html( $plugin['slug'] . '_' . $plugin['version'] );
1039 1076 $sites[ $plugin['websiteid'] ] = array(
1040 1077 'websiteurl' => esc_html( $plugin['websiteurl'] ),
1041 1078 'websitename' => $plugin['websitename'],
1079 + 'site_info' => $plugin['site_info'],
1042 1080 );
1043 1081
1044 1082 $pluginsSlug[ $slug_ver ] = isset( $plugin['slug'] ) ? $plugin['slug'] : '';
1045 1083 $muPlugins[ $slug_ver ] = isset( $plugin['mu'] ) ? esc_html( $plugin['mu'] ) : 0;
@@ -1065,8 +1103,9 @@
1065 1103 static::render_manage_per_site_table( $sites, $pluginsSlug, $sitePlugins, $pluginsMainWP, $muPlugins, $pluginsName, $pluginsNameSites, $pluginsRealVersion, $roll_items_list );
1066 1104 }
1067 1105 MainWP_Updates::render_plugin_details_modal();
1068 1106 MainWP_UI::render_modal_upload_icon();
1107 + MainWP_Updates::render_changes_history_modal();
1069 1108 }
1070 1109
1071 1110 $newOutput = ob_get_clean();
1072 1111 $result = array(
@@ -1088,48 +1127,49 @@
1088 1127 */
1089 1128 public static function render_bulk_actions( $status ) {
1090 1129 ob_start();
1091 1130 ?>
1092 - <select class="ui dropdown" id="mainwp-bulk-actions">
1093 - <option value="none"><?php esc_html_e( 'Bulk Actions', 'mainwp' ); ?></option>
1094 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
1131 + <select class="ui compact dropdown" id="mainwp-bulk-actions">
1132 + <option value="none"><?php esc_html_e( 'Bulk actions', 'mainwp' ); ?></option>
1133 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
1095 1134 <option value="ignore_updates" data-value="ignore_updates"><?php esc_html_e( 'Ignore updates', 'mainwp' ); ?></option>
1096 1135 <?php endif; ?>
1097 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) : ?>
1136 + <?php if ( \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) : ?>
1098 1137 <?php if ( 'active' === $status ) : ?>
1099 - <option value="deactivate" data-value="deactivate"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></option>
1138 + <option value="deactivate" data-value="deactivate"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></option>
1100 1139 <?php else : ?>
1101 - <option value="deactivate" disabled data-value="deactivate"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></option>
1140 + <option value="deactivate" disabled data-value="deactivate"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?><br/><span class="ui small text"><?php esc_html_e( 'To deactivate, view Active plugins.', 'mainwp' ); ?></span></option>
1141 + <?php endif; ?>
1102 1142 <?php endif; ?>
1103 - <?php endif; ?>
1104 1143 <?php if ( 'inactive' === $status ) : ?>
1105 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) : ?>
1144 + <?php if ( \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) : ?>
1106 1145 <option value="activate" data-value="activate"><?php esc_html_e( 'Activate', 'mainwp' ); ?></option>
1107 - <?php endif; ?>
1108 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'delete_plugins' ) ) : ?>
1146 + <?php endif; ?>
1147 + <?php if ( \mainwp_current_user_can( 'dashboard', 'delete_plugins' ) ) : ?>
1109 1148 <option value="delete" data-value="delete"><?php esc_html_e( 'Delete', 'mainwp' ); ?></option>
1110 - <?php endif; ?>
1149 + <?php endif; ?>
1111 1150 <?php else : ?>
1112 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) : ?>
1113 - <option value="activate" disabled data-value="activate"><?php esc_html_e( 'Activate', 'mainwp' ); ?></option>
1151 + <?php if ( \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) : ?>
1152 + <option value="activate" disabled data-value="activate"><?php esc_html_e( 'Activate', 'mainwp' ); ?><br/><span class="ui small text"><?php esc_html_e( 'To activate, view Inactive plugins.', 'mainwp' ); ?></span></option>
1114 1153 <?php endif; ?>
1115 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'delete_plugins' ) ) : ?>
1116 - <option value="delete" disabled data-value="delete"><?php esc_html_e( 'Delete', 'mainwp' ); ?></option>
1117 - <?php endif; ?>
1118 - <?php endif; ?>
1119 - <?php
1120 - /**
1121 - * Action: mainwp_plugins_bulk_action
1122 - *
1123 - * Adds a new action to the Manage Plugins bulk actions menu.
1124 - *
1125 - * @param string $status Status search parameter.
1126 - *
1127 - * @since 4.1
1128 - */
1129 - do_action( 'mainwp_plugins_bulk_action' );
1130 - ?>
1154 + <?php if ( \mainwp_current_user_can( 'dashboard', 'delete_plugins' ) ) : ?>
1155 + <option value="delete" data-value="delete"><?php esc_html_e( 'Delete', 'mainwp' ); ?></option>
1156 + <?php endif; ?>
1157 + <?php endif; ?>
1158 + <?php
1159 + /**
1160 + * Action: mainwp_plugins_bulk_action
1161 + *
1162 + * Adds a new action to the Manage Plugins bulk actions menu.
1163 + *
1164 + * @param string $status Status search parameter.
1165 + *
1166 + * @since 4.1
1167 + */
1168 + do_action( 'mainwp_plugins_bulk_action' );
1169 + ?>
1131 1170 </select>
1171 +
1132 1172 <button class="ui mini basic button" href="javascript:void(0)" id="mainwp-do-plugins-bulk-actions"><?php esc_html_e( 'Apply', 'mainwp' ); ?></button>
1133 1173 <span id="mainwp_bulk_action_loading"><i class="ui active inline loader tiny"></i></span>
1134 1174 <?php
1135 1175 return ob_get_clean();
@@ -1169,15 +1209,25 @@
1169 1209
1170 1210 if ( ! $hide_show_updates_per ) {
1171 1211 ?>
1172 1212 <form method="post" action="" class="ui mini form right aligned">
1173 - <?php wp_nonce_field( 'mainwp-admin-nonce' ); ?>
1213 + <?php MainWP_UI::generate_wp_nonce( 'mainwp-admin-nonce' ); ?>
1174 1214 <input type="hidden" name="whichview" value="<?php echo esc_attr( $which ); ?>" />
1175 - <div class="inline field">
1176 - <select class="ui dropdown" onchange="mainwp_siteview_onchange(this)" name="select_mainwp_options_plugintheme_view">
1177 - <option value="0" class="item" <?php echo MAINWP_VIEW_PER_PLUGIN_THEME === (int) $view_mode ? 'selected' : ''; ?>><?php echo esc_html( 'plugin' === $which ? esc_html__( 'Show Plugins per Item', 'mainwp' ) : esc_html__( 'Show Themes per Item', 'mainwp' ) ); ?></option>
1178 - <option value="1" class="item" <?php echo MAINWP_VIEW_PER_SITE === (int) $view_mode ? 'selected' : ''; ?>><?php echo esc_html( 'plugin' === $which ? esc_html__( 'Show Plugins per Site', 'mainwp' ) : esc_html__( 'Show Themes per Site', 'mainwp' ) ); ?></option>
1179 - </select>
1215 + <div class="ui mini stackable buttons">
1216 + <button
1217 + type="submit"
1218 + name="select_mainwp_options_plugintheme_view"
1219 + value="0"
1220 + class="ui basic <?php echo esc_attr( MAINWP_VIEW_PER_PLUGIN_THEME === (int) $view_mode ? 'green' : '' ); ?> button">
1221 + <?php echo esc_html( 'plugin' === $which ? esc_html__( 'Show Plugins per Item', 'mainwp' ) : esc_html__( 'Show Themes per Item', 'mainwp' ) ); ?>
1222 + </button>
1223 + <button
1224 + type="submit"
1225 + name="select_mainwp_options_plugintheme_view"
1226 + value="1"
1227 + class="ui basic <?php echo esc_attr( MAINWP_VIEW_PER_SITE === (int) $view_mode ? 'green' : '' ); ?> button">
1228 + <?php echo esc_html( 'plugin' === $which ? esc_html__( 'Show Plugins per Site', 'mainwp' ) : esc_html__( 'Show Themes per Site', 'mainwp' ) ); ?>
1229 + </button>
1180 1230 </div>
1181 1231 </form>
1182 1232 <?php
1183 1233 }
@@ -1214,9 +1264,9 @@
1214 1264
1215 1265 foreach ( $sites as $site_id => $info ) {
1216 1266
1217 1267 $plugin_upgrades = array();
1218 - $website = MainWP_DB::instance()->get_website_by_id( $site_id, false, array( 'rollback_updates_data' ) );
1268 + $website = MainWP_DB::instance()->get_website_by_id( $site_id, false, array( 'rollback_updates_data', 'site_info' ) );
1219 1269
1220 1270 if ( $website && ! $website->is_ignorePluginUpdates ) {
1221 1271 $plugin_upgrades = json_decode( $website->plugin_upgrades, true );
1222 1272 $decodedPremiumUpgrades = MainWP_DB::instance()->get_website_option( $website, 'premium_upgrades' );
@@ -1233,9 +1283,9 @@
1233 1283
1234 1284 $premiumUpgrade = array_filter( $premiumUpgrade );
1235 1285
1236 1286 if ( ! isset( $plugin_upgrades[ $crrSlug ] ) ) {
1237 - $plugin_upgrades[ $crrSlug ] = array();
1287 + continue;
1238 1288 }
1239 1289 $plugin_upgrades[ $crrSlug ] = array_merge( $plugin_upgrades[ $crrSlug ], $premiumUpgrade );
1240 1290 }
1241 1291 }
@@ -1261,19 +1311,27 @@
1261 1311 * @since 4.1
1262 1312 */
1263 1313 do_action( 'mainwp_before_plugins_table' );
1264 1314 ?>
1315 +
1316 + <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-plugins-bulk-actions-tip' ) ) : ?>
1317 + <div class="ui message">
1318 + <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-plugins-bulk-actions-tip"></i>
1319 + <div><em data-emoji=":bulb:" class="small"></em> <?php esc_html_e( 'Tip: Use Bulk Actions to activate, deactivate, or delete selected plugins.', 'mainwp' ); ?></div>
1320 + </div>
1321 + <?php endif; ?>
1322 +
1265 1323 <div class="ui secondary segment main-master-checkbox">
1266 1324 <div class="ui stackable grid">
1267 - <div class="one wide center aligned middle aligned column">
1325 + <div class="one wide left aligned middle aligned column">
1268 1326 <span class="trigger-all-accordion"><span class="trigger-handle-arrow"><i class="caret right icon"></i><i class="caret down icon"></i></span></span>
1269 1327 </div>
1270 1328 <div class="one wide center aligned middle aligned column"><div class="ui checkbox main-master not-auto-init"><input type="checkbox"/><label></label></div></div>
1271 - <div class="five wide middle aligned column"><?php esc_html_e( 'Website', 'mainwp' ); ?></div>
1329 + <div class="six wide middle aligned column"><?php esc_html_e( 'Website', 'mainwp' ); ?></div>
1272 1330 <div class="two wide center aligned middle aligned column"></div>
1273 1331 <div class="two wide center aligned middle aligned column"></div>
1274 1332 <div class="two wide center aligned middle aligned column"></div>
1275 - <div class="two wide center aligned middle aligned column"><?php esc_html_e( 'Plugins', 'mainwp' ); ?></div>
1333 + <div class="two wide right aligned middle aligned column"><?php esc_html_e( 'Plugins', 'mainwp' ); ?></div>
1276 1334 </div>
1277 1335 </div>
1278 1336
1279 1337 <div class="mainwp-manage-plugins-wrapper main-child-checkbox">
@@ -1278,9 +1336,19 @@
1278 1336
1279 1337 <div class="mainwp-manage-plugins-wrapper main-child-checkbox">
1280 1338 <?php foreach ( $sites as $site_id => $website ) : ?>
1281 1339 <?php
1282 - $site_name = $website['websitename'];
1340 + $site_name = $website['websitename'];
1341 + $site_url = $website['websiteurl'];
1342 +
1343 + $wp_info = ! empty( $website['site_info'] ) ? json_decode( $website['site_info'], true ) : array();
1344 + if ( ! is_array( $wp_info ) ) {
1345 + $wp_info = array();
1346 + }
1347 + $use_tzformat = ! empty( $wp_info['format_datetime'] ) && is_array( $wp_info['format_datetime'] ) ? $wp_info['format_datetime'] : array();
1348 + $offs = ! empty( $use_tzformat['gmt_offset'] ) ? intval( $use_tzformat['gmt_offset'] ) : 0;
1349 + $offs_info = esc_html__( '- Timezone:', 'mainwp' ) . ' UTC' . ( $offs >= 0 ? '+' . $offs : $offs );
1350 +
1283 1351 $slugVersions = isset( $sitePlugins[ $site_id ] ) ? $sitePlugins[ $site_id ] : array();
1284 1352
1285 1353 if ( ! is_array( $slugVersions ) ) {
1286 1354 $slugVersions = array();
@@ -1293,9 +1361,9 @@
1293 1361 ?>
1294 1362 <div class="ui accordion mainwp-manage-plugin-accordion mainwp-manage-plugin-item main-child-checkbox" id="<?php echo esc_html( $item_id ); ?>">
1295 1363 <div class="title master-checkbox">
1296 1364 <div class="ui stackable grid">
1297 - <div class="one wide center aligned middle aligned column"><i class="dropdown icon dropdown-trigger"></i></div>
1365 + <div class="one wide left aligned middle aligned column"><i class="dropdown icon dropdown-trigger"></i></div>
1298 1366 <div class="one wide center aligned middle aligned column">
1299 1367 <div class="ui checkbox master">
1300 1368 <input type="checkbox"/>
1301 1369 <label></label>
@@ -1300,14 +1368,14 @@
1300 1368 <input type="checkbox"/>
1301 1369 <label></label>
1302 1370 </div>
1303 1371 </div>
1304 - <div class="three wide middle aligned column"><a target="_blank" href="admin.php?page=SiteOpen&newWindow=yes&websiteid=<?php echo intval( $site_id ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>"><i class="sign in icon"></i></a> <a href="admin.php?page=managesites&dashboard=<?php echo intval( $site_id ); ?>"><?php echo esc_html( $site_name ); ?></a></div>
1372 + <div class="four wide middle aligned column"><a target="_blank" href="<?php MainWP_Site_Open::get_open_site_admin_link( $site_id, true ); //phpcs:ignore -- ok. ?>"><i class="sign in icon"></i></a> <a href="admin.php?page=managesites&dashboard=<?php echo intval( $site_id ); ?>"><?php echo esc_html( $site_name ); ?></a></div>
1305 1373 <div class="two wide center aligned middle aligned column"></div>
1306 1374 <div class="two wide center aligned middle aligned column"></div>
1307 1375 <div class="two wide center aligned middle aligned column"></div>
1308 1376 <div class="two wide center aligned middle aligned column"></div>
1309 - <div class="two wide center aligned middle aligned column"><div class="ui label"><i class="icon plug"></i> <?php echo intval( $count_plugins ); ?></div></div>
1377 + <div class="two wide right aligned middle aligned column"><div class="ui label"><?php echo intval( $count_plugins ) . ' ' . esc_html( _n( 'Plugin', 'Plugins', intval( $count_plugins ), 'mainwp' ) ); ?></div></div>
1310 1378 </div>
1311 1379 </div>
1312 1380 <div class="content child-checkbox">
1313 1381 <?php
@@ -1338,11 +1406,11 @@
1338 1406
1339 1407 if ( isset( $sitePlugins[ $site_id ][ $slug_ver ] ) && ( empty( $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) || 1 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) ) {
1340 1408 $actived = true;
1341 1409 if ( isset( $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) && 1 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) {
1342 - $plugin_status = '<span class="ui small green basic label">' . esc_html__( 'Active', 'mainwp' ) . '</span>';
1410 + $plugin_status = '<span class="ui tiny grey label"><i class="circle green icon"></i> ' . esc_html__( 'Active', 'mainwp' ) . '</span>';
1343 1411 } elseif ( isset( $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) && 0 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) {
1344 - $plugin_status = '<span class="ui small red basic label">' . esc_html__( 'Inactive', 'mainwp' ) . '</span>';
1412 + $plugin_status = '<span class="ui tiny grey label"><i class="circle red icon"></i> ' . esc_html__( 'Inactive', 'mainwp' ) . '</span>';
1345 1413 $actived = false;
1346 1414 } else {
1347 1415 $plugin_status = '';
1348 1416 }
@@ -1360,12 +1428,18 @@
1360 1428 $item_id = preg_replace( '/[[:space:]]+/', '_', $item_id );
1361 1429
1362 1430 $plugin_directory = MainWP_Utility::get_dir_slug( $plugin_slug );
1363 1431 $details_link = self_admin_url( 'plugin-install.php?tab=plugin-information&wpplugin=' . intval( $site_id ) . '&plugin=' . rawurlencode( $plugin_directory ) . '&section=changelog' );
1432 +
1433 + $el_id_ite_1 = $item_id;
1434 +
1435 + $compatible_php = isset( $plugin_upgrade['wp_compatible'] ) ? $plugin_upgrade['wp_compatible'] : true;
1436 + $compatible_wp = isset( $plugin_upgrade['php_compatible'] ) ? $plugin_upgrade['php_compatible'] : true;
1437 +
1364 1438 ?>
1365 - <div class="ui very compact stackable grid mainwp-manage-plugin-item-website" plugin-slug="<?php echo esc_attr( rawurlencode( $plugin_slug ) ); ?>" plugin-name="<?php echo esc_html( $plugin_title ); ?>" site-id="<?php echo intval( $site_id ); ?>" site-name="<?php echo esc_html( $site_name ); ?>" id="<?php echo esc_html( $item_id ); ?>">
1439 + <div class="ui very compact stackable grid mainwp-manage-plugin-item-website" plugin-slug="<?php echo esc_attr( rawurlencode( $plugin_slug ) ); ?>" plugin-name="<?php echo esc_html( $plugin_title ); ?>" site-id="<?php echo intval( $site_id ); ?>" site-name="<?php echo esc_attr( $site_name ); ?>" site-url="<?php echo esc_attr( $site_url ); ?>" tz-info="<?php echo esc_attr( $offs_info ); ?>" id="<?php echo esc_attr( $el_id_ite_1 ); ?>">
1366 1440 <div class="one wide center aligned middle aligned column"></div>
1367 - <div class="one wide center aligned middle aligned column">
1441 + <div class="one wide left aligned middle aligned column">
1368 1442 <div class="ui checkbox child <?php echo 'mainwp-child' === $plugin_directory ? 'disabled' : ''; ?>">
1369 1443 <input type="checkbox"
1370 1444 <?php
1371 1445 echo 'mainwp-child' === $plugin_directory ? 'disabled="disabled"' : 'class="mainwp-selected-plugin-site"';
@@ -1375,13 +1449,14 @@
1375 1449 </div>
1376 1450 <?php // phpcs:disable WordPress.Security.EscapeOutput ?>
1377 1451 <div class="one wide center aligned middle aligned column"><?php echo MainWP_System_Utility::get_plugin_icon( $plugin_directory ); ?></div>
1378 1452 <?php // phpcs:enable ?>
1379 - <div class="three wide middle aligned column"><a class="open-plugin-details-modal" href="<?php echo esc_url( $details_link ); ?>" target="_blank" ><?php echo esc_html( $plugin_title ); ?></a></div>
1380 - <div class="one wide center aligned middle aligned column"><?php echo $plugin_status; //phpcs:ignore -- escaped. ?></div>
1381 - <div class="two wide center aligned middle aligned column"><?php echo $trusted ? '<span class="ui tiny basic green label">' . esc_html__( 'Trusted', 'mainwp' ) . '</span>' : '<span class="ui tiny basic grey label">' . esc_html__( 'Not Trusted', 'mainwp' ) . '</span>'; ?></div>
1453 + <div class="two wide middle aligned column"><a class="open-plugin-details-modal" href="<?php echo esc_url( $details_link ); ?>" target="_blank" ><?php echo esc_html( $plugin_title ); ?></a></div>
1454 + <div class="two wide center aligned middle aligned column"><?php echo $plugin_status; //phpcs:ignore -- escaped. ?></div>
1455 + <div class="two wide center aligned middle aligned column"><?php echo $trusted ? '<span class="ui tiny green label"><i class="locks icon"></i> ' . esc_html__( 'Trusted', 'mainwp' ) . '</span>' : '<span class="ui tiny red label"><i class="lock open icon"></i> ' . esc_html__( 'Not Trusted', 'mainwp' ) . '</span>'; ?></div>
1382 1456 <div class="one wide center aligned middle aligned column"><?php echo $plugin_mu ? '<span class="ui small label"><i class="exclamation orange triangle icon"></i> MU</span>' : ''; ?></div>
1383 - <div class="two wide center aligned middle aligned column current-version">
1457 + <div class="two wide left aligned middle aligned column current-version">
1458 + <span class="ui small text">
1384 1459 <?php echo esc_html( $plugin_version ); ?>
1385 1460 <?php if ( ! empty( $new_version ) ) : ?>
1386 1461 &rarr;
1387 1462 <?php
@@ -1390,31 +1465,46 @@
1390 1465 }
1391 1466 echo esc_html( $new_version );
1392 1467 ?>
1393 1468 <?php endif; ?>
1469 + </span>
1394 1470 </div>
1395 - <div class="two wide right aligned middle aligned column update-column" updated="0">
1471 +
1472 +
1473 +
1474 +
1475 + <div class="one wide right aligned middle aligned column update-column" updated="0">
1396 1476 <?php if ( ! empty( $upgradeInfo ) && MainWP_Updates::user_can_update_plugins() ) : ?>
1397 - <span data-position="top right" data-tooltip="<?php echo esc_attr__( 'Update ', 'mainwp' ) . esc_html( $plugin_title ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted=""><a href="javascript:void(0)" class="ui mini green basic button <?php echo $is_demo ? 'disabled' : ''; ?>" onClick="return manage_plugins_upgrade( '<?php echo esc_js( rawurlencode( $plugin_slug ) ); ?>', <?php echo esc_attr( $site_id ); ?> )"><?php esc_html_e( 'Update Now', 'mainwp' ); ?></a></span>
1477 + <span data-position="top right" data-tooltip="<?php echo esc_attr__( 'Update ', 'mainwp' ) . esc_html( $plugin_title ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted=""><a href="javascript:void(0)" class="ui mini green basic button <?php echo $is_demo ? 'disabled' : ''; ?>" onClick="return manage_plugins_upgrade( '<?php echo esc_js( rawurlencode( $plugin_slug ) ); ?>', <?php echo esc_attr( $site_id ); ?> )"><?php esc_html_e( 'Update', 'mainwp' ); ?></a></span>
1398 1478 <?php endif; ?>
1399 1479 </div>
1480 + <div class="one wide center aligned middle aligned column"><a href="#" history-view="manage-plugins-per-sites" data-tooltip="<?php esc_attr_e( 'View history', 'mainwp' ); ?>" data-inverted="" data-possition="center left" class="mainwp-show-history ui mini basic grey icon button"><i class="history icon"></i></a></div>
1400 1481 <div class="two wide center aligned middle aligned column column-actions">
1401 - <?php if ( ! $child_plugin ) : ?>
1402 - <?php if ( $actived ) { ?>
1403 - <?php if ( ! $plugin_mu && mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1404 - <a href="#" class="mainwp-manage-plugin-deactivate ui mini fluid button <?php echo $is_demo ? 'disabled' : ''; ?>" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Deactivate ', 'mainwp' ) . esc_html( $plugin_title ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></a>
1482 + <div class="ui mini fluid buttons">
1483 +
1484 + <?php if ( ! $child_plugin ) : ?>
1485 + <?php if ( $actived ) { ?>
1486 + <?php if ( ! $plugin_mu && \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1487 + <a href="#" class="mainwp-manage-plugin-deactivate ui button" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Deactivate ', 'mainwp' ) . esc_html( $plugin_title ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></a>
1488 + <?php } ?>
1489 + <?php } else { ?>
1490 + <?php if ( \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1491 + <?php
1492 + if ( $compatible_php && $compatible_wp ) {
1493 + ?>
1494 + <a href="#" class="mainwp-manage-plugin-activate ui green button" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Activate ', 'mainwp' ) . esc_html( wp_strip_all_tags( $plugin_title ) ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Activate', 'mainwp' ); ?></a>
1495 + <?php
1496 + } else {
1497 + static::render_incompatible_active( $compatible_php, $compatible_wp );
1498 + ?>
1499 + <?php } ?>
1500 + <?php } ?>
1405 1501 <?php } ?>
1406 - <?php } else { ?>
1407 - <div class="ui mini fluid buttons">
1408 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1409 - <a href="#" class="mainwp-manage-plugin-activate ui green button <?php echo $is_demo ? 'disabled' : ''; ?>" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Activate ', 'mainwp' ) . esc_html( wp_strip_all_tags( $plugin_title ) ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Activate', 'mainwp' ); ?></a>
1502 + <?php if ( ! $plugin_mu && \mainwp_current_user_can( 'dashboard', 'delete_plugins' ) ) { ?>
1503 + <a href="#" class="mainwp-manage-plugin-delete ui button" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Delete ', 'mainwp' ) . ' ' . esc_html( wp_strip_all_tags( $plugin_title ) ) . ' ' . esc_attr__( 'plugin from this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Delete', 'mainwp' ); ?></a>
1410 1504 <?php } ?>
1411 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'delete_plugins' ) ) { ?>
1412 - <a href="#" class="mainwp-manage-plugin-delete ui button <?php echo $is_demo ? 'disabled' : ''; ?>" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Delete ', 'mainwp' ) . ' ' . esc_html( wp_strip_all_tags( $plugin_title ) ) . ' ' . esc_attr__( 'plugin from this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Delete', 'mainwp' ); ?></a>
1413 - <?php } ?>
1414 - </div>
1415 - <?php } ?>
1416 - <?php endif; ?>
1505 + <?php endif; ?>
1506 + </div>
1417 1507 </div>
1418 1508 </div>
1419 1509 <?php
1420 1510
@@ -1426,13 +1516,15 @@
1426 1516 <?php endforeach; ?>
1427 1517 </div>
1428 1518
1429 1519 <script type="text/javascript">
1430 - jQuery( '.mainwp-manage-plugin-accordion' ).accordion( {
1431 - "selector": {
1432 - "trigger" : '.dropdown-trigger',
1433 - }
1434 - } );
1520 + jQuery(document).ready(function ($) {
1521 + $( '.mainwp-manage-plugin-accordion' ).accordion( {
1522 + "selector": {
1523 + "trigger" : '.dropdown-trigger',
1524 + }
1525 + } );
1526 + });
1435 1527
1436 1528 jQuery( '.trigger-all-accordion' ).on( 'click', function() { // not use document here.
1437 1529 if ( jQuery( this ).hasClass( 'active' ) ) {
1438 1530 jQuery( this ).removeClass( 'active' );
@@ -1518,9 +1610,9 @@
1518 1610 if ( 'plugin' === $premiumUpgrade['type'] ) {
1519 1611 $premiumUpgrade = array_filter( $premiumUpgrade );
1520 1612
1521 1613 if ( ! isset( $plugin_upgrades[ $crrSlug ] ) ) {
1522 - $plugin_upgrades[ $crrSlug ] = array();
1614 + continue;
1523 1615 }
1524 1616 $plugin_upgrades[ $crrSlug ] = array_merge( $plugin_upgrades[ $crrSlug ], $premiumUpgrade );
1525 1617 }
1526 1618 }
@@ -1546,11 +1638,19 @@
1546 1638 * @since 4.1
1547 1639 */
1548 1640 do_action( 'mainwp_before_plugins_table' );
1549 1641 ?>
1642 +
1643 + <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-plugins-bulk-actions-tip' ) ) : ?>
1644 + <div class="ui message">
1645 + <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-plugins-bulk-actions-tip"></i>
1646 + <div><em data-emoji=":bulb:" class="small"></em> <?php esc_html_e( 'Tip: Use Bulk Actions to activate, deactivate, or delete selected plugins.', 'mainwp' ); ?></div>
1647 + </div>
1648 + <?php endif; ?>
1649 +
1550 1650 <div class="ui secondary segment main-master-checkbox">
1551 1651 <div class="ui stackable grid">
1552 - <div class="one wide center aligned middle aligned column">
1652 + <div class="one wide left aligned middle aligned column">
1553 1653 <span class="trigger-all-accordion"><span class="trigger-handle-arrow"><i class="caret right icon"></i><i class="caret down icon"></i></span></span>
1554 1654 </div>
1555 1655 <div class="one wide center aligned middle aligned column"><div class="ui checkbox main-master not-auto-init"><input type="checkbox"/><label></label></div></div>
1556 1656 <div class="one wide center aligned middle aligned column"></div>
@@ -1555,11 +1655,11 @@
1555 1655 <div class="one wide center aligned middle aligned column"><div class="ui checkbox main-master not-auto-init"><input type="checkbox"/><label></label></div></div>
1556 1656 <div class="one wide center aligned middle aligned column"></div>
1557 1657 <div class="five wide middle aligned column"><?php esc_html_e( 'Plugin', 'mainwp' ); ?></div>
1558 1658 <div class="two wide center aligned middle aligned column"></div>
1559 - <div class="two wide center aligned middle aligned column"><?php esc_html_e( 'Latest Version', 'mainwp' ); ?></div>
1659 + <div class="two wide right aligned middle aligned column"><?php esc_html_e( 'Latest Version', 'mainwp' ); ?></div>
1560 1660 <div class="two wide center aligned middle aligned column"></div>
1561 - <div class="two wide center aligned middle aligned column"><?php esc_html_e( 'Websites', 'mainwp' ); ?></div>
1661 + <div class="two wide right aligned middle aligned column"><?php esc_html_e( 'Websites', 'mainwp' ); ?></div>
1562 1662 </div>
1563 1663 </div>
1564 1664
1565 1665 <div class="mainwp-manage-plugins-wrapper main-child-checkbox">
@@ -1586,9 +1686,9 @@
1586 1686 ?>
1587 1687 <div class="ui accordion mainwp-manage-plugin-accordion mainwp-manage-plugin-item main-child-checkbox" id="<?php echo esc_html( $item_id ); ?>">
1588 1688 <div class="title master-checkbox">
1589 1689 <div class="ui grid">
1590 - <div class="one wide center aligned middle aligned column"><i class="dropdown icon dropdown-trigger"></i></div>
1690 + <div class="one wide left aligned middle aligned column"><i class="dropdown icon dropdown-trigger"></i></div>
1591 1691 <div class="one wide center aligned middle aligned column">
1592 1692 <div class="ui checkbox <?php echo 'mainwp-child' === $plugin_directory ? 'disabled' : ''; ?> master"><input type="checkbox" <?php echo 'mainwp-child' === $plugin_directory ? 'disabled="disabled"' : ''; ?>><label></label></div>
1593 1693 </div>
1594 1694 <div class="one wide center aligned middle aligned column"><?php echo MainWP_System_Utility::get_plugin_icon( $plugin_directory ); // phpcs:ignore WordPress.Security.EscapeOutput ?></div>
@@ -1593,11 +1693,11 @@
1593 1693 </div>
1594 1694 <div class="one wide center aligned middle aligned column"><?php echo MainWP_System_Utility::get_plugin_icon( $plugin_directory ); // phpcs:ignore WordPress.Security.EscapeOutput ?></div>
1595 1695 <div class="five wide middle aligned column"><a class="open-plugin-details-modal" href="<?php echo esc_url( $details_link ); ?>" target="_blank" ><?php echo esc_html( $plugin_title ); ?></a></div>
1596 1696 <div class="two wide center aligned middle aligned column"></div>
1597 - <div class="two wide center aligned middle aligned column lastest-version-info"></div>
1697 + <div class="two wide right aligned middle aligned column lastest-version-info"></div>
1598 1698 <div class="two wide center aligned middle aligned column"></div>
1599 - <div class="two wide center aligned middle aligned column"><div class="ui label"><i class="icon wordpress"></i> <?php echo intval( $count_sites ); // phpcs:ignore -- Prevent modify WP icon. ?></div></div>
1699 + <div class="two wide right aligned middle aligned column"><div class="ui label"><?php echo intval( $count_sites ) . ' ' . esc_html( _n( 'Site', 'Sites', intval( $count_sites ), 'mainwp' ) ); ?></div></div>
1600 1700 </div>
1601 1701 </div>
1602 1702 <div class="content child-checkbox">
1603 1703 <?php
@@ -1603,9 +1703,18 @@
1603 1703 <?php
1604 1704 // phpcs:enable
1605 1705 foreach ( $pluginSites as $site_id => $slugVersions ) :
1606 1706 $site_name = $sites[ $site_id ]['websitename'];
1707 + $site_url = $sites[ $site_id ]['websiteurl'];
1607 1708
1709 + $wp_info = ! empty( $sites[ $site_id ]['site_info'] ) ? json_decode( $sites[ $site_id ]['site_info'], true ) : array();
1710 + if ( ! is_array( $wp_info ) ) {
1711 + $wp_info = array();
1712 + }
1713 + $use_tzformat = ! empty( $wp_info['format_datetime'] ) && is_array( $wp_info['format_datetime'] ) ? $wp_info['format_datetime'] : array();
1714 + $offs = ! empty( $use_tzformat['gmt_offset'] ) ? intval( $use_tzformat['gmt_offset'] ) : 0;
1715 + $offs_info = esc_html__( '- Timezone:', 'mainwp' ) . ' UTC' . ( $offs >= 0 ? '+' . $offs : $offs );
1716 +
1608 1717 foreach ( $slugVersions as $slug_ver ) :
1609 1718
1610 1719 $plugin_slug = $pluginsSlug[ $slug_ver ];
1611 1720 $trusted = in_array( $plugin_slug, $trustedPlugins ) ? true : false;
@@ -1637,11 +1746,11 @@
1637 1746
1638 1747 if ( isset( $sitePlugins[ $site_id ][ $slug_ver ] ) && ( 0 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] || 1 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) ) {
1639 1748 $actived = true;
1640 1749 if ( isset( $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) && 1 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) {
1641 - $plugin_status = '<span class="ui small green basic label">' . esc_html__( 'Active', 'mainwp' ) . '</span>';
1750 + $plugin_status = '<span class="ui tiny grey label"><i class="circle green icon"></i> ' . esc_html__( 'Active', 'mainwp' ) . '</span>';
1642 1751 } elseif ( isset( $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) && 0 === (int) $sitePlugins[ $site_id ][ $slug_ver ]['active'] ) {
1643 - $plugin_status = '<span class="ui small red basic label">' . esc_html__( 'Inactive', 'mainwp' ) . '</span>';
1752 + $plugin_status = '<span class="ui tiny grey label"><i class="circle red icon"></i> ' . esc_html__( 'Inactive', 'mainwp' ) . '</span>';
1644 1753 $actived = false;
1645 1754 } else {
1646 1755 $plugin_status = '';
1647 1756 }
@@ -1655,69 +1764,87 @@
1655 1764 $item_id = $slug_ver . '_' . $site_id;
1656 1765 $item_id = strtolower( $item_id );
1657 1766 $item_id = preg_replace( '/[[:space:]]+/', '_', $item_id );
1658 1767
1768 + $el_id_ite_2 = $item_id;
1769 +
1770 + $compatible_php = isset( $upgradeInfo['wp_compatible'] ) ? $upgradeInfo['wp_compatible'] : true;
1771 + $compatible_wp = isset( $upgradeInfo['php_compatible'] ) ? $upgradeInfo['php_compatible'] : true;
1772 +
1659 1773 ?>
1660 - <div class="ui stackable grid very compact mainwp-manage-plugin-item-website" plugin-slug="<?php echo esc_attr( rawurlencode( $plugin_slug ) ); ?>" plugin-name="<?php echo esc_html( wp_strip_all_tags( $pluginsName[ $slug_ver ] ) ); ?>" site-id="<?php echo intval( $site_id ); ?>" site-name="<?php echo esc_html( $site_name ); ?>" id="<?php echo esc_html( $item_id ); ?>">
1661 - <div class="one wide center aligned middle aligned column"></div>
1662 - <div class="one wide center aligned middle aligned column">
1663 - <?php if ( $child_plugin ) { ?>
1664 - <div class="ui disabled checkbox"><input type="checkbox" disabled="disabled"><label></label></div>
1665 - <?php } else { ?>
1666 - <div class="ui checkbox child">
1667 - <input type="checkbox" class="mainwp-selected-plugin-site" />
1668 - <label></label>
1669 - </div>
1670 - <?php
1774 + <div class="ui stackable grid very compact mainwp-manage-plugin-item-website" plugin-slug="<?php echo esc_attr( rawurlencode( $plugin_slug ) ); ?>" plugin-name="<?php echo esc_html( wp_strip_all_tags( $pluginsName[ $slug_ver ] ) ); ?>" site-id="<?php echo intval( $site_id ); ?>" site-name="<?php echo esc_attr( $site_name ); ?>" site-url="<?php echo esc_attr( $site_url ); ?>" tz-info="<?php echo esc_attr( $offs_info ); ?>" id="<?php echo esc_html( $el_id_ite_2 ); ?>">
1775 + <div class="one wide left aligned middle aligned column"></div>
1776 + <div class="one wide center aligned middle aligned column">
1777 + <?php if ( $child_plugin ) : ?>
1778 + <div class="ui disabled checkbox"><input type="checkbox" disabled="disabled"><label></label></div>
1779 + <?php else : ?>
1780 + <div class="ui checkbox child">
1781 + <input type="checkbox" class="mainwp-selected-plugin-site" />
1782 + <label></label>
1783 + </div>
1784 + <?php endif; ?>
1785 + </div>
1786 +
1787 + <div class="two wide middle aligned column"><a target="_blank" href="<?php MainWP_Site_Open::get_open_site_admin_link( $site_id, true ); //phpcs:ignore -- ok. ?>"><i class="sign in icon"></i></a> <a href="admin.php?page=managesites&dashboard=<?php echo intval( $site_id ); ?>"><?php echo esc_html( $site_name ); ?></a></div>
1788 +
1789 + <div class="two wide center aligned middle aligned column"><?php echo $plugin_status; //phpcs:ignore -- escaped. ?></div>
1790 +
1791 + <div class="two wide center aligned middle aligned column"><?php echo $trusted ? '<span class="ui tiny green label"><i class="lock icon"></i> ' . esc_html__( 'Trusted', 'mainwp' ) . '</span>' : '<span class="ui tiny red label"><i class="lock open icon"></i> ' . esc_html__( 'Not Trusted', 'mainwp' ) . '</span>'; ?></div>
1792 +
1793 + <div class="one wide center aligned middle aligned column"><?php echo $plugin_mu ? '<span class="ui small label"><i class="exclamation orange triangle icon"></i> MU</span>' : ''; ?></div>
1794 +
1795 + <div class="two wide center aligned middle aligned column current-version">
1796 + <span class="ui small text">
1797 + <?php echo esc_html( $plugin_version ); ?>
1798 + <?php if ( ! empty( $new_version ) ) : ?>
1799 + &rarr;
1800 + <?php
1801 + if ( ! empty( $roll_list[ $site_id ][ $plugin_slug ][ $new_version ] ) ) {
1802 + echo MainWP_Updates_Helper::get_roll_msg( $roll_list[ $site_id ][ $plugin_slug ][ $new_version ], true, 'notice' ); //phpcs:ignore -- NOSONAR -- ok.
1671 1803 }
1804 + echo esc_html( $new_version );
1672 1805 ?>
1673 - </div>
1674 - <div class="three wide middle aligned column"><a target="_blank" href="admin.php?page=SiteOpen&newWindow=yes&websiteid=<?php echo intval( $site_id ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>"><i class="sign in icon"></i></a> <a href="admin.php?page=managesites&dashboard=<?php echo intval( $site_id ); ?>"><?php echo esc_html( $site_name ); ?></a></div>
1675 - <div class="one wide middle aligned column"></div>
1676 - <div class="one wide center aligned middle aligned column"><?php echo $plugin_status; //phpcs:ignore -- escaped. ?></div>
1677 - <div class="two wide center aligned middle aligned column"><?php echo $trusted ? '<span class="ui tiny basic green label">' . esc_html__( 'Trusted', 'mainwp' ) . '</span>' : '<span class="ui tiny basic grey label">' . esc_html__( 'Not Trusted', 'mainwp' ) . '</span>'; ?></div>
1806 + <?php endif; ?>
1807 + </span>
1808 + </div>
1678 1809
1810 + <div class="two wide right aligned middle aligned column update-column" updated="0">
1811 + <?php if ( ! empty( $upgradeInfo ) && MainWP_Updates::user_can_update_plugins() ) : ?>
1812 + <span data-position="top right" data-tooltip="<?php echo esc_attr__( 'Update ', 'mainwp' ) . esc_html( $plugin_title ) . ' ' . esc_attr__( 'plugin on this child site.', 'mainwp' ); ?>" data-inverted="" ><a href="javascript:void(0)" class="ui mini green basic button <?php echo $is_demo ? 'disabled' : ''; ?>" onClick="return manage_plugins_upgrade( '<?php echo esc_js( rawurlencode( $plugin_slug ) ); ?>', <?php echo esc_attr( $site_id ); ?> )"><?php esc_html_e( 'Update', 'mainwp' ); ?></a></span>
1813 + <?php endif; ?>
1814 + </div>
1679 1815
1680 - <div class="one wide center aligned middle aligned column"><?php echo $plugin_mu ? '<span class="ui small label"><i class="exclamation orange triangle icon"></i> MU</span>' : ''; ?></div>
1816 + <div class="one wide middle aligned center aligned column"><a href="#" history-view="manage-plugins-per-items" data-tooltip="<?php esc_attr_e( 'View history', 'mainwp' ); ?>" data-inverted="" data-possition="center left" class="mainwp-show-history ui mini icon basic grey button"><i class="history icon"></i></a></div>
1681 1817
1682 - <div class="two wide center aligned middle aligned column current-version">
1683 - <?php echo esc_html( $plugin_version ); ?>
1684 - <?php if ( ! empty( $new_version ) ) : ?>
1685 - &rarr;
1686 - <?php
1687 - if ( ! empty( $roll_list[ $site_id ][ $plugin_slug ][ $new_version ] ) ) {
1688 - echo MainWP_Updates_Helper::get_roll_msg( $roll_list[ $site_id ][ $plugin_slug ][ $new_version ], true, 'notice' ); //phpcs:ignore -- NOSONAR -- ok.
1689 - }
1690 - echo esc_html( $new_version );
1691 - ?>
1692 - <?php endif; ?>
1693 - </div>
1694 - <div class="two wide right aligned middle aligned column update-column" updated="0">
1695 - <?php if ( ! empty( $upgradeInfo ) && MainWP_Updates::user_can_update_plugins() ) : ?>
1696 - <span data-position="top right" data-tooltip="<?php echo esc_attr__( 'Update ', 'mainwp' ) . esc_html( $plugin_title ) . ' ' . esc_attr__( 'lugin on this child site.', 'mainwp' ); ?>" data-inverted="" ><a href="javascript:void(0)" class="ui mini green basic button <?php echo $is_demo ? 'disabled' : ''; ?>" onClick="return manage_plugins_upgrade( '<?php echo esc_js( rawurlencode( $plugin_slug ) ); ?>', <?php echo esc_attr( $site_id ); ?> )"><?php esc_html_e( 'Update Now', 'mainwp' ); ?></a></span>
1697 - <?php endif; ?>
1698 - </div>
1699 - <div class="two wide center aligned middle aligned column column-actions">
1818 + <div class="two wide center aligned middle aligned column column-actions">
1819 + <div class="ui mini fluid buttons">
1700 1820 <?php if ( ! $child_plugin ) : ?>
1701 1821 <?php if ( $actived ) { ?>
1702 - <?php if ( ! $plugin_mu && mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1703 - <a href="#" class="mainwp-manage-plugin-deactivate ui mini fluid button <?php echo $is_demo ? 'disabled' : ''; ?>"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></a>
1822 + <?php if ( ! $plugin_mu && \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1823 + <a href="#" class="mainwp-manage-plugin-deactivate ui button <?php echo $is_demo ? 'disabled' : ''; ?>"><?php esc_html_e( 'Deactivate', 'mainwp' ); ?></a>
1704 1824 <?php } ?>
1705 - <?php } else { ?>
1706 - <div class="ui mini fluid buttons">
1707 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1708 - <a href="#" class="mainwp-manage-plugin-activate ui green button <?php echo $is_demo ? 'disabled' : ''; ?>" ><?php esc_html_e( 'Activate', 'mainwp' ); ?></a>
1825 + <?php } else { ?>
1826 + <?php if ( \mainwp_current_user_can( 'dashboard', 'activate_deactivate_plugins' ) ) { ?>
1827 + <?php
1828 + if ( $compatible_php && $compatible_wp ) {
1829 + ?>
1830 + <a href="#" class="mainwp-manage-plugin-activate ui green button <?php echo $is_demo ? 'disabled' : ''; ?>" ><?php esc_html_e( 'Activate', 'mainwp' ); ?></a>
1831 + <?php
1832 + } else {
1833 + static::render_incompatible_active( $compatible_php, $compatible_wp );
1834 + ?>
1835 + <?php } ?>
1836 +
1837 + <?php } ?>
1709 1838 <?php } ?>
1710 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'delete_plugins' ) ) { ?>
1711 - <a href="#" class="mainwp-manage-plugin-delete ui button <?php echo $is_demo ? 'disabled' : ''; ?>" ><?php esc_html_e( 'Delete', 'mainwp' ); ?></a>
1839 + <?php if ( ! $plugin_mu && \mainwp_current_user_can( 'dashboard', 'delete_plugins' ) ) { ?>
1840 + <a href="#" class="mainwp-manage-plugin-delete ui button <?php echo $is_demo ? 'disabled' : ''; ?>" data-position="top right" data-tooltip="<?php echo esc_attr__( 'Delete ', 'mainwp' ) . ' ' . esc_html( wp_strip_all_tags( $plugin_title ) ) . ' ' . esc_attr__( 'plugin from this child site.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Delete', 'mainwp' ); ?></a>
1712 1841 <?php } ?>
1713 - </div>
1714 - <?php } ?>
1715 - <?php endif; ?>
1842 + <?php endif; ?>
1716 1843 </div>
1717 1844 </div>
1845 + </div>
1718 1846 <?php
1719 -
1720 1847 }
1721 1848 endforeach;
1722 1849 ?>
1723 1850 <span style="display:none" class="lastest-version-hidden" lastest-version="<?php echo esc_html( $lastest_version ); ?>"></span>
@@ -1729,12 +1856,14 @@
1729 1856 <?php endforeach; ?>
1730 1857 </div>
1731 1858
1732 1859 <script type="text/javascript">
1733 - jQuery( '.mainwp-manage-plugin-accordion' ).accordion( {
1734 - "selector": {
1735 - "trigger" : '.dropdown-trigger',
1736 - }
1860 + jQuery(document).ready(function ($) {
1861 + $( '.mainwp-manage-plugin-accordion' ).accordion( {
1862 + "selector": {
1863 + "trigger" : '.dropdown-trigger',
1864 + }
1865 + } );
1737 1866 } );
1738 1867
1739 1868 jQuery( '.trigger-all-accordion' ).on( 'click', function() { // not use document here.
1740 1869 if ( jQuery( this ).hasClass( 'active' ) ) {
@@ -1778,9 +1907,31 @@
1778 1907 */
1779 1908 do_action( 'mainwp_after_plugins_table' );
1780 1909 }
1781 1910
1911 + /**
1912 + * Method render_incompatible_active().
1913 + *
1914 + * @param mixed $compatible_php Compatible php.
1915 + * @param mixed $compatible_wp Compatible wp. *
1916 + * @param mixed $echo_content Print content or not.
1917 + *
1918 + * @return string Message
1919 + */
1920 + public static function render_incompatible_active( $compatible_php, $compatible_wp, $echo_content = true ) {
1921 + $msg = MainWP_Updates_Per_Item::get_incompatible_message( $compatible_php, $compatible_wp );
1922 + if ( ! empty( $msg ) ) {
1923 + $html = '<span class="ui button basic disabled" data-tooltip="' . esc_attr( $msg ) . '" data-position="left center" data-inverted="">' . esc_html__( 'Cannot Activate', 'mainwp' ) . '</span>';
1924 + if ( $echo_content ) {
1925 + echo $html; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1926 + } else {
1927 + return $html;
1928 + }
1929 + }
1930 + return '';
1931 + }
1782 1932
1933 +
1783 1934 /** Render Install Subpage. */
1784 1935 public static function render_install() {
1785 1936 static::render_header( 'Install' );
1786 1937 static::render_plugins_table();
@@ -1803,10 +1954,10 @@
1803 1954 * @global object
1804 1955 */
1805 1956 global $tab;
1806 1957
1807 - if ( ! mainwp_current_user_have_right( 'dashboard', 'install_plugins' ) ) {
1808 - mainwp_do_not_have_permissions( esc_html__( 'install plugins', 'mainwp' ) );
1958 + if ( ! \mainwp_current_user_can( 'dashboard', 'install_plugins' ) ) {
1959 + \mainwp_do_not_have_permissions( esc_html__( 'install plugins', 'mainwp' ) );
1809 1960 return;
1810 1961 }
1811 1962 ?>
1812 1963
@@ -1812,81 +1963,94 @@
1812 1963
1813 1964 <div class="ui alt segment" id="mainwp-install-plugins">
1814 1965 <div class="mainwp-main-content">
1815 1966 <div class="mainwp-actions-bar">
1816 - <div class="ui stackable grid">
1817 - <div class="ui two column row">
1818 - <div class="column">
1819 - <div id="mainwp-search-plugins-form" class="ui fluid search focus">
1820 - <div class="ui icon fluid input">
1821 - <input id="mainwp-search-plugins-form-field" class="fluid prompt" type="text" placeholder="<?php esc_attr_e( 'Search plugins...', 'mainwp' ); ?>" value="<?php echo isset( $_GET['s'] ) ? esc_html( sanitize_text_field( wp_unslash( $_GET['s'] ) ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>">
1822 - <i class="search icon"></i>
1823 - </div>
1824 - <div class="results"></div>
1825 - </div>
1826 - <script type="text/javascript">
1827 - jQuery( document ).ready(function () {
1828 - jQuery( '#mainwp-search-plugins-form-field' ).on( 'keypress', function(e) {
1829 - let search = jQuery( '#mainwp-search-plugins-form-field' ).val();
1830 - let sel_ids = jQuery( '#plugin_install_selected_sites' ).val();
1831 - if ( '' != sel_ids )
1832 - sel_ids = '&selected_sites=' + sel_ids;
1833 - let origin = '<?php echo esc_url( get_admin_url() ); ?>';
1834 - if ( 13 === e.which ) {
1835 - location.href = origin + 'admin.php?page=PluginsInstall&tab=search&s=' + encodeURIComponent(search) + sel_ids;
1836 - }
1837 - } );
1838 - } );
1839 - </script>
1840 - <?php
1841 - /**
1842 - * Install Plugins actions bar (left)
1843 - *
1844 - * Fires at the left side of the actions bar on the Install Plugins screen, after the Search bar.
1845 - *
1846 - * @since 4.0
1847 - */
1848 - do_action( 'mainwp_install_plugins_actions_bar_left' );
1849 - ?>
1967 + <div class="ui stackable two column grid">
1968 +
1969 + <div class="middle aligned column">
1970 + <div class="ui mini stackable buttons">
1971 + <a href="#" id="MainWPInstallBulkNavSearch" class="ui basic green button mainwp-bulk-install-tabs-header-btn" ><?php esc_html_e( 'Install from WordPress.org', 'mainwp' ); ?></a>
1972 + <a href="#" id="MainWPInstallBulkNavUpload" class="ui basic button mainwp-bulk-install-tabs-header-btn" ><?php esc_html_e( 'Upload .zip file', 'mainwp' ); ?></a>
1973 + <?php do_action( 'mainwp_install_plugin_theme_tabs_header_top', 'plugin' ); ?>
1850 1974 </div>
1975 + <?php
1976 + /**
1977 + * Install Plugins actions bar (right)
1978 + *
1979 + * Fires at the left side of the actions bar on the Install Plugins screen, after the Nav buttons.
1980 + *
1981 + * @since 4.0
1982 + */
1983 + do_action( 'mainwp_install_plugins_actions_bar_right' );
1984 + ?>
1985 + </div>
1986 +
1851 1987 <div class="right aligned column">
1852 - <div class="ui buttons">
1853 - <a href="#" id="MainWPInstallBulkNavSearch" class="ui button" ><?php esc_html_e( 'Install from WordPress.org', 'mainwp' ); ?></a>
1854 - <div class="or"></div>
1855 - <a href="#" id="MainWPInstallBulkNavUpload" class="ui button" ><?php esc_html_e( 'Upload .zip file', 'mainwp' ); ?></a>
1988 + <div id="mainwp-search-plugins-form" class="ui search focus mainwp-bulk-install-showhide-content">
1989 + <div class="ui icon mini input">
1990 + <input id="mainwp-search-plugins-form-field" class="prompt" type="text" placeholder="<?php esc_attr_e( 'Search plugins...', 'mainwp' ); ?>" value="<?php echo isset( $_GET['s'] ) ? esc_html( sanitize_text_field( wp_unslash( $_GET['s'] ) ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>">
1991 + <i class="search icon"></i>
1992 + <i class="remove icon"></i>
1993 + </div>
1994 + <div class="results"></div>
1856 1995 </div>
1857 - <?php
1858 - /**
1859 - * Install Plugins actions bar (right)
1860 - *
1861 - * Fires at the left side of the actions bar on the Install Plugins screen, after the Nav buttons.
1862 - *
1863 - * @since 4.0
1864 - */
1865 - do_action( 'mainwp_install_plugins_actions_bar_right' );
1866 - ?>
1996 + <script type="text/javascript">
1997 + jQuery( document ).ready(function () {
1998 + jQuery( '#mainwp-search-plugins-form-field' ).on( 'keypress', function(e) {
1999 + let search = jQuery( '#mainwp-search-plugins-form-field' ).val();
2000 + let sel_ids = jQuery( '#plugin_install_selected_sites' ).val();
2001 + if ( '' != sel_ids )
2002 + sel_ids = '&selected_sites=' + sel_ids;
2003 + if ( 13 === e.which ) {
2004 + location.href = 'admin.php?page=PluginsInstall&tab=search&s=' + encodeURIComponent(search) + sel_ids;
2005 + }
2006 + } );
2007 + jQuery( '#mainwp-search-plugins-form .remove.icon' ).on( 'click', function(e) {
2008 + location.href = 'admin.php?page=PluginsInstall';
2009 + } );
2010 + } );
2011 + </script>
2012 + <?php
2013 + /**
2014 + * Install Plugins actions bar (left)
2015 + *
2016 + * Fires at the left side of the actions bar on the Install Plugins screen, after the Search bar.
2017 + *
2018 + * @since 4.0
2019 + */
2020 + do_action( 'mainwp_install_plugins_actions_bar_left' );
2021 + ?>
1867 2022 </div>
2023 +
1868 2024 </div>
1869 2025 </div>
1870 - </div>
1871 - <div class="ui segment">
1872 - <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-install-plugins-info-message' ) ) : ?>
2026 +
2027 +
2028 + <div class="ui padded segment">
2029 + <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-install-plugins-info-message' ) ) : ?>
1873 2030 <div class="ui info message">
1874 2031 <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-install-plugins-info-message"></i>
1875 - <?php printf( esc_html__( 'Install plugins on your child sites. You can install plugins from the WordPress.org repository or by uploading a ZIP file. For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://kb.mainwp.com/docs/install-plugins/" target="_blank">', '</a> <i class="external alternate icon"></i>' ); ?>
2032 + <div class="header"><?php esc_html_e( 'Install plugins on your child sites', 'mainwp' ); ?></div>
2033 + <?php
2034 + // translators: 1: Opening anchor tag. 2: Closing anchor tag.
2035 + printf( esc_html__( 'You can install plugins from the WordPress.org repository or by uploading a ZIP file. For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp#install-plugins" target="_blank">', '</a> <i class="external alternate icon"></i>' );
2036 + ?>
1876 2037 </div>
1877 - <?php endif; ?>
2038 + <?php endif; ?>
1878 2039 <div id="mainwp-message-zone" class="ui message" style="display:none;"></div>
1879 - <div class="mainwp-upload-plugin" style="display:none;">
2040 + <div class="mainwp-upload-plugin mainwp-bulk-install-showhide-content" style="display:none;">
1880 2041 <?php MainWP_Install_Bulk::render_upload( 'plugin' ); ?>
1881 2042 </div>
1882 - <div class="mainwp-browse-plugins">
2043 + <div class="mainwp-browse-plugins mainwp-bulk-install-showhide-content">
1883 2044 <form id="plugin-filter" method="post">
1884 - <?php wp_nonce_field( 'mainwp-admin-nonce' ); ?>
2045 + <?php MainWP_UI::generate_wp_nonce( 'mainwp-admin-nonce' ); ?>
1885 2046 <?php static::$pluginsTable->display(); ?>
1886 2047 </form>
1887 2048 </div>
1888 2049 <?php
2050 + // @since 5.4.
2051 + do_action( 'mainwp_bulk_install_tabs_content', 'plugin' );
2052 +
1889 2053 MainWP_UI::render_modal_install_plugin_theme();
1890 2054 MainWP_Updates::render_plugin_details_modal();
1891 2055 ?>
1892 2056 </div>
@@ -1924,18 +2088,24 @@
1924 2088 <div class="title active"><i class="dropdown icon"></i> <?php esc_html_e( 'Installation Options', 'mainwp' ); ?></div>
1925 2089 <div class="content active">
1926 2090 <div class="ui form">
1927 2091 <div class="field">
1928 - <div class="ui toggle checkbox" data-tooltip="<?php esc_attr_e( 'If enabled, the plugin will be automatically activated after the installation.', 'mainwp' ); ?>" data-position="left center" data-inverted="">
2092 + <label><?php esc_html_e( 'Activate after installation', 'mainwp' ); ?></label>
2093 + <div class="ui toggle checkbox">
1929 2094 <input type="checkbox" value="1" checked="checked" id="chk_activate_plugin" />
1930 - <label for="chk_activate_plugin"><?php esc_html_e( 'Activate after installation', 'mainwp' ); ?></label>
2095 + <label for="chk_activate_plugin"></label>
1931 2096 </div>
2097 + <br />
2098 + <span class="ui small grey text"><?php esc_html_e( 'If enabled, the plugin will be automatically activated after the installation.', 'mainwp' ); ?></span>
1932 2099 </div>
1933 2100 <div class="field">
1934 - <div class="ui toggle checkbox" data-tooltip="<?php esc_attr_e( 'If enabled and the plugin already installed on the sites, the already installed version will be overwritten.', 'mainwp' ); ?>" data-position="left center" data-inverted="">
2101 + <label><?php esc_html_e( 'Overwrite existing version', 'mainwp' ); ?></label>
2102 + <div class="ui toggle checkbox">
1935 2103 <input type="checkbox" value="2" checked="checked" id="chk_overwrite" />
1936 - <label for="chk_overwrite"><?php esc_html_e( 'Overwrite existing version', 'mainwp' ); ?></label>
2104 + <label for="chk_overwrite"></label>
1937 2105 </div>
2106 + <br />
2107 + <span class="ui small grey text"><?php esc_html_e( 'If enabled and the plugin already installed on the sites, the already installed version will be overwritten.', 'mainwp' ); ?></span>
1938 2108 </div>
1939 2109 </div>
1940 2110 </div>
1941 2111 <?php do_action( 'mainwp_manage_plugins_after_search_options' ); ?>
@@ -1952,24 +2122,28 @@
1952 2122 * @since 4.1
1953 2123 */
1954 2124 $allow_install = apply_filters( 'file_mod_allowed', true, 'mainwp_install_plugin' );
1955 2125 if ( $allow_install ) {
1956 - $is_demo = MainWP_Demo_Handle::is_demo_mode();
1957 - if ( $is_demo ) {
1958 - MainWP_Demo_Handle::get_instance()->render_demo_disable_button( '<input type="button" disabled="disabled" class="ui green big fluid button disabled" value="' . esc_html__( 'Complete Installation', 'mainwp' ) . '">' );
1959 - } else {
1960 - ?>
1961 - <input type="button" value="<?php esc_attr_e( 'Complete Installation', 'mainwp' ); ?>" class="ui green big fluid button" id="mainwp_plugin_bulk_install_btn" bulk-action="install" name="bulk-install">
1962 - <?php
1963 - }
2126 + ?>
2127 + <input type="button" value="<?php esc_attr_e( 'Complete Installation', 'mainwp' ); ?>" class="ui green big fluid button" id="mainwp_plugin_bulk_install_btn" bulk-action="install" name="bulk-install">
2128 + <?php
1964 2129 }
1965 2130 ?>
1966 - <?php do_action( 'mainwp_manage_plugins_before_submit_button' ); ?>
2131 + <?php do_action( 'mainwp_manage_plugins_before_submit_button' ); ?>
2132 + <?php
2133 + // @since 5.4.
2134 + do_action( 'mainwp_bulk_install_sidebar_submit_bottom', 'plugin' );
2135 + ?>
1967 2136 </div>
1968 2137 <?php do_action( 'mainwp_manage_plugins_sidebar_bottom', 'install' ); ?>
1969 2138 </div>
1970 2139 <div class="ui clearing hidden divider"></div>
1971 2140 </div>
2141 + <script>
2142 + jQuery( document ).ready( function () {
2143 + mainwp_init_button_site_selection_dependency( 'mainwp_plugin_bulk_install_btn' );
2144 + } );
2145 + </script>
1972 2146 <?php
1973 2147 }
1974 2148
1975 2149 /**
@@ -1982,10 +2156,10 @@
1982 2156 $cachedAUSearch = isset( $_SESSION['MainWP_PluginsActiveStatus'] ) ? $_SESSION['MainWP_PluginsActiveStatus'] : null; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized --- ok.
1983 2157
1984 2158 static::render_header( 'AutoUpdate' );
1985 2159
1986 - if ( ! mainwp_current_user_have_right( 'dashboard', 'trust_untrust_updates' ) ) {
1987 - mainwp_do_not_have_permissions( esc_html__( 'trust/untrust updates', 'mainwp' ) );
2160 + if ( ! \mainwp_current_user_can( 'dashboard', 'trust_untrust_updates' ) ) {
2161 + \mainwp_do_not_have_permissions( esc_html__( 'trust/untrust updates', 'mainwp' ) );
1988 2162 } else {
1989 2163 $snPluginAutomaticDailyUpdate = get_option( 'mainwp_pluginAutomaticDailyUpdate' );
1990 2164
1991 2165 if ( false === $snPluginAutomaticDailyUpdate ) {
@@ -1995,60 +2169,72 @@
1995 2169
1996 2170 ?>
1997 2171 <div class="ui alt segment" id="mainwp-plugin-auto-updates">
1998 2172 <div class="mainwp-main-content">
1999 - <div class="mainwp-actions-bar">
2173 + <div class="mainwp-actions-bar" <?php echo ! isset( $_SESSION['MainWP_PluginsActive'] ) ? 'style="display:none"' : ''; ?>>
2000 2174 <div class="ui mini form stackable grid">
2001 2175 <div class="ui two column row">
2002 2176 <div class="left aligned column">
2003 2177 <select id="mainwp-bulk-actions" name="bulk_action" class="ui mini selection dropdown">
2004 2178 <option class="item" value=""><?php esc_html_e( 'Bulk Actions', 'mainwp' ); ?></option>
2005 - <option class="item" value="trust"><?php esc_html_e( 'Trust', 'mainwp' ); ?></option>
2006 - <option class="item" value="untrust"><?php esc_html_e( 'Untrust', 'mainwp' ); ?></option>
2007 - <?php
2008 - /**
2009 - * Action: mainwp_plugins_auto_updates_bulk_action
2010 - *
2011 - * Adds new action to the bulk actions menu on Plugins Auto Updates.
2012 - *
2013 - * @since 4.1
2014 - */
2015 - do_action( 'mainwp_plugins_auto_updates_bulk_action' );
2016 - ?>
2179 + <option class="item" value="trust">
2180 + <?php esc_html_e( 'Mark as Trusted', 'mainwp' ); ?><br/>
2181 + <span class="ui small grey text"><?php esc_html_e( 'Auto updated by your Dashboard', 'mainwp' ); ?></span>
2182 + </option>
2183 + <option class="item" value="untrust">
2184 + <?php esc_html_e( 'Mark as Untrusted', 'mainwp' ); ?><br/>
2185 + <span class="ui small grey text"><?php esc_html_e( 'Require manual updates', 'mainwp' ); ?></span>
2186 + </option>
2187 + <?php
2188 + /**
2189 + * Action: mainwp_plugins_auto_updates_bulk_action
2190 + *
2191 + * Adds new action to the bulk actions menu on Plugins Auto Updates.
2192 + *
2193 + * @since 4.1
2194 + */
2195 + do_action( 'mainwp_plugins_auto_updates_bulk_action' );
2196 + ?>
2017 2197 </select>
2018 - <input type="button" name="" id="mainwp-bulk-trust-plugins-action-apply" class="ui mini basic button" value="<?php esc_attr_e( 'Apply', 'mainwp' ); ?>"/>
2019 - </div>
2020 - <div class="right aligned column"></div>
2021 - </div>
2198 + <input type="button" name="" id="mainwp-bulk-trust-plugins-action-apply" class="ui mini basic button" value="<?php esc_attr_e( 'Apply', 'mainwp' ); ?>"/>
2199 + </div>
2200 + <div class="right aligned column"></div>
2022 2201 </div>
2023 2202 </div>
2203 + </div>
2024 2204
2025 - <?php if ( isset( $_GET['message'] ) && 'saved' === $_GET['message'] ) : // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>
2026 - <div class="ui message green"><?php esc_html_e( 'Settings have been saved.', 'mainwp' ); ?></div>
2027 - <?php endif; ?>
2028 - <div id="mainwp-message-zone" class="ui message" style="display:none"></div>
2029 - <div id="mainwp-auto-updates-plugins-content" class="ui segment">
2030 - <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-disable-auto-updates-info-message' ) ) : ?>
2205 + <?php if ( isset( $_GET['message'] ) && 'saved' === $_GET['message'] ) : // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>
2206 + <div class="ui message green"><?php esc_html_e( 'Settings have been saved.', 'mainwp' ); ?></div>
2207 + <?php endif; ?>
2208 + <div id="mainwp-message-zone" class="ui message" style="display:none"></div>
2209 + <div id="mainwp-auto-updates-plugins-content" class="ui padded segment">
2210 + <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-plugins-auto-updates-info-message' ) ) : ?>
2031 2211 <div class="ui info message">
2032 - <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-disable-auto-updates-info-message"></i>
2033 - <div><?php printf( esc_html__( 'Check out %1$show to disable the WordPress built in auto-updates feature%2$s.', 'mainwp' ), '<a href="https://mainwp.com/how-to-disable-automatic-plugin-and-theme-updates-on-your-child-sites/" target="_blank">', '</a>' ); // NOSONAR - noopener - open safe. ?></div>
2034 - </div>
2035 - <?php endif; ?>
2036 - <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-plugins-auto-updates-info-message' ) ) : ?>
2037 - <div class="ui info message">
2038 2212 <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-plugins-auto-updates-info-message"></i>
2213 + <div class="header"><?php esc_html_e( 'Automatically update only the plugins you trust!', 'mainwp' ); ?></div>
2039 2214 <div><?php esc_html_e( 'The MainWP Advanced Auto Updates feature is a tool for your Dashboard to automatically update plugins that you trust to be updated without breaking your Child sites.', 'mainwp' ); ?></div>
2040 2215 <div><?php esc_html_e( 'Only mark plugins as trusted if you are absolutely sure they can be automatically updated by your MainWP Dashboard without causing issues on the Child sites!', 'mainwp' ); ?></div>
2041 2216 <div><strong><?php esc_html_e( 'Advanced Auto Updates a delayed approximately 24 hours from the update release. Ignored plugins can not be automatically updated.', 'mainwp' ); ?></strong></div>
2042 2217 </div>
2043 - <?php endif; ?>
2044 - <div class="ui inverted dimmer">
2045 - <div class="ui text loader"><?php esc_html_e( 'Loading plugins', 'mainwp' ); ?></div>
2218 + <?php endif; ?>
2219 + <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-disable-auto-updates-info-message' ) ) : ?>
2220 + <div class="ui message">
2221 + <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-disable-auto-updates-info-message"></i>
2222 + <div><em data-emoji=":bulb:" class="small"></em> <?php
2223 + // translators: 1: Opening anchor tag. 2: Closing anchor tag.
2224 + printf( esc_html__( 'Tip: Check out %1$show to disable the WordPress built in auto-updates feature%2$s.', 'mainwp' ), '<a href="https://mainwp.com/how-to-disable-automatic-plugin-and-theme-updates-on-your-child-sites/" target="_blank">', '</a>' ); // NOSONAR - noopener - open safe.
2225 + ?></div>
2046 2226 </div>
2047 - <div id="mainwp-auto-updates-plugins-table-wrapper">
2227 + <?php endif; ?>
2228 + <div class="ui page dimmer">
2229 + <div class="ui text double loader"><?php esc_html_e( 'Loading...', 'mainwp' ); ?></div>
2230 + </div>
2231 + <div id="mainwp-auto-updates-plugins-table-wrapper">
2048 2232 <?php
2049 2233 if ( isset( $_SESSION['MainWP_PluginsActive'] ) ) {
2050 2234 static::render_all_active_table( $_SESSION['MainWP_PluginsActive'] ); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2235 + } else {
2236 + MainWP_UI::render_empty_page_placeholder( __( 'No plugins loaded yet.', 'mainwp' ), __( 'Click Show Plugins button to view your installed plugins and manage their trust settings.', 'mainwp' ), '<em data-emoji=":compass:" class="big"></em>' );
2051 2237 }
2052 2238 ?>
2053 2239 </div>
2054 2240 </div>
@@ -2300,15 +2486,15 @@
2300 2486 <table class="ui unstackable table" id="mainwp-all-active-plugins-table">
2301 2487 <thead>
2302 2488 <tr>
2303 2489 <th scope="col" class="no-sort check-column collapsing"><span class="ui checkbox"><input id="cb-select-all-top" type="checkbox" /></span></th>
2304 - <th scope="col" class="no-sort"><?php esc_html_e( '', 'mainwp' ); ?></th>
2490 + <th scope="col" class="no-sort center aligned"></th>
2305 2491 <th scope="col" data-priority="1"><?php esc_html_e( 'Plugin', 'mainwp' ); ?></th>
2306 - <th scope="col" ><?php esc_html_e( 'Status', 'mainwp' ); ?></th>
2307 - <th scope="col" class="collapsing" data-priority="2"><?php esc_html_e( 'Trust Status', 'mainwp' ); ?></th>
2308 - <th scope="col"><?php esc_html_e( 'Ignored Status', 'mainwp' ); ?></th>
2309 - <th scope="col" class="collapsing"></th>
2310 - <th scope="col" class="collapsing"><?php esc_html_e( 'Notes', 'mainwp' ); ?></th>
2492 + <th scope="col" class="collapsing center aligned"><?php esc_html_e( 'Status', 'mainwp' ); ?></th>
2493 + <th scope="col" class="collapsing center aligned" data-priority="2"><?php esc_html_e( 'Trust Status', 'mainwp' ); ?></th>
2494 + <th scope="col" class="collapsing center aligned"><?php esc_html_e( 'Ignored Status', 'mainwp' ); ?></th>
2495 + <th scope="col" class="collapsing center aligned"></th>
2496 + <th scope="col" class="collapsing center aligned"><?php esc_html_e( 'Notes', 'mainwp' ); ?></th>
2311 2497 </tr>
2312 2498 </thead>
2313 2499 <tbody>
2314 2500 <?php foreach ( $plugins as $slug => $plugin ) : ?>
@@ -2324,9 +2510,9 @@
2324 2510 if ( 'untrust' === $search_status && in_array( $slug, $trustedPlugins ) ) {
2325 2511 continue;
2326 2512 }
2327 2513
2328 - if ( 'ignored' === $search_status && ! MainWP_Common_Functions::instance()->is_ignored_updates( $plugin, $decodedIgnoredPlugins ) ) {
2514 + if ( 'ignored' === $search_status && ! MainWP_Common_Functions::instance()->is_ignored_updates( $plugin, $decodedIgnoredPlugins, 'plugin' ) ) {
2329 2515 continue;
2330 2516 }
2331 2517 }
2332 2518 $esc_note = '';
@@ -2338,21 +2524,21 @@
2338 2524
2339 2525 $plugin_directory = dirname( $slug );
2340 2526 ?>
2341 2527 <?php // phpcs:disable WordPress.Security.EscapeOutput ?>
2342 - <tr plugin-slug="<?php echo esc_attr( rawurlencode( $slug ) ); ?>" plugin-name="<?php echo esc_html( wp_strip_all_tags( $name ) ); ?>">
2528 + <tr plugin-slug="<?php echo esc_attr( rawurlencode( $slug ) ); ?>" plugin-name="<?php echo esc_html( wp_strip_all_tags( $name ) ); ?>" <?php echo ( in_array( $slug, $trustedPlugins ) ) ? 'class=""' : 'class="active"'; ?>>
2343 2529 <td class="check-column"><span class="ui checkbox"><input type="checkbox" name="plugin[]" value="<?php echo esc_attr( rawurlencode( $slug ) ); ?>"></span></td>
2344 2530 <td class="collapsing"><?php echo MainWP_System_Utility::get_plugin_icon( $plugin_directory ); ?></td>
2345 2531 <td><a href="<?php echo esc_url( admin_url() ) . 'plugin-install.php?tab=plugin-information&wpplugin=' . intval( $wpid ) . '&plugin=' . rawurlencode( dirname( $slug ) ); ?>" target="_blank" class="open-plugin-details-modal"><?php echo esc_html( $name ); ?></a></td>
2346 - <td><?php echo ( 1 === (int) $plugin['active'] ) ? esc_html__( 'Active', 'mainwp' ) : esc_html__( 'Inactive', 'mainwp' ); //phpcs:ignore -- escaped. ?></td>
2347 - <td><?php echo ( in_array( $slug, $trustedPlugins ) ) ? '<span class="ui mini green fluid center aligned label">' . esc_html__( 'Trusted', 'mainwp' ) . '</span>' : '<span class="ui mini red fluid center aligned label">' . esc_html__( 'Not Trusted', 'mainwp' ) . '</span>'; ?></td>
2348 - <td><?php echo MainWP_Common_Functions::instance()->is_ignored_updates( $plugin, $decodedIgnoredPlugins ) ? '<span class="ui mini label">' . esc_html__( 'Ignored', 'mainwp' ) . '</span>' : ''; ?></td>
2349 - <td><?php echo MainWP_Common_Functions::instance()->is_ignored_updates( $plugin, $decodedIgnoredPlugins ) ? '<span data-tooltip="Ignored plugins will not be automatically updated." data-inverted=""><i class="info red circle icon" ></i></span>' : ''; ?></td>
2532 + <td class="collapsing center aligned"><?php echo ( 1 === (int) $plugin['active'] ) ? '<span class="ui tiny grey label"><i class="circle green icon"></i> ' . esc_html__( 'Active', 'mainwp' ) . '</span>' : '<span class="ui tiny grey label"><i class="circle red icon"></i> ' . esc_html__( 'Inactive', 'mainwp' ) . '</span>'; //phpcs:ignore -- escaped. ?></td>
2533 + <td class="collapsing center aligned"><?php echo ( in_array( $slug, $trustedPlugins ) ) ? '<span class="ui mini green label"><i class="lock green icon"></i> ' . esc_html__( 'Trusted', 'mainwp' ) . '</span>' : '<span class="ui mini red label"><i class="lock open red icon"></i> ' . esc_html__( 'Not Trusted', 'mainwp' ) . '</span>'; ?></td>
2534 + <td class="collapsing center aligned"><?php echo MainWP_Common_Functions::instance()->is_ignored_updates( $plugin, $decodedIgnoredPlugins, 'plugin' ) ? '<span class="ui mini basic label">' . esc_html__( 'Ignored', 'mainwp' ) . '</span>' : ''; ?></td>
2535 + <td class="collapsing center aligned"><?php echo MainWP_Common_Functions::instance()->is_ignored_updates( $plugin, $decodedIgnoredPlugins, 'plugin' ) ? '<span data-tooltip="Ignored plugins will not be automatically updated." data-inverted=""><i class="info red circle icon" ></i></span>' : ''; ?></td>
2350 2536 <td class="collapsing center aligned">
2351 2537 <?php if ( '' === $esc_note ) : ?>
2352 2538 <a href="javascript:void(0)" class="mainwp-edit-plugin-note" ><i class="sticky note outline icon"></i></a>
2353 2539 <?php else : ?>
2354 - <a href="javascript:void(0)" class="mainwp-edit-plugin-note" data-tooltip="<?php echo substr( $strip_note, 0, 100 ); //phpcs:ignore -- escaped. ?>" data-position="left center" data-inverted=""><i class="sticky green note icon"></i></a>
2540 + <a href="javascript:void(0)" class="mainwp-edit-plugin-note" data-tooltip="<?php echo substr( $strip_note, 0, 100 ); //phpcs:ignore -- escaped. ?>" data-position="center left" data-inverted=""><i class="sticky green note icon"></i></a>
2355 2541 <?php endif; ?>
2356 2542 <span style="display: none" class="esc-content-note"><?php echo $esc_note; //phpcs:ignore -- escaped. ?></span>
2357 2543 </td>
2358 2544 </tr>
@@ -2358,20 +2544,8 @@
2358 2544 </tr>
2359 2545 <?php // phpcs:enable ?>
2360 2546 <?php endforeach; ?>
2361 2547 </tbody>
2362 - <tfoot>
2363 - <tr>
2364 - <th scope="col" class="no-sort check-column"><span class="ui checkbox"><input id="cb-select-all-bottom" type="checkbox" /></span></th>
2365 - <th scope="col" ></th>
2366 - <th scope="col" ><?php esc_html_e( 'Plugin', 'mainwp' ); ?></th>
2367 - <th scope="col" ><?php esc_html_e( 'Status', 'mainwp' ); ?></th>
2368 - <th scope="col" ><?php esc_html_e( 'Trust Status', 'mainwp' ); ?></th>
2369 - <th scope="col" ><?php esc_html_e( 'Ignored Status', 'mainwp' ); ?></th>
2370 - <th scope="col" class="collapsing"></th>
2371 - <th scope="col" ><?php esc_html_e( 'Notes', 'mainwp' ); ?></th>
2372 - </tr>
2373 - </tfoot>
2374 2548 </table>
2375 2549 <?php
2376 2550 /**
2377 2551 * Action: mainwp_plugins_after_auto_updates_table
@@ -2460,13 +2634,16 @@
2460 2634 }
2461 2635
2462 2636 static::render_header( 'Ignore' );
2463 2637 ?>
2464 - <div id="mainwp-ignored-plugins" class="ui segment">
2638 + <div id="mainwp-ignored-plugins" class="ui padded segment">
2465 2639 <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-ignored-plugins-info-message' ) ) : ?>
2466 2640 <div class="ui info message">
2467 2641 <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-ignored-plugins-info-message"></i>
2468 - <?php printf( esc_html__( 'Manage plugins you have told your MainWP Dashboard to ignore updates on global or per site level. For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://kb.mainwp.com/docs/ignore-plugin-updates/" target="_blank">', '</a> <i class="external alternate icon"></i>' ); ?>
2642 + <?php
2643 + // translators: 1: Opening anchor tag. 2: Closing anchor tag.
2644 + printf( esc_html__( 'Manage plugins you have told your MainWP Dashboard to ignore updates on global or per site level. For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://docs.mainwp.com/sites/updates/manage-updates#ignore-plugin-updates" target="_blank">', '</a> <i class="external alternate icon"></i>' );
2645 + ?>
2469 2646 </div>
2470 2647 <?php endif; ?>
2471 2648 <?php
2472 2649 /**
@@ -2471,14 +2648,15 @@
2471 2648 <?php
2472 2649 /**
2473 2650 * Action: mainwp_plugins_before_ignored_updates
2474 2651 *
2475 - * Fires on the top of the Ignored Plugins Updates page.
2652 + * Fires on the top of the Ignored Plugin Updates page.
2476 2653 *
2477 2654 * @since 4.1
2478 2655 */
2479 2656 do_action( 'mainwp_plugins_before_ignored_updates', $ignoredPlugins, $websites );
2480 2657 ?>
2658 + <?php if ( ! empty( $ignoredPlugins ) ) : ?>
2481 2659 <h3 class="ui header">
2482 2660 <?php esc_html_e( 'Globally Ignored Plugins', 'mainwp' ); ?>
2483 2661 <div class="sub header"><?php esc_html_e( 'These are plugins you have told your MainWP Dashboard to ignore updates on global level and not notify you about pending updates.', 'mainwp' ); ?></div>
2484 2662 </h3>
@@ -2483,18 +2661,24 @@
2483 2661 <div class="sub header"><?php esc_html_e( 'These are plugins you have told your MainWP Dashboard to ignore updates on global level and not notify you about pending updates.', 'mainwp' ); ?></div>
2484 2662 </h3>
2485 2663 <?php static::render_global_ignored( $ignoredPlugins, $decodedIgnoredPlugins ); ?>
2486 2664 <div class="ui hidden divider"></div>
2665 + <?php endif; ?>
2666 + <?php if ( $cnt > 0 ) : ?>
2487 2667 <h3 class="ui header">
2488 - <?php esc_html_e( 'Per Site Ignored Plugins' ); ?>
2668 + <?php esc_html_e( 'Per Site Ignored Plugins', 'mainwp' ); ?>
2489 2669 <div class="sub header"><?php esc_html_e( 'These are plugins you have told your MainWP Dashboard to ignore updates per site level and not notify you about pending updates.', 'mainwp' ); ?></div>
2490 2670 </h3>
2491 2671 <?php static::render_sites_ignored( $cnt, $websites ); ?>
2672 + <?php endif; ?>
2673 + <?php if ( empty( $ignoredPlugins ) && 0 === $cnt ) : ?>
2674 + <?php MainWP_UI::render_empty_page_placeholder( __( 'No Ignored Updates', 'mainwp' ), __( 'All plugin updates are being tracked. When you choose to ignore updates for a specific plugin, they will appear here.', 'mainwp' ), '<em data-emoji=":compass:" class="big"></em>' ); ?>
2675 + <?php endif; ?>
2492 2676 <?php
2493 2677 /**
2494 2678 * Action: mainwp_plugins_after_ignored_updates
2495 2679 *
2496 - * Fires on the bottom of the Ignored Plugins Updates page.
2680 + * Fires on the bottom of the Ignored Plugin Updates page.
2497 2681 *
2498 2682 * @since 4.1
2499 2683 */
2500 2684 do_action( 'mainwp_plugins_after_ignored_updates', $ignoredPlugins, $websites );
@@ -2505,13 +2689,22 @@
2505 2689 static::render_footer( 'Ignore' );
2506 2690 }
2507 2691
2508 2692 /**
2693 + * Method render_abandoned_plugins()
2694 + *
2695 + * Render abandoned plugins list.
2696 + */
2697 + public static function render_abandoned_plugins() {
2698 + MainWP_Updates::render( 'abandoned_plugins' );
2699 + }
2700 +
2701 + /**
2509 2702 * Method render_global_ignored()
2510 2703 *
2511 2704 * Render Global Ignored plugins list.
2512 2705 *
2513 - * @param array $ignoredPlugins Ignored plugins array.
2706 + * @param bool $ignoredPlugins Ignored plugins array.
2514 2707 * @param array $decodedIgnoredPlugins Decoded ignored plugins array.
2515 2708 */
2516 2709 public static function render_global_ignored( $ignoredPlugins, $decodedIgnoredPlugins ) { //phpcs:ignore -- NOSONAR - complex.
2517 2710 ?>
@@ -2550,9 +2743,9 @@
2550 2743 <td><a href="<?php echo esc_url( admin_url() ) . 'plugin-install.php?tab=plugin-information&plugin=' . esc_html( rawurlencode( dirname( $ignoredPlugin ) ) ); ?>" target="_blank" class="open-plugin-details-modal"><?php echo esc_html( $ignore_name ); ?></a></td>
2551 2744 <td><?php echo esc_html( $ignoredPlugin ); ?></td>
2552 2745 <td><?php echo 'all_versions' === $ignored_ver ? esc_html__( 'All', 'mainwp' ) : esc_html( $ignored_ver ); ?></td>
2553 2746 <td class="right aligned">
2554 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2747 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2555 2748 <a href="#" class="ui mini button" onClick="return updatesoverview_plugins_unignore_globally( '<?php echo esc_html( rawurlencode( $ignoredPlugin ) ); ?>', '<?php echo esc_js( rawurlencode( $ignored_ver ) ); ?>' )"><?php esc_html_e( 'Unignore', 'mainwp' ); ?></a>
2556 2749 <?php endif; ?>
2557 2750 </td>
2558 2751 </tr>
@@ -2560,9 +2753,9 @@
2560 2753 <?php endforeach; ?>
2561 2754 <?php // phpcs:enable ?>
2562 2755 <?php endif; ?>
2563 2756 </tbody>
2564 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2757 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2565 2758 <?php if ( $ignoredPlugins ) : ?>
2566 2759 <tfoot class="full-width">
2567 2760 <tr>
2568 2761 <th scope="col" colspan="5">
@@ -2612,9 +2805,9 @@
2612 2805 <table id="mainwp-per-site-ignored-plugins" class="ui unstackable compact selectable table ">
2613 2806 <thead>
2614 2807 <tr>
2615 2808 <th scope="col" ><?php esc_html_e( 'Site', 'mainwp' ); ?></th>
2616 - <th scope="col" class="no-sort"><?php esc_html_e( '', 'mainwp' ); ?></th>
2809 + <th scope="col" class="no-sort"></th>
2617 2810 <th scope="col" ><?php esc_html_e( 'Plugin', 'mainwp' ); ?></th>
2618 2811 <th scope="col" ><?php esc_html_e( 'Plugin slug', 'mainwp' ); ?></th>
2619 2812 <th scope="col" ><?php esc_html_e( 'Ignored version', 'mainwp' ); ?></th>
2620 2813 <th scope="col" ></th>
@@ -2662,9 +2855,9 @@
2662 2855 <td class="collapsing"><?php echo MainWP_System_Utility::get_plugin_icon( $plugin_directory ); ?></td>
2663 2856 <td><a href="<?php echo esc_url( admin_url() ) . 'plugin-install.php?tab=plugin-information&wpplugin=' . intval( $website->id ) . '&plugin=' . esc_html( rawurlencode( $plugin_directory ) ); ?>" target="_blank" class="open-plugin-details-modal"><?php echo esc_html( $ignore_name ); ?></a></td>
2664 2857 <td><?php echo esc_html( rawurldecode( $ignoredPlugin ) ); ?></td>
2665 2858 <td><?php echo 'all_versions' === $ignored_ver ? esc_html__( 'All', 'mainwp' ) : esc_html( $ignored_ver ); ?></td>
2666 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2859 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2667 2860 <td class="right aligned"><a href="#" class="ui mini button" onClick="return updatesoverview_plugins_unignore_detail( '<?php echo esc_js( rawurlencode( $ignoredPlugin ) ); ?>', <?php echo intval( $website->id ); ?>, '<?php echo esc_js( rawurlencode( $ignored_ver ) ); ?>' )"> <?php esc_html_e( 'Unignore', 'mainwp' ); ?></a></td>
2668 2861 <?php endif; ?>
2669 2862 <?php } ?>
2670 2863 </tr>
@@ -2676,9 +2869,9 @@
2676 2869 MainWP_DB::free_result( $websites );
2677 2870 ?>
2678 2871 <?php endif; ?>
2679 2872 </tbody>
2680 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2873 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2681 2874 <?php if ( 0 < $cnt ) : ?>
2682 2875 <tfoot class="full-width">
2683 2876 <tr>
2684 2877 <th scope="col" colspan="6">
@@ -2737,13 +2930,16 @@
2737 2930 }
2738 2931
2739 2932 static::render_header( 'IgnoreAbandoned' );
2740 2933 ?>
2741 - <div id="mainwp-ignored-abandoned-plugins" class="ui segment">
2934 + <div id="mainwp-ignored-abandoned-plugins" class="ui padded segment">
2742 2935 <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-ignored-abandoned-plugins-info-message' ) ) : ?>
2743 2936 <div class="ui info message">
2744 2937 <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-ignored-abandoned-plugins-info-message"></i>
2745 - <?php printf( esc_html__( 'Manage abandoned plugins you have told your MainWP Dashboard to ignore on global or per site level. For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://kb.mainwp.com/docs/abandoned-plugins/" target="_blank">', '</a> <i class="external alternate icon"></i> ' ); ?>
2938 + <?php
2939 + // translators: 1: Opening anchor tag. 2: Closing anchor tag.
2940 + printf( esc_html__( 'Manage abandoned plugins you have told your MainWP Dashboard to ignore on global or per site level. For additional help, please check this %1$shelp documentation%2$s.', 'mainwp' ), '<a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp" target="_blank">', '</a> <i class="external alternate icon"></i> ' );
2941 + ?>
2746 2942 </div>
2747 2943 <?php endif; ?>
2748 2944 <?php
2749 2945 /**
@@ -2754,19 +2950,26 @@
2754 2950 * @since 4.1
2755 2951 */
2756 2952 do_action( 'mainwp_plugins_before_ignored_abandoned', $ignoredPlugins, $websites );
2757 2953 ?>
2954 + <?php if ( ! empty( $ignoredPlugins ) ) : ?>
2758 2955 <h3 class="ui header">
2759 - <?php esc_html_e( 'Globally Ignored Abandoned Plugins' ); ?>
2956 + <?php esc_html_e( 'Globally Ignored Abandoned Plugins', 'mainwp' ); ?>
2760 2957 <div class="sub header"><?php esc_html_e( 'These are plugins you have told your MainWP Dashboard to ignore on global level even though they have passed your Abandoned Plugin Tolerance date', 'mainwp' ); ?></div>
2761 2958 </h3>
2762 2959 <?php static::render_global_ignored_abandoned( $ignoredPlugins, $decodedIgnoredPlugins ); ?>
2763 2960 <div class="ui hidden divider"></div>
2961 + <?php endif; ?>
2962 + <?php if ( $cnt > 0 ) : ?>
2764 2963 <h3 class="ui header">
2765 - <?php esc_html_e( 'Per Site Ignored Abandoned Plugins' ); ?>
2964 + <?php esc_html_e( 'Per Site Ignored Abandoned Plugins', 'mainwp' ); ?>
2766 2965 <div class="sub header"><?php esc_html_e( 'These are plugins you have told your MainWP Dashboard to ignore per site level even though they have passed your Abandoned Plugin Tolerance date', 'mainwp' ); ?></div>
2767 2966 </h3>
2768 2967 <?php static::render_sites_ignored_abandoned( $cnt, $websites ); ?>
2968 + <?php endif; ?>
2969 + <?php if ( empty( $ignoredPlugins ) && 0 === $cnt ) : ?>
2970 + <?php MainWP_UI::render_empty_page_placeholder( __( 'No Ignored Abandoned Plugins', 'mainwp' ), __( 'All plugins are being monitored for abandonment. When you choose to ignore the abandoned status for a specific plugin, it will appear here.', 'mainwp' ), '<em data-emoji=":compass:" class="big"></em>' ); ?>
2971 + <?php endif; ?>
2769 2972 <?php
2770 2973 /**
2771 2974 * Action: mainwp_plugins_after_ignored_abandoned
2772 2975 *
@@ -2793,9 +2996,9 @@
2793 2996 ?>
2794 2997 <table id="mainwp-globally-ignored-abandoned-plugins" class="ui compact selectable table unstackable">
2795 2998 <thead>
2796 2999 <tr>
2797 - <th scope="col" class="no-sort"><?php esc_html_e( ' ', 'mainwp' ); ?></th>
3000 + <th scope="col" class="no-sort">&nbsp;</th>
2798 3001 <th scope="col" ><?php esc_html_e( 'Plugin', 'mainwp' ); ?></th>
2799 3002 <th scope="col" ><?php esc_html_e( 'Plugin slug', 'mainwp' ); ?></th>
2800 3003 <th scope="col" ></th>
2801 3004 </tr>
@@ -2818,9 +3021,9 @@
2818 3021 <td class="collapsing"><?php echo MainWP_System_Utility::get_plugin_icon( $plugin_directory ); ?></td>
2819 3022 <td><a href="<?php echo esc_url( admin_url() ) . 'plugin-install.php?tab=plugin-information&plugin=' . esc_html( rawurlencode( $plugin_directory ) ); ?>" target="_blank" class="open-plugin-details-modal"><?php echo esc_html( $ignore_name ); ?></a></td>
2820 3023 <td><?php echo esc_html( $ignoredPlugin ); ?></td>
2821 3024 <td class="right aligned">
2822 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
3025 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2823 3026 <a href="#" class="ui mini button" onClick="return updatesoverview_plugins_abandoned_unignore_globally( '<?php echo esc_html( rawurlencode( $ignoredPlugin ) ); ?>' )"><?php esc_html_e( 'Unignore', 'mainwp' ); ?></a>
2824 3027 <?php endif; ?>
2825 3028 </td>
2826 3029 </tr>
@@ -2827,9 +3030,9 @@
2827 3030 <?php endforeach; ?>
2828 3031 <?php // phpcs:enable ?>
2829 3032 <?php endif; ?>
2830 3033 </tbody>
2831 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
3034 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2832 3035 <?php if ( $ignoredPlugins ) : ?>
2833 3036 <tfoot class="full-width">
2834 3037 <tr>
2835 3038 <th scope="col" colspan="4">
@@ -2879,9 +3082,9 @@
2879 3082 <table id="mainwp-per-site-ignored-abandoned-plugins" class="ui compact selectable table unstackable">
2880 3083 <thead>
2881 3084 <tr>
2882 3085 <th scope="col" ><?php esc_html_e( 'Site', 'mainwp' ); ?></th>
2883 - <th scope="col" class="no-sort"><?php esc_html_e( ' ', 'mainwp' ); ?></th>
3086 + <th scope="col" class="no-sort">&nbsp;</th>
2884 3087 <th scope="col" ><?php esc_html_e( 'Plugin', 'mainwp' ); ?></th>
2885 3088 <th scope="col" ><?php esc_html_e( 'Plugin slug', 'mainwp' ); ?></th>
2886 3089 <th scope="col" ></th>
2887 3090 </tr>
@@ -2931,9 +3134,9 @@
2931 3134 MainWP_DB::free_result( $websites );
2932 3135 ?>
2933 3136 <?php endif; ?>
2934 3137 </tbody>
2935 - <?php if ( mainwp_current_user_have_right( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
3138 + <?php if ( \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' ) ) : ?>
2936 3139 <?php if ( 0 < $cnt ) : ?>
2937 3140 <tfoot class="full-width">
2938 3141 <tr>
2939 3142 <th scope="col" colspan="5">
@@ -2976,14 +3179,13 @@
2976 3179 if ( isset( $_GET['page'] ) && ( 'PluginsManage' === $_GET['page'] || 'PluginsInstall' === $_GET['page'] || 'PluginsAutoUpdate' === $_GET['page'] || 'PluginsIgnore' === $_GET['page'] || 'PluginsIgnoredAbandoned' === $_GET['page'] ) ) {
2977 3180 ?>
2978 3181 <p><?php esc_html_e( 'If you need help with managing plugins, please review following help documents', 'mainwp' ); ?></p>
2979 3182 <div class="ui list">
2980 - <div class="item"><i class="external alternate icon"></i> <a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/" target="_blank">Managing Plugins with MainWP</a></div>
2981 - <div class="item"><i class="external alternate icon"></i> <a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/#install-plugins" target="_blank">Install Plugins</a></div>
2982 - <div class="item"><i class="external alternate icon"></i> <a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/#activate-plugins" target="_blank">Activate Plugins</a></div>
2983 - <div class="item"><i class="external alternate icon"></i> <a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/#delete-plugins" target="_blank">Delete Plugins</a></div>
2984 - <div class="item"><i class="external alternate icon"></i> <a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/#update-plugins" target="_blank">Update Plugins</a></div>
2985 - <div class="item"><i class="external alternate icon"></i> <a href="https://kb.mainwp.com/docs/managing-plugins-with-mainwp/#plugins-auto-updates" target="_blank">Plugins Auto Updates</a></div>
3183 + <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp" target="_blank">Managing Plugins with MainWP</a></div>
3184 + <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp#install-plugins" target="_blank">Install Plugins</a></div>
3185 + <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp#activate-plugins" target="_blank">Activate Plugins</a></div>
3186 + <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp#delete-plugins" target="_blank">Delete Plugins</a></div>
3187 + <div class="item"><i class="external alternate icon"></i> <a href="https://docs.mainwp.com/sites/plugins/managing-plugins-with-mainwp#update-plugins" target="_blank">Update Plugins</a></div>
2986 3188 <?php
2987 3189 /**
2988 3190 * Action: mainwp_plugins_help_item
2989 3191 *