diff -r 490d5cc509ed -r cf61fcea0001 wp/wp-admin/includes/class-wp-plugin-install-list-table.php --- a/wp/wp-admin/includes/class-wp-plugin-install-list-table.php Tue Jun 09 11:14:17 2015 +0000 +++ b/wp/wp-admin/includes/class-wp-plugin-install-list-table.php Mon Oct 14 17:39:30 2019 +0200 @@ -1,11 +1,19 @@ no_update ) ) { + foreach ( $plugin_info->no_update as $plugin ) { + $plugin->upgrade = false; + $plugins[ $plugin->slug ] = $plugin; + } + } + + if ( isset( $plugin_info->response ) ) { + foreach ( $plugin_info->response as $plugin ) { + $plugin->upgrade = true; + $plugins[ $plugin->slug ] = $plugin; + } + } + + return $plugins; + } + + /** * Return a list of slugs of installed plugins, if known. * * Uses the transient data from the updates API to determine the slugs of @@ -27,27 +71,21 @@ * within get_plugins(). * * @since 4.0.0 - * @access protected + * + * @return array */ protected function get_installed_plugin_slugs() { - $slugs = array(); - - $plugin_info = get_site_transient( 'update_plugins' ); - if ( isset( $plugin_info->no_update ) ) { - foreach ( $plugin_info->no_update as $plugin ) { - $slugs[] = $plugin->slug; - } - } - - if ( isset( $plugin_info->response ) ) { - foreach ( $plugin_info->response as $plugin ) { - $slugs[] = $plugin->slug; - } - } - - return $slugs; + return array_keys( $this->get_installed_plugins() ); } + /** + * + * @global array $tabs + * @global string $tab + * @global int $paged + * @global string $type + * @global string $term + */ public function prepare_items() { include( ABSPATH . 'wp-admin/includes/plugin-install.php' ); @@ -62,15 +100,16 @@ // These are the tabs which are shown on the page $tabs = array(); - if ( 'search' == $tab ) - $tabs['search'] = __( 'Search Results' ); - $tabs['featured'] = _x( 'Featured', 'Plugin Installer' ); - $tabs['popular'] = _x( 'Popular', 'Plugin Installer' ); - $tabs['recommended'] = _x( 'Recommended', 'Plugin Installer' ); - $tabs['favorites'] = _x( 'Favorites', 'Plugin Installer' ); - if ( $tab === 'beta' || false !== strpos( $GLOBALS['wp_version'], '-' ) ) { - $tabs['beta'] = _x( 'Beta Testing', 'Plugin Installer' ); + if ( 'search' === $tab ) { + $tabs['search'] = __( 'Search Results' ); } + if ( $tab === 'beta' || false !== strpos( get_bloginfo( 'version' ), '-' ) ) { + $tabs['beta'] = _x( 'Beta Testing', 'Plugin Installer' ); + } + $tabs['featured'] = _x( 'Featured', 'Plugin Installer' ); + $tabs['popular'] = _x( 'Popular', 'Plugin Installer' ); + $tabs['recommended'] = _x( 'Recommended', 'Plugin Installer' ); + $tabs['favorites'] = _x( 'Favorites', 'Plugin Installer' ); if ( current_user_can( 'upload_plugins' ) ) { // No longer a real tab. Here for filter compatibility. // Gets skipped in get_views(). @@ -80,7 +119,7 @@ $nonmenu_tabs = array( 'plugin-information' ); // Valid actions to perform which do not have a Menu item. /** - * Filter the tabs shown on the Plugin Install screen. + * Filters the tabs shown on the Plugin Install screen. * * @since 2.7.0 * @@ -90,7 +129,7 @@ $tabs = apply_filters( 'install_plugins_tabs', $tabs ); /** - * Filter tabs not associated with a menu item on the Plugin Install screen. + * Filters tabs not associated with a menu item on the Plugin Install screen. * * @since 2.7.0 * @@ -102,6 +141,8 @@ if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) ) $tab = key( $tabs ); + $installed_plugins = $this->get_installed_plugins(); + $args = array( 'page' => $paged, 'per_page' => $per_page, @@ -111,8 +152,8 @@ 'active_installs' => true ), // Send the locale and installed plugin slugs to the API so it can provide context-sensitive results. - 'locale' => get_locale(), - 'installed_plugins' => $this->get_installed_plugin_slugs(), + 'locale' => get_user_locale(), + 'installed_plugins' => array_keys( $installed_plugins ), ); switch ( $tab ) { @@ -146,8 +187,13 @@ break; case 'favorites': - $user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' ); - update_user_meta( get_current_user_id(), 'wporg_favorites', $user ); + $action = 'save_wporg_username_' . get_current_user_id(); + if ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), $action ) ) { + $user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' ); + update_user_meta( get_current_user_id(), 'wporg_favorites', $user ); + } else { + $user = get_user_option( 'wporg_favorites' ); + } if ( $user ) $args['user'] = $user; else @@ -162,7 +208,7 @@ } /** - * Filter API request arguments for each Plugin Install screen tab. + * Filters API request arguments for each Plugin Install screen tab. * * The dynamic portion of the hook name, `$tab`, refers to the plugin install tabs. * Default tabs include 'featured', 'popular', 'recommended', 'favorites', and 'upload'. @@ -171,7 +217,7 @@ * * @param array|bool $args Plugin Install API arguments. */ - $args = apply_filters( "install_plugins_table_api_args_$tab", $args ); + $args = apply_filters( "install_plugins_table_api_args_{$tab}", $args ); if ( !$args ) return; @@ -197,25 +243,55 @@ if ( isset( $api->info['groups'] ) ) { $this->groups = $api->info['groups']; } + + if ( $installed_plugins ) { + $js_plugins = array_fill_keys( + array( 'all', 'search', 'active', 'inactive', 'recently_activated', 'mustuse', 'dropins' ), + array() + ); + + $js_plugins['all'] = array_values( wp_list_pluck( $installed_plugins, 'plugin' ) ); + $upgrade_plugins = wp_filter_object_list( $installed_plugins, array( 'upgrade' => true ), 'and', 'plugin' ); + + if ( $upgrade_plugins ) { + $js_plugins['upgrade'] = array_values( $upgrade_plugins ); + } + + wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( + 'plugins' => $js_plugins, + 'totals' => wp_get_update_data(), + ) ); + } } + /** + */ public function no_items() { - if ( isset( $this->error ) ) { - $message = $this->error->get_error_message() . '

' . __( 'Try again' ) . '

'; - } else { - $message = __( 'No plugins match your request.' ); + if ( isset( $this->error ) ) { ?> +

error->get_error_message(); ?>

+

+
+ +
+ ' . $message . ''; } + /** + * + * @global array $tabs + * @global string $tab + * + * @return array + */ protected function get_views() { global $tabs, $tab; $display_tabs = array(); foreach ( (array) $tabs as $action => $text ) { - $class = ( $action == $tab ) ? ' current' : ''; + $current_link_attributes = ( $action === $tab ) ? ' class="current" aria-current="page"' : ''; $href = self_admin_url('plugin-install.php?tab=' . $action); - $display_tabs['plugin-install-'.$action] = "$text"; + $display_tabs['plugin-install-'.$action] = "$text"; } // No longer a real tab. unset( $display_tabs['plugin-install-upload'] ); @@ -232,6 +308,7 @@ /** This filter is documented in wp-admin/inclues/class-wp-list-table.php */ $views = apply_filters( "views_{$this->screen->id}", $views ); + $this->screen->render_screen_reader_content( 'heading_views' ); ?>
- +
- +screen->render_screen_reader_content( 'heading_list' ); +?>
> display_rows_or_placeholder(); ?>
@@ -276,6 +355,8 @@ } /** + * @global string $tab + * * @param string $which */ protected function display_tablenav( $which ) { @@ -283,7 +364,7 @@ return; } - if ( 'top' == $which ) { + if ( 'top' === $which ) { wp_referer_field(); ?>
@@ -308,10 +389,16 @@ } } + /** + * @return array + */ protected function get_table_classes() { return array( 'widefat', $this->_args['plural'] ); } + /** + * @return array + */ public function get_columns() { return array(); } @@ -334,7 +421,7 @@ return 0; } - if ( 'DESC' == $this->order ) { + if ( 'DESC' === $this->order ) { return ( $a < $b ) ? 1 : -1; } else { return ( $a < $b ) ? -1 : 1; @@ -408,18 +495,45 @@ /* translators: 1: Plugin name and version. */ $action_links[] = '' . __( 'Install Now' ) . ''; } + break; - break; case 'update_available': if ( $status['url'] ) { /* translators: 1: Plugin name and version */ - $action_links[] = '' . __( 'Update Now' ) . ''; + $action_links[] = '' . __( 'Update Now' ) . ''; } + break; - break; case 'latest_installed': case 'newer_installed': - $action_links[] = '' . _x( 'Installed', 'plugin' ) . ''; + if ( is_plugin_active( $status['file'] ) ) { + $action_links[] = ''; + } elseif ( current_user_can( 'activate_plugin', $status['file'] ) ) { + $button_text = __( 'Activate' ); + /* translators: %s: Plugin name */ + $button_label = _x( 'Activate %s', 'plugin' ); + $activate_url = add_query_arg( array( + '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $status['file'] ), + 'action' => 'activate', + 'plugin' => $status['file'], + ), network_admin_url( 'plugins.php' ) ); + + if ( is_network_admin() ) { + $button_text = __( 'Network Activate' ); + /* translators: %s: Plugin name */ + $button_label = _x( 'Network Activate %s', 'plugin' ); + $activate_url = add_query_arg( array( 'networkwide' => 1 ), $activate_url ); + } + + $action_links[] = sprintf( + '%3$s', + esc_url( $activate_url ), + esc_attr( sprintf( $button_label, $plugin['name'] ) ), + $button_text + ); + } else { + $action_links[] = ''; + } break; } } @@ -428,7 +542,7 @@ '&TB_iframe=true&width=600&height=550' ); /* translators: 1: Plugin name and version. */ - $action_links[] = '' . __( 'More Details' ) . ''; + $action_links[] = '' . __( 'More Details' ) . ''; if ( !empty( $plugin['icons']['svg'] ) ) { $plugin_icon_url = $plugin['icons']['svg']; @@ -441,7 +555,7 @@ } /** - * Filter the install action links for a plugin. + * Filters the install action links for a plugin. * * @since 2.7.0 * @@ -450,14 +564,17 @@ */ $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); - $date_format = __( 'M j, Y @ H:i' ); $last_updated_timestamp = strtotime( $plugin['last_updated'] ); ?>
-
-

+

+ + + + +