*/
class WP_Plugin_Install_List_Table extends WP_List_Table {
- var $order = 'ASC';
- var $orderby = null;
- var $groups = array();
+ public $order = 'ASC';
+ public $orderby = null;
+ public $groups = array();
+
+ private $error;
public function ajax_user_can() {
return current_user_can('install_plugins');
$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' );
*
* @since 2.7.0
*
- * @param array $tabs The tabs shown on the Plugin Install screen. Defaults are 'dashboard', 'search',
- * 'upload', 'featured', 'popular', 'new', and 'favorites'.
+ * @param array $tabs The tabs shown on the Plugin Install screen. Defaults include 'featured', 'popular',
+ * 'recommended', 'favorites', and 'upload'.
*/
$tabs = apply_filters( 'install_plugins_tabs', $tabs );
$args = array(
'page' => $paged,
'per_page' => $per_page,
- 'fields' => array( 'last_updated' => true, 'downloaded' => true, 'icons' => true ),
+ 'fields' => array(
+ 'last_updated' => true,
+ 'icons' => true,
+ '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(),
case 'popular':
case 'new':
case 'beta':
+ case 'recommended':
$args['browse'] = $tab;
break;
/**
* Filter 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 are 'dashboard', 'search', 'upload', 'featured', 'popular', 'new',
- * and 'favorites'.
+ * The dynamic portion of the hook name, `$tab`, refers to the plugin install tabs.
+ * Default tabs include 'featured', 'popular', 'recommended', 'favorites', and 'upload'.
*
* @since 3.7.0
*
$this->display_tablenav( 'bottom' );
}
+ /**
+ * @param string $which
+ */
protected function display_tablenav( $which ) {
if ( $GLOBALS['tab'] === 'featured' ) {
return;
return array();
}
+ /**
+ * @param object $plugin_a
+ * @param object $plugin_b
+ * @return int
+ */
private function order_callback( $plugin_a, $plugin_b ) {
$orderby = $this->orderby;
if ( ! isset( $plugin_a->$orderby, $plugin_b->$orderby ) ) {
case 'install':
if ( $status['url'] ) {
/* translators: 1: Plugin name and version. */
- $action_links[] = '<a class="install-now button" href="' . $status['url'] . '" aria-label="' . esc_attr( sprintf( __( 'Install %s now' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';
+ $action_links[] = '<a class="install-now button" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $status['url'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Install %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '">' . __( 'Install Now' ) . '</a>';
}
break;
case 'update_available':
if ( $status['url'] ) {
/* translators: 1: Plugin name and version */
- $action_links[] = '<a class="button" href="' . $status['url'] . '" aria-label="' . esc_attr( sprintf( __( 'Update %s now' ), $name ) ) . '">' . __( 'Update Now' ) . '</a>';
+ $action_links[] = '<a class="update-now button" data-plugin="' . esc_attr( $status['file'] ) . '" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $status['url'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Update %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '">' . __( 'Update Now' ) . '</a>';
}
break;
* @param array $plugin The plugin currently being listed.
*/
$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'] );
?>
- <div class="plugin-card">
+ <div class="plugin-card plugin-card-<?php echo sanitize_html_class( $plugin['slug'] ); ?>">
<div class="plugin-card-top">
<a href="<?php echo esc_url( $details_link ); ?>" class="thickbox plugin-icon"><img src="<?php echo esc_attr( $plugin_icon_url ) ?>" /></a>
<div class="name column-name">
<span class="num-ratings">(<?php echo number_format_i18n( $plugin['num_ratings'] ); ?>)</span>
</div>
<div class="column-updated">
- <strong><?php _e( 'Last Updated:' ); ?></strong> <span title="<?php echo esc_attr( $plugin['last_updated'] ); ?>">
- <?php printf( __( '%s ago' ), human_time_diff( strtotime( $plugin['last_updated'] ) ) ); ?>
+ <strong><?php _e( 'Last Updated:' ); ?></strong> <span title="<?php echo esc_attr( date_i18n( $date_format, $last_updated_timestamp ) ); ?>">
+ <?php printf( __( '%s ago' ), human_time_diff( $last_updated_timestamp ) ); ?>
</span>
</div>
<div class="column-downloaded">
- <?php echo sprintf( _n( '%s download', '%s downloads', $plugin['downloaded'] ), number_format_i18n( $plugin['downloaded'] ) ); ?>
+ <?php
+ if ( $plugin['active_installs'] >= 1000000 ) {
+ $active_installs_text = _x( '1+ Million', 'Active plugin installs' );
+ } else {
+ $active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+';
+ }
+ printf( __( '%s Active Installs' ), $active_installs_text );
+ ?>
</div>
<div class="column-compatibility">
<?php
if ( ! empty( $plugin['tested'] ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin['tested'] ) ), $plugin['tested'], '>' ) ) {
- echo '<span class="compatibility-untested">' . __( '<strong>Untested</strong> with your version of WordPress' ) . '</span>';
+ echo '<span class="compatibility-untested">' . __( 'Untested with your version of WordPress' ) . '</span>';
} elseif ( ! empty( $plugin['requires'] ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin['requires'] ) ), $plugin['requires'], '<' ) ) {
echo '<span class="compatibility-incompatible">' . __( '<strong>Incompatible</strong> with your version of WordPress' ) . '</span>';
} else {