2010-10-24 22:57:43 -04:00
< ? php
/**
2015-10-17 11:13:25 -04:00
* List Table API : WP_Plugin_Install_List_Table class
2010-10-24 22:57:43 -04:00
*
* @ package WordPress
2015-10-17 11:13:25 -04:00
* @ subpackage Administration
* @ since 3.1 . 0
*/
/**
* Core class used to implement displaying plugins to install in a list table .
*
2010-10-25 00:04:18 -04:00
* @ since 3.1 . 0
2011-01-16 16:47:24 -05:00
* @ access private
2015-10-17 11:13:25 -04:00
*
* @ see WP_List_Table
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
2015-01-08 00:44:23 -05:00
public $order = 'ASC' ;
public $orderby = null ;
public $groups = array ();
2014-07-18 15:35:14 -04:00
2015-01-12 11:19:22 -05:00
private $error ;
2015-05-29 16:17:26 -04:00
/**
*
* @ return bool
*/
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
}
2014-07-18 16:50:15 -04:00
/**
* Return a list of slugs of installed plugins , if known .
*
* Uses the transient data from the updates API to determine the slugs of
* known installed plugins . This might be better elsewhere , perhaps even
* within get_plugins () .
*
* @ since 4.0 . 0
2014-08-09 15:32:16 -04:00
* @ access protected
2015-05-29 16:17:26 -04:00
*
* @ return array
2014-07-18 16:50:15 -04:00
*/
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 ;
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global array $tabs
* @ global string $tab
* @ global int $paged
* @ global string $type
* @ global string $term
* @ global string $wp_version
*/
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 ();
2014-07-18 00:50:15 -04:00
2015-09-22 02:06:25 -04:00
if ( 'search' === $tab ) {
2010-10-24 22:57:43 -04:00
$tabs [ 'search' ] = __ ( 'Search Results' );
2015-09-22 02:06:25 -04:00
}
2012-09-26 20:47:01 -04:00
$tabs [ 'featured' ] = _x ( 'Featured' , 'Plugin Installer' );
$tabs [ 'popular' ] = _x ( 'Popular' , 'Plugin Installer' );
2014-12-07 18:40:24 -05:00
$tabs [ 'recommended' ] = _x ( 'Recommended' , 'Plugin Installer' );
2012-09-26 20:47:01 -04:00
$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' );
}
2014-08-26 21:32:18 -04:00
if ( current_user_can ( 'upload_plugins' ) ) {
// No longer a real tab. Here for filter compatibility.
2014-08-26 22:59:16 -04:00
// Gets skipped in get_views().
2014-08-26 21:32:18 -04:00
$tabs [ 'upload' ] = __ ( 'Upload Plugin' );
}
2010-10-24 22:57:43 -04:00
2014-08-26 21:32:18 -04:00
$nonmenu_tabs = array ( 'plugin-information' ); // Valid actions to perform which do not have a Menu item.
2010-10-24 22:57:43 -04:00
2013-09-25 22:48:09 -04:00
/**
* Filter the tabs shown on the Plugin Install screen .
*
* @ since 2.7 . 0
*
2015-01-19 03:44:22 -05:00
* @ param array $tabs The tabs shown on the Plugin Install screen . Defaults include 'featured' , 'popular' ,
* 'recommended' , 'favorites' , and 'upload' .
2013-09-25 22:48:09 -04:00
*/
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-18 16:50:15 -04:00
$args = array (
'page' => $paged ,
'per_page' => $per_page ,
2015-04-02 19:49:27 -04:00
'fields' => array (
'last_updated' => true ,
'icons' => true ,
'active_installs' => true
),
2014-07-18 16:50:15 -04:00
// 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 (),
);
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 ;
}
break ;
case 'featured' :
2014-07-18 15:35:14 -04:00
$args [ 'fields' ][ 'group' ] = true ;
$this -> orderby = 'group' ;
// No break!
2010-10-24 22:57:43 -04:00
case 'popular' :
case 'new' :
2014-06-12 14:09:13 -04:00
case 'beta' :
2014-12-07 18:40:24 -05:00
case 'recommended' :
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 .
*
2014-11-30 06:28:24 -05:00
* The dynamic portion of the hook name , `$tab` , refers to the plugin install tabs .
2015-01-19 03:44:22 -05:00
* Default tabs include 'featured' , 'popular' , 'recommended' , 'favorites' , and 'upload' .
2013-09-25 22:48:09 -04:00
*
* @ 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 );
2014-08-25 11:02:17 -04:00
if ( is_wp_error ( $api ) ) {
$this -> error = $api ;
return ;
}
2010-10-24 22:57:43 -04:00
$this -> items = $api -> plugins ;
2014-07-18 15:35:14 -04:00
if ( $this -> orderby ) {
2014-09-02 02:51:16 -04:00
uasort ( $this -> items , array ( $this , 'order_callback' ) );
2014-07-18 15:35:14 -04:00
}
2010-10-24 22:57:43 -04:00
$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
) );
2014-07-18 15:35:14 -04:00
2014-08-01 17:04:15 -04:00
if ( isset ( $api -> info [ 'groups' ] ) ) {
2014-07-18 15:35:14 -04:00
$this -> groups = $api -> info [ 'groups' ];
2014-08-01 17:04:15 -04:00
}
2010-10-24 22:57:43 -04:00
}
2015-05-29 17:32:24 -04:00
/**
* @ access public
*/
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 () {
2014-08-25 11:02:17 -04:00
if ( isset ( $this -> error ) ) {
$message = $this -> error -> get_error_message () . '<p class="hide-if-no-js"><a href="#" class="button" onclick="document.location.reload(); return false;">' . __ ( 'Try again' ) . '</a></p>' ;
} else {
$message = __ ( 'No plugins match your request.' );
}
2014-08-25 12:03:16 -04:00
echo '<div class="no-plugin-results">' . $message . '</div>' ;
2010-10-24 22:57:43 -04:00
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global array $tabs
* @ global string $tab
2015-05-29 16:17:26 -04:00
*
2015-05-28 17:41:30 -04:00
* @ return array
*/
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 ) {
2015-09-22 02:06:25 -04:00
$class = ( $action === $tab ) ? ' current' : '' ;
2010-11-19 20:38:21 -05:00
$href = self_admin_url ( 'plugin-install.php?tab=' . $action );
2014-07-18 00:50:15 -04:00
$display_tabs [ 'plugin-install-' . $action ] = " <a href=' $href ' class=' $class '> $text </a> " ;
2010-10-24 22:57:43 -04:00
}
2014-08-26 22:59:16 -04:00
// No longer a real tab.
unset ( $display_tabs [ 'plugin-install-upload' ] );
2010-10-24 22:57:43 -04:00
return $display_tabs ;
}
2014-07-18 00:50:15 -04:00
/**
* Override parent views so we can use the filter bar display .
*/
public function views () {
$views = $this -> get_views ();
/** This filter is documented in wp-admin/inclues/class-wp-list-table.php */
$views = apply_filters ( " views_ { $this -> screen -> id } " , $views );
2015-10-06 21:28:25 -04:00
$this -> screen -> render_screen_reader_content ( 'heading_views' );
2014-07-18 00:50:15 -04:00
?>
< div class = " wp-filter " >
2014-08-25 12:03:16 -04:00
< ul class = " filter-links " >
2014-07-18 00:50:15 -04:00
< ? php
if ( ! empty ( $views ) ) {
foreach ( $views as $class => $view ) {
$views [ $class ] = " \t <li class=' $class '> $view " ;
}
echo implode ( " </li> \n " , $views ) . " </li> \n " ;
}
?>
</ ul >
2014-08-25 12:03:16 -04:00
< ? php install_search_form ( isset ( $views [ 'plugin-install-search' ] ) ); ?>
2014-07-18 00:50:15 -04:00
</ div >
< ? php
}
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 () ); ?> " >
2015-10-06 21:28:25 -04:00
< ? php
$this -> screen -> render_screen_reader_content ( 'heading_list' );
?>
2014-07-09 16:02:14 -04:00
< div id = " the-list " < ? php echo $data_attr ; ?> >
< ? php $this -> display_rows_or_placeholder (); ?>
</ div >
</ div >
< ? php
$this -> display_tablenav ( 'bottom' );
}
2014-11-30 19:33:23 -05:00
/**
2015-05-28 17:41:30 -04:00
* @ global string $tab
*
2014-11-30 19:33:23 -05:00
* @ param string $which
*/
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 ) {
2014-08-26 22:53:16 -04:00
if ( $GLOBALS [ 'tab' ] === 'featured' ) {
return ;
}
2015-09-22 02:06:25 -04:00
if ( 'top' === $which ) {
2014-10-03 09:08:16 -04:00
wp_referer_field ();
?>
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
}
}
2015-05-29 16:17:26 -04:00
/**
* @ return array
*/
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
}
2015-05-29 17:32:24 -04:00
2015-05-29 16:17:26 -04:00
/**
* @ return array
*/
2014-07-11 23:27:14 -04:00
public function get_columns () {
2014-08-15 05:38:15 -04:00
return array ();
2010-10-24 22:57:43 -04:00
}
2014-11-30 19:33:23 -05:00
/**
* @ param object $plugin_a
* @ param object $plugin_b
* @ return int
*/
2014-09-02 02:51:16 -04:00
private function order_callback ( $plugin_a , $plugin_b ) {
2014-07-18 15:35:14 -04:00
$orderby = $this -> orderby ;
2014-08-01 17:04:15 -04:00
if ( ! isset ( $plugin_a -> $orderby , $plugin_b -> $orderby ) ) {
2014-07-18 15:35:14 -04:00
return 0 ;
2014-08-01 17:04:15 -04:00
}
2014-07-18 15:35:14 -04:00
$a = $plugin_a -> $orderby ;
$b = $plugin_b -> $orderby ;
2014-08-01 17:04:15 -04:00
if ( $a == $b ) {
2014-07-18 15:35:14 -04:00
return 0 ;
2014-08-01 17:04:15 -04:00
}
2014-07-18 15:35:14 -04:00
2015-09-22 02:06:25 -04:00
if ( 'DESC' === $this -> order ) {
2014-07-18 15:35:14 -04:00
return ( $a < $b ) ? 1 : - 1 ;
2014-08-01 17:04:15 -04:00
} else {
2014-07-18 15:35:14 -04:00
return ( $a < $b ) ? - 1 : 1 ;
2014-08-01 17:04:15 -04:00
}
2014-07-18 15:35:14 -04:00
}
2015-05-28 17:41:30 -04:00
/**
* @ global string $wp_version
*/
2014-07-13 18:09:16 -04:00
public 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
2014-08-12 22:31:18 -04:00
$plugins_group_titles = array (
'Performance' => _x ( 'Performance' , 'Plugin installer group title' ),
'Social' => _x ( 'Social' , 'Plugin installer group title' ),
'Tools' => _x ( 'Tools' , 'Plugin installer group title' ),
);
2014-07-18 15:35:14 -04:00
$group = null ;
2010-10-24 22:57:43 -04:00
foreach ( ( array ) $this -> items as $plugin ) {
2014-08-01 17:04:15 -04:00
if ( is_object ( $plugin ) ) {
2010-10-24 22:57:43 -04:00
$plugin = ( array ) $plugin ;
2014-08-01 17:04:15 -04:00
}
2010-10-24 22:57:43 -04:00
2014-07-18 15:35:14 -04:00
// Display the group heading if there is one
if ( isset ( $plugin [ 'group' ] ) && $plugin [ 'group' ] != $group ) {
2014-08-01 17:04:15 -04:00
if ( isset ( $this -> groups [ $plugin [ 'group' ] ] ) ) {
2014-08-12 22:31:18 -04:00
$group_name = $this -> groups [ $plugin [ 'group' ] ];
if ( isset ( $plugins_group_titles [ $group_name ] ) ) {
$group_name = $plugins_group_titles [ $group_name ];
}
2014-08-01 17:04:15 -04:00
} else {
2014-07-18 15:35:14 -04:00
$group_name = $plugin [ 'group' ];
2014-08-01 17:04:15 -04:00
}
2014-07-18 15:35:14 -04:00
// Starting a new group, close off the divs of the last one
if ( ! empty ( $group ) ) {
echo '</div></div>' ;
}
echo '<div class="plugin-group"><h3>' . esc_html ( $group_name ) . '</h3>' ;
// needs an extra wrapping div for nth-child selectors to work
echo '<div class="plugin-items">' ;
$group = $plugin [ 'group' ];
}
2010-10-24 22:57:43 -04:00
$title = wp_kses ( $plugin [ 'name' ], $plugins_allowedtags );
2014-07-09 16:02:14 -04:00
2014-08-01 16:44:14 -04:00
// Remove any HTML from the description.
2014-07-09 16:02:14 -04:00
$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 );
2014-08-01 17:04:15 -04:00
$author = wp_kses ( $plugin [ 'author' ], $plugins_allowedtags );
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
$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' ] ) {
2014-08-06 22:56:15 -04:00
/* translators: 1: Plugin name and version. */
2015-04-02 01:31:26 -04:00
$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>' ;
2014-07-09 16:02:14 -04:00
}
2010-10-24 22:57:43 -04:00
break ;
case 'update_available' :
2014-07-09 16:02:14 -04:00
if ( $status [ 'url' ] ) {
2014-08-06 22:56:15 -04:00
/* translators: 1: Plugin name and version */
2015-04-02 01:31:26 -04:00
$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>' ;
2014-07-09 16:02:14 -04:00
}
2010-10-24 22:57:43 -04:00
break ;
case 'latest_installed' :
case 'newer_installed' :
2015-12-15 17:33:28 -05:00
$action_links [] = '<span class="button button-disabled">' . _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' );
2014-08-06 22:56:15 -04:00
/* translators: 1: Plugin name and version. */
$action_links [] = '<a href="' . esc_url ( $details_link ) . '" class="thickbox" aria-label="' . esc_attr ( sprintf ( __ ( 'More information about %s' ), $name ) ) . '" data-title="' . esc_attr ( $name ) . '">' . __ ( 'More Details' ) . '</a>' ;
2014-07-16 18:50:14 -04:00
2014-08-21 15:11:17 -04:00
if ( ! empty ( $plugin [ 'icons' ][ 'svg' ] ) ) {
$plugin_icon_url = $plugin [ 'icons' ][ 'svg' ];
} elseif ( ! empty ( $plugin [ 'icons' ][ '2x' ] ) ) {
$plugin_icon_url = $plugin [ 'icons' ][ '2x' ];
} elseif ( ! empty ( $plugin [ 'icons' ][ '1x' ] ) ) {
$plugin_icon_url = $plugin [ 'icons' ][ '1x' ];
} else {
$plugin_icon_url = $plugin [ 'icons' ][ 'default' ];
}
2014-07-09 16:02:14 -04:00
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 );
2015-01-05 20:03:23 -05:00
2015-03-22 22:14:27 -04:00
$date_format = __ ( 'M j, Y @ H:i' );
2015-01-05 20:03:23 -05:00
$last_updated_timestamp = strtotime ( $plugin [ 'last_updated' ] );
2010-10-24 22:57:43 -04:00
?>
2015-02-04 23:19:23 -05:00
< div class = " plugin-card plugin-card-<?php echo sanitize_html_class( $plugin['slug'] ); ?> " >
2014-07-09 16:02:14 -04:00
< div class = " plugin-card-top " >
2014-09-02 15:47:16 -04:00
< div class = " name column-name " >
2015-10-10 11:17:26 -04:00
< h3 >
2015-10-02 00:16:27 -04:00
< a href = " <?php echo esc_url( $details_link ); ?> " class = " thickbox " >
< ? php echo $title ; ?>
< img src = " <?php echo esc_attr( $plugin_icon_url ) ?> " class = " plugin-icon " alt = " " >
</ a >
2015-10-10 11:17:26 -04:00
</ h3 >
2014-09-02 15:47:16 -04:00
</ div >
2014-08-21 15:11:17 -04:00
< div class = " action-links " >
< ? php
if ( $action_links ) {
echo '<ul class="plugin-action-buttons"><li>' . implode ( '</li><li>' , $action_links ) . '</li></ul>' ;
}
?>
</ div >
2014-08-15 05:38:15 -04:00
< div class = " desc column-description " >
< p >< ? php echo $description ; ?> </p>
2014-07-18 02:08:15 -04:00
< p class = " authors " >< ? php echo $author ; ?> </p>
2014-07-09 16:02:14 -04:00
</ div >
</ div >
< div class = " plugin-card-bottom " >
2014-08-15 05:38:15 -04:00
< div class = " vers column-rating " >
2014-07-09 16:02:14 -04:00
< ? 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 >
2014-07-18 02:08:15 -04:00
< div class = " column-updated " >
2015-12-15 17:33:28 -05:00
< strong >< ? php _e ( 'Last Updated:' ); ?> </strong> <?php printf( __( '%s ago' ), human_time_diff( $last_updated_timestamp ) ); ?>
2014-07-18 02:08:15 -04:00
</ div >
< div class = " column-downloaded " >
2015-04-02 19:49:27 -04:00
< ? 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 );
?>
2014-07-18 02:08:15 -04:00
</ div >
2014-07-09 16:02:14 -04:00
< div class = " column-compatibility " >
2014-07-18 02:08:15 -04:00
< ? php
2014-07-09 16:02:14 -04:00
if ( ! empty ( $plugin [ 'tested' ] ) && version_compare ( substr ( $GLOBALS [ 'wp_version' ], 0 , strlen ( $plugin [ 'tested' ] ) ), $plugin [ 'tested' ], '>' ) ) {
2014-09-28 16:26:17 -04:00
echo '<span class="compatibility-untested">' . __ ( 'Untested with your version of WordPress' ) . '</span>' ;
2014-07-09 16:02:14 -04:00
} elseif ( ! empty ( $plugin [ 'requires' ] ) && version_compare ( substr ( $GLOBALS [ 'wp_version' ], 0 , strlen ( $plugin [ 'requires' ] ) ), $plugin [ 'requires' ], '<' ) ) {
2014-08-24 13:26:15 -04:00
echo '<span class="compatibility-incompatible">' . __ ( '<strong>Incompatible</strong> with your version of WordPress' ) . '</span>' ;
2014-07-09 16:02:14 -04:00
} else {
2014-08-24 13:26:15 -04:00
echo '<span class="compatibility-compatible">' . __ ( '<strong>Compatible</strong> with your version of WordPress' ) . '</span>' ;
2014-07-09 16:02:14 -04:00
}
2014-07-18 02:08:15 -04:00
?>
2014-07-09 16:02:14 -04:00
</ div >
</ div >
</ div >
2010-10-24 22:57:43 -04:00
< ? php
}
2014-08-01 16:44:14 -04:00
// Close off the group divs of the last one
if ( ! empty ( $group ) ) {
echo '</div></div>' ;
}
2010-10-24 22:57:43 -04:00
}
}