2010-10-24 22:57:43 -04:00
< ? php
/**
2010-10-25 00:04:18 -04:00
* Plugin Installer List Table class .
2010-10-24 22:57:43 -04:00
*
* @ package WordPress
2010-10-25 00:04:18 -04:00
* @ subpackage List_Table
* @ since 3.1 . 0
2011-01-16 16:47:24 -05:00
* @ access private
2010-10-24 22:57:43 -04:00
*/
2010-11-04 04:07:03 -04:00
class WP_Plugin_Install_List_Table extends WP_List_Table {
2010-10-24 22:57:43 -04:00
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
public function ajax_user_can () {
2010-12-16 04:18:28 -05:00
return current_user_can ( 'install_plugins' );
2010-10-24 22:57:43 -04:00
}
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
public function prepare_items () {
2010-10-24 22:57:43 -04:00
include ( ABSPATH . 'wp-admin/includes/plugin-install.php' );
global $tabs , $tab , $paged , $type , $term ;
wp_reset_vars ( array ( 'tab' ) );
$paged = $this -> get_pagenum ();
$per_page = 30 ;
// These are the tabs which are shown on the page
$tabs = array ();
$tabs [ 'dashboard' ] = __ ( 'Search' );
if ( 'search' == $tab )
$tabs [ 'search' ] = __ ( 'Search Results' );
2012-09-26 20:47:01 -04:00
$tabs [ 'upload' ] = __ ( 'Upload' );
$tabs [ 'featured' ] = _x ( 'Featured' , 'Plugin Installer' );
$tabs [ 'popular' ] = _x ( 'Popular' , 'Plugin Installer' );
$tabs [ 'new' ] = _x ( 'Newest' , 'Plugin Installer' );
$tabs [ 'favorites' ] = _x ( 'Favorites' , 'Plugin Installer' );
2014-06-12 14:09:13 -04:00
if ( $tab === 'beta' || false !== strpos ( $GLOBALS [ 'wp_version' ], '-' ) ) {
$tabs [ 'beta' ] = _x ( 'Beta Testing' , 'Plugin Installer' );
}
2010-10-24 22:57:43 -04:00
$nonmenu_tabs = array ( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
2013-09-25 22:48:09 -04:00
/**
* Filter the tabs shown on the Plugin Install screen .
*
* @ 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' .
*/
2010-10-24 22:57:43 -04:00
$tabs = apply_filters ( 'install_plugins_tabs' , $tabs );
2013-09-25 22:48:09 -04:00
/**
* Filter tabs not associated with a menu item on the Plugin Install screen .
*
* @ since 2.7 . 0
*
* @ param array $nonmenu_tabs The tabs that don ' t have a Menu item on the Plugin Install screen .
*/
2010-10-24 22:57:43 -04:00
$nonmenu_tabs = apply_filters ( 'install_plugins_nonmenu_tabs' , $nonmenu_tabs );
2012-12-20 10:55:32 -05:00
// If a non-valid menu tab has been selected, And it's not a non-menu action.
2010-10-24 22:57:43 -04:00
if ( empty ( $tab ) || ( ! isset ( $tabs [ $tab ] ) && ! in_array ( $tab , ( array ) $nonmenu_tabs ) ) )
$tab = key ( $tabs );
2014-07-09 16:02:14 -04:00
$args = array ( 'page' => $paged , 'per_page' => $per_page , 'fields' => array ( 'last_updated' => true , 'downloaded' => true ) );
2010-10-24 22:57:43 -04:00
switch ( $tab ) {
case 'search' :
2013-03-01 12:00:25 -05:00
$type = isset ( $_REQUEST [ 'type' ] ) ? wp_unslash ( $_REQUEST [ 'type' ] ) : 'term' ;
$term = isset ( $_REQUEST [ 's' ] ) ? wp_unslash ( $_REQUEST [ 's' ] ) : '' ;
2010-10-24 22:57:43 -04:00
switch ( $type ) {
case 'tag' :
$args [ 'tag' ] = sanitize_title_with_dashes ( $term );
break ;
case 'term' :
$args [ 'search' ] = $term ;
break ;
case 'author' :
$args [ 'author' ] = $term ;
break ;
}
2012-04-25 15:37:19 -04:00
add_action ( 'install_plugins_table_header' , 'install_search_form' , 10 , 0 );
2010-10-24 22:57:43 -04:00
break ;
case 'featured' :
case 'popular' :
case 'new' :
2014-06-12 14:09:13 -04:00
case 'beta' :
2010-10-24 22:57:43 -04:00
$args [ 'browse' ] = $tab ;
break ;
2012-09-26 20:47:01 -04:00
case 'favorites' :
2013-03-01 12:00:25 -05:00
$user = isset ( $_GET [ 'user' ] ) ? wp_unslash ( $_GET [ 'user' ] ) : get_user_option ( 'wporg_favorites' );
2012-09-26 20:47:01 -04:00
update_user_meta ( get_current_user_id (), 'wporg_favorites' , $user );
if ( $user )
$args [ 'user' ] = $user ;
else
$args = false ;
add_action ( 'install_plugins_favorites' , 'install_plugins_favorites_form' , 9 , 0 );
break ;
2010-10-24 22:57:43 -04:00
default :
$args = false ;
2013-08-21 02:52:12 -04:00
break ;
2010-10-24 22:57:43 -04:00
}
2013-09-25 22:48:09 -04:00
/**
* 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' .
*
* @ since 3.7 . 0
*
* @ param array | bool $args Plugin Install API arguments .
*/
$args = apply_filters ( " install_plugins_table_api_args_ $tab " , $args );
2013-08-21 02:52:12 -04:00
2010-10-24 22:57:43 -04:00
if ( ! $args )
return ;
$api = plugins_api ( 'query_plugins' , $args );
if ( is_wp_error ( $api ) )
wp_die ( $api -> get_error_message () . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __ ( 'Try again' ) . '</a>' );
$this -> items = $api -> plugins ;
$this -> set_pagination_args ( array (
'total_items' => $api -> info [ 'results' ],
2014-02-21 13:30:14 -05:00
'per_page' => $args [ 'per_page' ],
2010-10-24 22:57:43 -04:00
) );
}
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
public function no_items () {
2010-10-24 22:57:43 -04:00
_e ( 'No plugins match your request.' );
}
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
protected function get_views () {
2010-10-24 22:57:43 -04:00
global $tabs , $tab ;
$display_tabs = array ();
foreach ( ( array ) $tabs as $action => $text ) {
$class = ( $action == $tab ) ? ' class="current"' : '' ;
2010-11-19 20:38:21 -05:00
$href = self_admin_url ( 'plugin-install.php?tab=' . $action );
2010-12-03 13:51:24 -05:00
$display_tabs [ 'plugin-install-' . $action ] = " <a href=' $href ' $class > $text </a> " ;
2010-10-24 22:57:43 -04:00
}
return $display_tabs ;
}
2014-07-09 16:02:14 -04:00
/**
* Override the parent display () so we can provide a different container .
*/
public function display () {
$singular = $this -> _args [ 'singular' ];
$data_attr = '' ;
if ( $singular ) {
$data_attr = " data-wp-lists='list: $singular ' " ;
}
$this -> display_tablenav ( 'top' );
?>
< div class = " wp-list-table <?php echo implode( ' ', $this->get_table_classes () ); ?> " >
< div id = " the-list " < ? php echo $data_attr ; ?> >
< ? php $this -> display_rows_or_placeholder (); ?>
</ div >
</ div >
< ? php
$this -> display_tablenav ( 'bottom' );
}
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
protected function display_tablenav ( $which ) {
2010-10-24 22:57:43 -04:00
if ( 'top' == $which ) { ?>
2010-12-20 13:45:05 -05:00
< div class = " tablenav top " >
2010-10-24 22:57:43 -04:00
< div class = " alignleft actions " >
2013-09-25 22:48:09 -04:00
< ? php
/**
* Fires before the Plugin Install table header pagination is displayed .
*
* @ since 2.7 . 0
*/
do_action ( 'install_plugins_table_header' ); ?>
2010-10-24 22:57:43 -04:00
</ div >
< ? php $this -> pagination ( $which ); ?>
< br class = " clear " />
</ div >
< ? php } else { ?>
2010-12-20 13:45:05 -05:00
< div class = " tablenav bottom " >
2010-10-24 22:57:43 -04:00
< ? php $this -> pagination ( $which ); ?>
< br class = " clear " />
</ div >
< ? php
}
}
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
protected function get_table_classes () {
2014-05-13 01:17:14 -04:00
return array ( 'widefat' , $this -> _args [ 'plural' ] );
2010-10-24 22:57:43 -04:00
}
2014-07-11 23:27:14 -04:00
public function get_columns () {
2010-10-24 22:57:43 -04:00
return array (
2011-06-10 18:13:26 -04:00
'name' => _x ( 'Name' , 'plugin name' ),
2010-10-24 22:57:43 -04:00
'version' => __ ( 'Version' ),
'rating' => __ ( 'Rating' ),
'description' => __ ( 'Description' ),
);
}
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-18 21:17:15 -04:00
protected function display_rows () {
2010-10-24 22:57:43 -04:00
$plugins_allowedtags = array (
'a' => array ( 'href' => array (), 'title' => array (), 'target' => array () ),
'abbr' => array ( 'title' => array () ), 'acronym' => array ( 'title' => array () ),
'code' => array (), 'pre' => array (), 'em' => array (), 'strong' => array (),
'ul' => array (), 'ol' => array (), 'li' => array (), 'p' => array (), 'br' => array ()
);
2011-02-09 12:35:36 -05:00
2011-01-12 20:50:23 -05:00
list ( $columns , $hidden ) = $this -> get_column_info ();
$style = array ();
foreach ( $columns as $column_name => $column_display_name ) {
$style [ $column_name ] = in_array ( $column_name , $hidden ) ? 'style="display:none;"' : '' ;
}
2010-10-24 22:57:43 -04:00
foreach ( ( array ) $this -> items as $plugin ) {
if ( is_object ( $plugin ) )
$plugin = ( array ) $plugin ;
$title = wp_kses ( $plugin [ 'name' ], $plugins_allowedtags );
2014-07-09 16:02:14 -04:00
//Remove any HTML from the description.
$description = strip_tags ( $plugin [ 'short_description' ] );
2010-10-24 22:57:43 -04:00
$version = wp_kses ( $plugin [ 'version' ], $plugins_allowedtags );
$name = strip_tags ( $title . ' ' . $version );
$author = $plugin [ 'author' ];
2014-07-09 16:02:14 -04:00
if ( ! empty ( $author ) ) {
$author = ' <cite>' . sprintf ( __ ( 'By %s' ), $author ) . '</cite>' ;
}
2010-10-24 22:57:43 -04:00
$author = wp_kses ( $author , $plugins_allowedtags );
$action_links = array ();
if ( current_user_can ( 'install_plugins' ) || current_user_can ( 'update_plugins' ) ) {
$status = install_plugin_install_status ( $plugin );
switch ( $status [ 'status' ] ) {
case 'install' :
2014-07-09 16:02:14 -04:00
if ( $status [ 'url' ] ) {
$action_links [] = '<a class="install-now button" href="' . $status [ 'url' ] . '" title="' . esc_attr ( sprintf ( __ ( 'Install %s' ), $name ) ) . '">' . __ ( 'Install Now' ) . '</a>' ;
}
2010-10-24 22:57:43 -04:00
break ;
case 'update_available' :
2014-07-09 16:02:14 -04:00
if ( $status [ 'url' ] ) {
$action_links [] = '<a class="button" href="' . $status [ 'url' ] . '" title="' . esc_attr ( sprintf ( __ ( 'Update to version %s' ), $status [ 'version' ] ) ) . '">' . __ ( 'Update Now' ) . '</a>' ;
}
2010-10-24 22:57:43 -04:00
break ;
case 'latest_installed' :
case 'newer_installed' :
2014-07-09 16:02:14 -04:00
$action_links [] = '<span class="button button-disabled" title="' . esc_attr__ ( 'This plugin is already installed and is up to date' ) . ' ">' . _x ( 'Installed' , 'plugin' ) . '</span>' ;
2010-10-24 22:57:43 -04:00
break ;
}
}
2014-07-09 16:02:14 -04:00
$details_link = self_admin_url ( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin [ 'slug' ] .
'&TB_iframe=true&width=600&height=550' );
/**
* Filter the details link for a plugin .
*
* @ since 4.0
*
* @ param array $details_link Link to view the current plugin ' s details .
* @ param array $plugin The plugin currently being listed .
*/
$details_link = apply_filters ( 'plugin_install_details_link' , $details_link , $plugin );
$action_links [] = '<a href="' . esc_attr ( $details_link ) . '" class="thickbox" title="' .
esc_attr ( sprintf ( __ ( 'More information about %s' ), $name ) ) . '">' . __ ( 'More Details' ) . '</a>' ;
2013-09-25 22:48:09 -04:00
/**
* Filter the install action links for a plugin .
*
* @ since 2.7 . 0
*
* @ param array $action_links An array of plugin action hyperlinks . Defaults are links to Details and Install Now .
* @ param array $plugin The plugin currently being listed .
*/
2010-10-24 22:57:43 -04:00
$action_links = apply_filters ( 'plugin_install_action_links' , $action_links , $plugin );
?>
2014-07-09 16:02:14 -04:00
< div class = " plugin-card " >
< div class = " plugin-card-top " >
< div class = " name column-name " < ? php echo $style [ 'name' ]; ?> ><h4><a href="<?php echo esc_attr( $details_link ) ?>" class="thickbox"><?php echo $title; ?></a></h4>
< div class = " action-links " >
< ? php
if ( ! empty ( $action_links ) ) {
echo '<ul class="plugin-action-buttons"><li>' . implode ( '</li><li>' , $action_links ) . '</li>' ;
}
?>
</ div >
</ div >
< div class = " desc column-description " < ? php echo $style [ 'description' ]; ?> >
< p >< ? php echo $description ?>
< span class = " authors " >
< ? php echo $author ; ?>
</ span >
</ p >
</ div >
</ div >
< div class = " plugin-card-bottom " >
< div class = " vers column-rating " < ? php echo $style [ 'rating' ]; ?> >
< ? php wp_star_rating ( array ( 'rating' => $plugin [ 'rating' ], 'type' => 'percent' , 'number' => $plugin [ 'num_ratings' ] ) ); ?>
< span class = " num-ratings " > ( < ? php echo number_format_i18n ( $plugin [ 'num_ratings' ] ); ?> )</span>
</ div >
< div class = " column-updated " >< ? php echo __ ( '<strong>Last updated:</strong>' ) . ' ' . sprintf ( '%s ago' , human_time_diff ( strtotime ( $plugin [ 'last_updated' ]) ) ); ?> </div>
< div class = " column-downloaded " >< ? php echo sprintf ( __ ( '%s downloads' ), number_format_i18n ( $plugin [ 'downloaded' ] ) ); ?> </div>
< div class = " column-compatibility " >
< ? php
if ( ! empty ( $plugin [ 'tested' ] ) && version_compare ( substr ( $GLOBALS [ 'wp_version' ], 0 , strlen ( $plugin [ 'tested' ] ) ), $plugin [ 'tested' ], '>' ) ) {
echo __ ( '<strong>Untested</strong> with your install ' );
} elseif ( ! empty ( $plugin [ 'requires' ] ) && version_compare ( substr ( $GLOBALS [ 'wp_version' ], 0 , strlen ( $plugin [ 'requires' ] ) ), $plugin [ 'requires' ], '<' ) ) {
echo __ ( '<strong>Incompatible</strong> with your install ' );
} else {
echo __ ( '<strong>Compatible</strong> with your install ' );
}
?>
</ div >
</ div >
</ div >
2010-10-24 22:57:43 -04:00
< ? php
}
}
}