2010-10-24 22:57:43 -04:00
< ? php
/**
2015-10-17 11:13:25 -04:00
* List Table API : WP_Plugins_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 installed plugins 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_Plugins_List_Table extends WP_List_Table {
2010-10-24 22:57:43 -04:00
2014-08-09 22:18:17 -04:00
/**
* Constructor .
2014-09-04 11:23:16 -04:00
*
2014-08-09 22:18:17 -04:00
* @ since 3.1 . 0
2014-08-09 22:22:16 -04:00
* @ access public
2014-08-09 22:18:17 -04:00
*
* @ see WP_List_Table :: __construct () for more information on default arguments .
*
2015-05-28 17:41:30 -04:00
* @ global string $status
* @ global int $page
*
2014-08-09 22:18:17 -04:00
* @ param array $args An associative array of arguments .
2014-09-04 11:23:16 -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 __construct ( $args = array () ) {
2010-10-24 22:57:43 -04:00
global $status , $page ;
2012-09-19 08:43:31 -04:00
parent :: __construct ( array (
'plural' => 'plugins' ,
'screen' => isset ( $args [ 'screen' ] ) ? $args [ 'screen' ] : null ,
) );
2011-09-29 01:54:05 -04:00
$status = 'all' ;
2012-04-18 23:41:29 -04:00
if ( isset ( $_REQUEST [ 'plugin_status' ] ) && in_array ( $_REQUEST [ 'plugin_status' ], array ( 'active' , 'inactive' , 'recently_activated' , 'upgrade' , 'mustuse' , 'dropins' , 'search' ) ) )
2011-09-29 01:54:05 -04:00
$status = $_REQUEST [ 'plugin_status' ];
2011-06-01 12:03:41 -04:00
if ( isset ( $_REQUEST [ 's' ]) )
2013-03-01 12:00:25 -05:00
$_SERVER [ 'REQUEST_URI' ] = add_query_arg ( 's' , wp_unslash ( $_REQUEST [ 's' ]) );
2011-06-01 12:03:41 -04:00
2010-11-04 16:49:30 -04:00
$page = $this -> get_pagenum ();
2010-10-24 22:57:43 -04:00
}
2011-06-10 19:01:45 -04:00
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 () {
2011-02-14 22:43:47 -05:00
return array ( 'widefat' , $this -> _args [ 'plural' ] );
}
2010-10-24 22:57:43 -04:00
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 ( 'activate_plugins' );
2010-10-24 22:57:43 -04:00
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global string $status
2016-03-03 05:01:25 -05:00
* @ global array $plugins
2015-05-28 17:41:30 -04:00
* @ global array $totals
* @ global int $page
* @ global string $orderby
* @ global string $order
* @ global string $s
*/
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
global $status , $plugins , $totals , $page , $orderby , $order , $s ;
2016-01-14 15:06:25 -05:00
wp_reset_vars ( array ( 'orderby' , 'order' ) );
2010-10-24 22:57:43 -04:00
2014-03-02 15:48:14 -05:00
/**
2016-07-04 18:45:29 -04:00
* Filters the full array of plugins to list in the Plugins list table .
2014-03-02 15:48:14 -05:00
*
* @ since 3.0 . 0
*
* @ see get_plugins ()
*
2016-03-03 04:51:25 -05:00
* @ param array $all_plugins An array of plugins to display in the list table .
2014-03-02 15:48:14 -05:00
*/
2016-03-03 04:51:25 -05:00
$all_plugins = apply_filters ( 'all_plugins' , get_plugins () );
2010-10-24 22:57:43 -04:00
$plugins = array (
2016-03-03 04:51:25 -05:00
'all' => $all_plugins ,
'search' => array (),
'active' => array (),
'inactive' => array (),
2010-10-24 22:57:43 -04:00
'recently_activated' => array (),
2016-03-03 04:51:25 -05:00
'upgrade' => array (),
'mustuse' => array (),
'dropins' => array (),
2010-10-24 22:57:43 -04:00
);
2012-09-19 08:43:31 -04:00
$screen = $this -> screen ;
2010-11-08 10:43:44 -05:00
2013-03-08 22:52:27 -05:00
if ( ! is_multisite () || ( $screen -> in_admin ( 'network' ) && current_user_can ( 'manage_network_plugins' ) ) ) {
2014-03-02 15:48:14 -05:00
/**
2016-05-22 14:01:30 -04:00
* Filters whether to display the advanced plugins list table .
2014-03-02 15:48:14 -05:00
*
* There are two types of advanced plugins - must - use and drop - ins -
* which can be used in a single site or Multisite network .
*
* The $type parameter allows you to differentiate between the type of advanced
* plugins to filter the display of . Contexts include 'mustuse' and 'dropins' .
*
* @ since 3.0 . 0
*
* @ param bool $show Whether to show the advanced plugins for the specified
* plugin type . Default true .
* @ param string $type The plugin type . Accepts 'mustuse' , 'dropins' .
*/
if ( apply_filters ( 'show_advanced_plugins' , true , 'mustuse' ) ) {
2010-10-24 22:57:43 -04:00
$plugins [ 'mustuse' ] = get_mu_plugins ();
2014-03-02 15:48:14 -05:00
}
/** This action is documented in wp-admin/includes/class-wp-plugins-list-table.php */
2010-10-24 22:57:43 -04:00
if ( apply_filters ( 'show_advanced_plugins' , true , 'dropins' ) )
$plugins [ 'dropins' ] = get_dropins ();
2010-11-14 13:34:59 -05:00
2012-03-21 12:19:27 -04:00
if ( current_user_can ( 'update_plugins' ) ) {
$current = get_site_transient ( 'update_plugins' );
foreach ( ( array ) $plugins [ 'all' ] as $plugin_file => $plugin_data ) {
if ( isset ( $current -> response [ $plugin_file ] ) ) {
$plugins [ 'all' ][ $plugin_file ][ 'update' ] = true ;
$plugins [ 'upgrade' ][ $plugin_file ] = $plugins [ 'all' ][ $plugin_file ];
}
}
2010-11-14 13:34:59 -05:00
}
2010-10-24 22:57:43 -04:00
}
2015-10-13 18:12:25 -04:00
if ( ! $screen -> in_admin ( 'network' ) ) {
$show = current_user_can ( 'manage_network_plugins' );
/**
2016-05-22 14:01:30 -04:00
* Filters whether to display network - active plugins alongside plugins active for the current site .
2015-10-13 18:12:25 -04:00
*
* This also controls the display of inactive network - only plugins ( plugins with
* " Network: true " in the plugin header ) .
*
* Plugins cannot be network - activated or network - deactivated from this screen .
*
* @ since 4.4 . 0
*
* @ param bool $show Whether to show network - active plugins . Default is whether the current
* user can manage network plugins ( ie . a Super Admin ) .
*/
$show_network_active = apply_filters ( 'show_network_active_plugins' , $show );
}
2012-09-25 01:26:19 -04:00
set_transient ( 'plugin_slugs' , array_keys ( $plugins [ 'all' ] ), DAY_IN_SECONDS );
2010-10-24 22:57:43 -04:00
2015-09-25 15:16:27 -04:00
if ( $screen -> in_admin ( 'network' ) ) {
2015-10-07 13:11:25 -04:00
$recently_activated = get_site_option ( 'recently_activated' , array () );
2015-09-25 15:16:27 -04:00
} else {
2012-04-18 23:41:29 -04:00
$recently_activated = get_option ( 'recently_activated' , array () );
2015-09-25 15:16:27 -04:00
}
foreach ( $recently_activated as $key => $time ) {
if ( $time + WEEK_IN_SECONDS < time () ) {
unset ( $recently_activated [ $key ] );
}
}
2010-10-24 22:57:43 -04:00
2015-09-25 15:16:27 -04:00
if ( $screen -> in_admin ( 'network' ) ) {
2015-10-07 13:11:25 -04:00
update_site_option ( 'recently_activated' , $recently_activated );
2015-09-25 15:16:27 -04:00
} else {
2012-04-18 23:41:29 -04:00
update_option ( 'recently_activated' , $recently_activated );
}
2014-08-09 10:46:17 -04:00
2014-07-18 16:49:17 -04:00
$plugin_info = get_site_transient ( 'update_plugins' );
2010-10-24 22:57:43 -04:00
foreach ( ( array ) $plugins [ 'all' ] as $plugin_file => $plugin_data ) {
2014-07-18 16:49:17 -04:00
// Extra info if known. array_merge() ensures $plugin_data has precedence if keys collide.
if ( isset ( $plugin_info -> response [ $plugin_file ] ) ) {
$plugins [ 'all' ][ $plugin_file ] = $plugin_data = array_merge ( ( array ) $plugin_info -> response [ $plugin_file ], $plugin_data );
2015-03-24 13:33:27 -04:00
// Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade
if ( isset ( $plugins [ 'upgrade' ][ $plugin_file ] ) ) {
2015-03-24 13:30:26 -04:00
$plugins [ 'upgrade' ][ $plugin_file ] = $plugin_data = array_merge ( ( array ) $plugin_info -> response [ $plugin_file ], $plugin_data );
}
2014-07-18 16:49:17 -04:00
} elseif ( isset ( $plugin_info -> no_update [ $plugin_file ] ) ) {
$plugins [ 'all' ][ $plugin_file ] = $plugin_data = array_merge ( ( array ) $plugin_info -> no_update [ $plugin_file ], $plugin_data );
2015-03-24 13:33:27 -04:00
// Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade
if ( isset ( $plugins [ 'upgrade' ][ $plugin_file ] ) ) {
2015-03-24 13:30:26 -04:00
$plugins [ 'upgrade' ][ $plugin_file ] = $plugin_data = array_merge ( ( array ) $plugin_info -> no_update [ $plugin_file ], $plugin_data );
}
2014-07-18 16:49:17 -04:00
}
2010-10-24 22:57:43 -04:00
// Filter into individual sections
2014-02-28 15:22:14 -05:00
if ( is_multisite () && ! $screen -> in_admin ( 'network' ) && is_network_only_plugin ( $plugin_file ) && ! is_plugin_active ( $plugin_file ) ) {
2015-10-13 18:12:25 -04:00
if ( $show_network_active ) {
// On the non-network screen, show inactive network-only plugins if allowed
$plugins [ 'inactive' ][ $plugin_file ] = $plugin_data ;
} else {
// On the non-network screen, filter out network-only plugins as long as they're not individually active
unset ( $plugins [ 'all' ][ $plugin_file ] );
}
2013-03-08 22:52:27 -05:00
} elseif ( ! $screen -> in_admin ( 'network' ) && is_plugin_active_for_network ( $plugin_file ) ) {
2015-10-13 18:12:25 -04:00
if ( $show_network_active ) {
// On the non-network screen, show network-active plugins if allowed
$plugins [ 'active' ][ $plugin_file ] = $plugin_data ;
} else {
// On the non-network screen, filter out network-active plugins
unset ( $plugins [ 'all' ][ $plugin_file ] );
}
2013-03-08 22:52:27 -05:00
} elseif ( ( ! $screen -> in_admin ( 'network' ) && is_plugin_active ( $plugin_file ) )
|| ( $screen -> in_admin ( 'network' ) && is_plugin_active_for_network ( $plugin_file ) ) ) {
2014-02-28 15:22:14 -05:00
// On the non-network screen, populate the active list with plugins that are individually activated
// On the network-admin screen, populate the active list with plugins that are network activated
2010-10-24 22:57:43 -04:00
$plugins [ 'active' ][ $plugin_file ] = $plugin_data ;
} else {
2015-09-25 15:16:27 -04:00
if ( isset ( $recently_activated [ $plugin_file ] ) ) {
// Populate the recently activated list with plugins that have been recently activated
2010-10-24 22:57:43 -04:00
$plugins [ 'recently_activated' ][ $plugin_file ] = $plugin_data ;
2014-02-28 15:22:14 -05:00
}
// Populate the inactive list with plugins that aren't activated
2010-10-24 22:57:43 -04:00
$plugins [ 'inactive' ][ $plugin_file ] = $plugin_data ;
}
}
2016-01-14 15:06:25 -05:00
if ( strlen ( $s ) ) {
2010-10-24 22:57:43 -04:00
$status = 'search' ;
2013-09-05 12:34:09 -04:00
$plugins [ 'search' ] = array_filter ( $plugins [ 'all' ], array ( $this , '_search_callback' ) );
2010-10-24 22:57:43 -04:00
}
$totals = array ();
foreach ( $plugins as $type => $list )
$totals [ $type ] = count ( $list );
if ( empty ( $plugins [ $status ] ) && ! in_array ( $status , array ( 'all' , 'search' ) ) )
$status = 'all' ;
2010-11-14 13:34:59 -05:00
$this -> items = array ();
foreach ( $plugins [ $status ] as $plugin_file => $plugin_data ) {
2010-12-16 03:04:54 -05:00
// Translate, Don't Apply Markup, Sanitize HTML
2010-11-14 13:34:59 -05:00
$this -> items [ $plugin_file ] = _get_plugin_data_markup_translate ( $plugin_file , $plugin_data , false , true );
}
2010-10-24 22:57:43 -04:00
$total_this_page = $totals [ $status ];
Update/Install: Shiny Updates v2.
Gone are the days of isolation and feelings of "meh", brought on by The Bleak Screen of Sadness. For a shiny knight has arrived to usher our plugins and themes along their arduous journey of installation, updates, and the inevitable fate of ultimate deletion.
Props swissspidy, adamsilverstein, mapk, afragen, ocean90, ryelle, j-falk, michael-arestad, melchoyce, DrewAPicture, AdamSoucie, ethitter, pento, dd32, kraftbj, Ipstenu, jorbin, afercia, stephdau, paulwilde, jipmoors, khag7, svovaf, jipmoors, obenland.
Fixes #22029, #25828, #31002, #31529, #31530, #31773, #33637, #35032.
Built from https://develop.svn.wordpress.org/trunk@37714
git-svn-id: http://core.svn.wordpress.org/trunk@37680 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-06-15 12:37:29 -04:00
$js_plugins = array ();
foreach ( $plugins as $key => $list ) {
$js_plugins [ $key ] = array_keys ( ( array ) $list );
}
wp_localize_script ( 'updates' , '_wpUpdatesItemCounts' , array (
'plugins' => $js_plugins ,
) );
2015-06-30 18:31:25 -04:00
if ( ! $orderby ) {
$orderby = 'Name' ;
} else {
2010-10-24 22:57:43 -04:00
$orderby = ucfirst ( $orderby );
}
2015-06-30 18:31:25 -04:00
$order = strtoupper ( $order );
uasort ( $this -> items , array ( $this , '_order_callback' ) );
2011-06-18 11:02:58 -04:00
$plugins_per_page = $this -> get_items_per_page ( str_replace ( '-' , '_' , $screen -> id . '_per_page' ), 999 );
2010-10-24 22:57:43 -04:00
$start = ( $page - 1 ) * $plugins_per_page ;
if ( $total_this_page > $plugins_per_page )
$this -> items = array_slice ( $this -> items , $start , $plugins_per_page );
$this -> set_pagination_args ( array (
'total_items' => $total_this_page ,
'per_page' => $plugins_per_page ,
) );
}
2014-11-30 19:33:23 -05:00
/**
2016-02-17 15:15:26 -05:00
* @ global string $s URL encoded search term .
2016-01-14 15:06:25 -05:00
*
2014-11-30 19:33:23 -05:00
* @ param array $plugin
2015-05-29 16:17:26 -04:00
* @ return bool
2014-11-30 19:33:23 -05: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 _search_callback ( $plugin ) {
2016-01-14 15:06:25 -05:00
global $s ;
2010-10-24 22:57:43 -04:00
2014-03-11 18:24:15 -04:00
foreach ( $plugin as $value ) {
2016-02-17 15:15:26 -05:00
if ( is_string ( $value ) && false !== stripos ( strip_tags ( $value ), urldecode ( $s ) ) ) {
2010-10-24 22:57:43 -04:00
return true ;
2014-03-11 18:24:15 -04:00
}
}
2010-10-24 22:57:43 -04:00
return false ;
}
2014-11-30 19:33:23 -05:00
/**
* @ global string $orderby
* @ global string $order
* @ param array $plugin_a
* @ param array $plugin_b
* @ return int
*/
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 _order_callback ( $plugin_a , $plugin_b ) {
2010-10-24 22:57:43 -04:00
global $orderby , $order ;
$a = $plugin_a [ $orderby ];
$b = $plugin_b [ $orderby ];
if ( $a == $b )
return 0 ;
2015-09-22 02:06:25 -04:00
if ( 'DESC' === $order ) {
2015-07-03 17:53:25 -04:00
return strcasecmp ( $b , $a );
} else {
return strcasecmp ( $a , $b );
}
2010-10-24 22:57:43 -04:00
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global array $plugins
*/
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
global $plugins ;
2015-12-06 17:23:25 -05:00
if ( ! empty ( $_REQUEST [ 's' ] ) ) {
2016-02-17 15:15:26 -05:00
$s = esc_html ( wp_unslash ( $_REQUEST [ 's' ] ) );
2015-12-06 17:23:25 -05:00
printf ( __ ( 'No plugins found for “%s”.' ), $s );
// We assume that somebody who can install plugins in multisite is experienced enough to not need this helper link.
if ( ! is_multisite () && current_user_can ( 'install_plugins' ) ) {
echo ' <a href="' . esc_url ( admin_url ( 'plugin-install.php?tab=search&s=' . urlencode ( $s ) ) ) . '">' . __ ( 'Search for plugins in the WordPress Plugin Directory.' ) . '</a>' ;
}
} elseif ( ! empty ( $plugins [ 'all' ] ) )
2010-10-24 22:57:43 -04:00
_e ( 'No plugins found.' );
else
_e ( 'You do not appear to have any plugins available at this time.' );
}
2016-07-11 17:50:31 -04:00
/**
* Display the search box .
*
* @ since 4.6 . 0
* @ access public
*
* @ param string $text The search button text
* @ param string $input_id The search input id
*/
public function search_box ( $text , $input_id ) {
if ( empty ( $_REQUEST [ 's' ] ) && ! $this -> has_items () ) {
return ;
}
$input_id = $input_id . '-search-input' ;
if ( ! empty ( $_REQUEST [ 'orderby' ] ) ) {
echo '<input type="hidden" name="orderby" value="' . esc_attr ( $_REQUEST [ 'orderby' ] ) . '" />' ;
}
if ( ! empty ( $_REQUEST [ 'order' ] ) ) {
echo '<input type="hidden" name="order" value="' . esc_attr ( $_REQUEST [ 'order' ] ) . '" />' ;
}
?>
< p class = " search-box " >
< label class = " screen-reader-text " for = " <?php echo $input_id ?> " >< ? php echo $text ; ?> :</label>
< input type = " search " id = " <?php echo $input_id ?> " class = " wp-filter-search " name = " s " value = " <?php _admin_search_query(); ?> " placeholder = " <?php echo esc_attr( 'Search installed plugins...' ); ?> " />
< input type = " submit " id = " search-submit " class = " button hide-if-js " value = " <?php echo esc_attr( $text ); ?> " >
</ p >
< ? php
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global string $status
* @ return array
*/
2014-07-11 23:27:14 -04:00
public function get_columns () {
2010-10-24 22:57:43 -04:00
global $status ;
return array (
'cb' => ! in_array ( $status , array ( 'mustuse' , 'dropins' ) ) ? '<input type="checkbox" />' : '' ,
'name' => __ ( 'Plugin' ),
'description' => __ ( 'Description' ),
);
}
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_sortable_columns () {
2011-01-20 17:09:46 -05:00
return array ();
2010-10-24 22:57:43 -04:00
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global array $totals
* @ global string $status
* @ 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 $totals , $status ;
$status_links = array ();
foreach ( $totals as $type => $count ) {
if ( ! $count )
continue ;
switch ( $type ) {
case 'all' :
$text = _nx ( 'All <span class="count">(%s)</span>' , 'All <span class="count">(%s)</span>' , $count , 'plugins' );
break ;
case 'active' :
$text = _n ( 'Active <span class="count">(%s)</span>' , 'Active <span class="count">(%s)</span>' , $count );
break ;
case 'recently_activated' :
$text = _n ( 'Recently Active <span class="count">(%s)</span>' , 'Recently Active <span class="count">(%s)</span>' , $count );
break ;
case 'inactive' :
$text = _n ( 'Inactive <span class="count">(%s)</span>' , 'Inactive <span class="count">(%s)</span>' , $count );
break ;
case 'mustuse' :
$text = _n ( 'Must-Use <span class="count">(%s)</span>' , 'Must-Use <span class="count">(%s)</span>' , $count );
break ;
case 'dropins' :
$text = _n ( 'Drop-ins <span class="count">(%s)</span>' , 'Drop-ins <span class="count">(%s)</span>' , $count );
break ;
case 'upgrade' :
2010-12-02 16:45:47 -05:00
$text = _n ( 'Update Available <span class="count">(%s)</span>' , 'Update Available <span class="count">(%s)</span>' , $count );
2010-10-24 22:57:43 -04:00
break ;
}
2011-01-05 23:11:14 -05:00
2015-09-22 02:06:25 -04:00
if ( 'search' !== $type ) {
2010-12-17 18:47:40 -05:00
$status_links [ $type ] = sprintf ( " <a href='%s' %s>%s</a> " ,
add_query_arg ( 'plugin_status' , $type , 'plugins.php' ),
2015-09-22 02:06:25 -04:00
( $type === $status ) ? ' class="current"' : '' ,
2010-12-17 18:47:40 -05:00
sprintf ( $text , number_format_i18n ( $count ) )
);
}
2010-10-24 22:57:43 -04:00
}
return $status_links ;
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global string $status
* @ 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_bulk_actions () {
2010-10-24 22:57:43 -04:00
global $status ;
$actions = array ();
2010-10-29 15:09:04 -04:00
2012-04-18 23:41:29 -04:00
if ( 'active' != $status )
2013-03-08 22:52:27 -05:00
$actions [ 'activate-selected' ] = $this -> screen -> in_admin ( 'network' ) ? __ ( 'Network Activate' ) : __ ( 'Activate' );
2010-10-29 15:09:04 -04:00
2010-10-24 22:57:43 -04:00
if ( 'inactive' != $status && 'recent' != $status )
2013-03-08 22:52:27 -05:00
$actions [ 'deactivate-selected' ] = $this -> screen -> in_admin ( 'network' ) ? __ ( 'Network Deactivate' ) : __ ( 'Deactivate' );
2010-10-29 15:09:04 -04:00
2013-03-08 22:52:27 -05:00
if ( ! is_multisite () || $this -> screen -> in_admin ( 'network' ) ) {
2010-10-29 15:09:04 -04:00
if ( current_user_can ( 'update_plugins' ) )
$actions [ 'update-selected' ] = __ ( 'Update' );
if ( current_user_can ( 'delete_plugins' ) && ( 'active' != $status ) )
$actions [ 'delete-selected' ] = __ ( 'Delete' );
2010-10-28 04:30:37 -04:00
}
2010-10-24 22:57:43 -04:00
return $actions ;
}
2014-11-30 19:33:23 -05:00
/**
* @ global string $status
* @ param string $which
*/
2014-08-09 10:46:17 -04:00
public function bulk_actions ( $which = '' ) {
2010-10-24 22:57:43 -04:00
global $status ;
if ( in_array ( $status , array ( 'mustuse' , 'dropins' ) ) )
return ;
2014-07-24 20:20:16 -04:00
parent :: bulk_actions ( $which );
2010-10-24 22:57:43 -04:00
}
2014-11-30 19:33:23 -05:00
/**
* @ global string $status
* @ 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 extra_tablenav ( $which ) {
2010-10-24 22:57:43 -04:00
global $status ;
2011-05-05 01:24:15 -04:00
if ( ! in_array ( $status , array ( 'recently_activated' , 'mustuse' , 'dropins' ) ) )
return ;
echo '<div class="alignleft actions">' ;
2015-09-25 15:16:27 -04:00
if ( 'recently_activated' == $status ) {
2012-11-28 17:20:45 -05:00
submit_button ( __ ( 'Clear List' ), 'button' , 'clear-recent-list' , false );
2015-09-22 02:06:25 -04:00
} elseif ( 'top' === $which && 'mustuse' === $status ) {
2015-10-29 21:08:25 -04:00
/* translators: %s: mu-plugins directory name */
echo '<p>' . sprintf ( __ ( 'Files in the %s directory are executed automatically.' ),
'<code>' . str_replace ( ABSPATH , '/' , WPMU_PLUGIN_DIR ) . '</code>'
) . '</p>' ;
2015-09-22 02:06:25 -04:00
} elseif ( 'top' === $which && 'dropins' === $status ) {
2015-10-29 21:08:25 -04:00
/* translators: %s: wp-content directory name */
echo '<p>' . sprintf ( __ ( 'Drop-ins are advanced plugins in the %s directory that replace WordPress functionality when present.' ),
'<code>' . str_replace ( ABSPATH , '' , WP_CONTENT_DIR ) . '</code>'
) . '</p>' ;
2015-09-22 02:06:25 -04:00
}
2011-05-05 01:24:15 -04:00
echo '</div>' ;
2010-10-24 22:57:43 -04:00
}
2015-05-29 16:17:26 -04:00
/**
* @ return string
*/
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 current_action () {
2010-10-24 22:57:43 -04:00
if ( isset ( $_POST [ 'clear-recent-list' ]) )
return 'clear-recent-list' ;
return parent :: current_action ();
}
2015-05-28 17:41:30 -04:00
/**
*
* @ global string $status
*/
2014-07-13 18:09:16 -04:00
public function display_rows () {
2010-11-13 11:30:20 -05:00
global $status ;
2013-03-08 22:52:27 -05:00
if ( is_multisite () && ! $this -> screen -> in_admin ( 'network' ) && in_array ( $status , array ( 'mustuse' , 'dropins' ) ) )
2010-11-13 11:30:20 -05:00
return ;
foreach ( $this -> items as $plugin_file => $plugin_data )
2012-11-05 13:29:20 -05:00
$this -> single_row ( array ( $plugin_file , $plugin_data ) );
2010-11-13 11:30:20 -05:00
}
2014-11-30 19:33:23 -05:00
/**
* @ global string $status
* @ global int $page
* @ global string $s
* @ global array $totals
2015-07-05 11:03:25 -04:00
*
2014-11-30 19:33:23 -05:00
* @ param array $item
*/
2014-07-13 18:09:16 -04:00
public function single_row ( $item ) {
2012-03-21 12:19:27 -04:00
global $status , $page , $s , $totals ;
2010-10-24 22:57:43 -04:00
2012-11-05 13:29:20 -05:00
list ( $plugin_file , $plugin_data ) = $item ;
2010-10-24 22:57:43 -04:00
$context = $status ;
2012-09-19 08:43:31 -04:00
$screen = $this -> screen ;
2010-11-08 10:43:44 -05:00
2014-07-17 05:14:16 -04:00
// Pre-order.
2010-11-13 11:30:20 -05:00
$actions = array (
2012-04-18 23:41:29 -04:00
'deactivate' => '' ,
'activate' => '' ,
2014-07-18 16:49:17 -04:00
'details' => '' ,
2010-11-13 11:30:20 -05:00
'edit' => '' ,
'delete' => '' ,
);
2010-10-24 22:57:43 -04:00
2015-10-22 15:56:23 -04:00
// Do not restrict by default
$restrict_network_active = false ;
$restrict_network_only = false ;
2015-09-22 02:06:25 -04:00
if ( 'mustuse' === $context ) {
2010-11-13 11:30:20 -05:00
$is_active = true ;
2015-09-22 02:06:25 -04:00
} elseif ( 'dropins' === $context ) {
2010-11-13 11:30:20 -05:00
$dropins = _get_dropins ();
$plugin_name = $plugin_file ;
if ( $plugin_file != $plugin_data [ 'Name' ] )
$plugin_name .= '<br/>' . $plugin_data [ 'Name' ];
if ( true === ( $dropins [ $plugin_file ][ 1 ] ) ) { // Doesn't require a constant
2010-10-24 22:57:43 -04:00
$is_active = true ;
2010-11-13 11:30:20 -05:00
$description = '<p><strong>' . $dropins [ $plugin_file ][ 0 ] . '</strong></p>' ;
2013-09-13 05:37:10 -04:00
} elseif ( defined ( $dropins [ $plugin_file ][ 1 ] ) && constant ( $dropins [ $plugin_file ][ 1 ] ) ) { // Constant is true
2010-11-13 11:30:20 -05:00
$is_active = true ;
$description = '<p><strong>' . $dropins [ $plugin_file ][ 0 ] . '</strong></p>' ;
} else {
$is_active = false ;
2015-10-29 21:08:25 -04:00
$description = '<p><strong>' . $dropins [ $plugin_file ][ 0 ] . ' <span class="error-message">' . __ ( 'Inactive:' ) . '</span></strong> ' .
2015-10-29 21:56:25 -04:00
/* translators: 1: drop-in constant name, 2: wp-config.php */
sprintf ( __ ( 'Requires %1$s in %2$s file.' ),
" <code>define(' " . $dropins [ $plugin_file ][ 1 ] . " ', true);</code> " ,
'<code>wp-config.php</code>'
2015-10-29 21:08:25 -04:00
) . '</p>' ;
2010-11-13 11:30:20 -05:00
}
if ( $plugin_data [ 'Description' ] )
$description .= '<p>' . $plugin_data [ 'Description' ] . '</p>' ;
} else {
2015-10-13 18:12:25 -04:00
if ( $screen -> in_admin ( 'network' ) ) {
2012-04-18 23:41:29 -04:00
$is_active = is_plugin_active_for_network ( $plugin_file );
2015-10-13 18:12:25 -04:00
} else {
2010-11-13 11:30:20 -05:00
$is_active = is_plugin_active ( $plugin_file );
2015-10-13 18:12:25 -04:00
$restrict_network_active = ( is_multisite () && is_plugin_active_for_network ( $plugin_file ) );
$restrict_network_only = ( is_multisite () && is_network_only_plugin ( $plugin_file ) && ! $is_active );
}
2010-11-13 11:30:20 -05:00
2013-03-08 22:52:27 -05:00
if ( $screen -> in_admin ( 'network' ) ) {
2012-04-18 23:41:29 -04:00
if ( $is_active ) {
2015-07-05 11:03:25 -04:00
if ( current_user_can ( 'manage_network_plugins' ) ) {
/* translators: %s: plugin name */
2016-07-16 19:20:29 -04:00
$actions [ 'deactivate' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s , 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr ( sprintf ( _x ( 'Network deactivate %s' , 'plugin' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Network Deactivate' ) . '</a>' ;
2015-07-05 11:03:25 -04:00
}
2010-10-24 22:57:43 -04:00
} else {
2015-07-05 11:03:25 -04:00
if ( current_user_can ( 'manage_network_plugins' ) ) {
/* translators: %s: plugin name */
2016-07-16 19:20:29 -04:00
$actions [ 'activate' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s , 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr ( sprintf ( _x ( 'Network Activate %s' , 'plugin' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Network Activate' ) . '</a>' ;
2015-07-05 11:03:25 -04:00
}
if ( current_user_can ( 'delete_plugins' ) && ! is_plugin_active ( $plugin_file ) ) {
/* translators: %s: plugin name */
2016-07-16 19:20:29 -04:00
$actions [ 'delete' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s , 'bulk-plugins' ) . '" class="delete" aria-label="' . esc_attr ( sprintf ( _x ( 'Delete %s' , 'plugin' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Delete' ) . '</a>' ;
2015-07-05 11:03:25 -04:00
}
2010-10-24 22:57:43 -04:00
}
} else {
2015-10-13 18:12:25 -04:00
if ( $restrict_network_active ) {
$actions = array (
'network_active' => __ ( 'Network Active' ),
);
} elseif ( $restrict_network_only ) {
$actions = array (
'network_only' => __ ( 'Network Only' ),
);
} elseif ( $is_active ) {
2015-07-05 11:03:25 -04:00
/* translators: %s: plugin name */
2016-07-16 19:20:29 -04:00
$actions [ 'deactivate' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=deactivate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s , 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr ( sprintf ( _x ( 'Deactivate %s' , 'plugin' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Deactivate' ) . '</a>' ;
2010-10-24 22:57:43 -04:00
} else {
2015-07-05 11:03:25 -04:00
/* translators: %s: plugin name */
2016-07-16 19:20:29 -04:00
$actions [ 'activate' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=activate&plugin=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s , 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr ( sprintf ( _x ( 'Activate %s' , 'plugin' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Activate' ) . '</a>' ;
2010-11-13 11:30:20 -05:00
2015-07-05 11:03:25 -04:00
if ( ! is_multisite () && current_user_can ( 'delete_plugins' ) ) {
/* translators: %s: plugin name */
2016-07-16 19:20:29 -04:00
$actions [ 'delete' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=delete-selected&checked[]=' . $plugin_file . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s , 'bulk-plugins' ) . '" class="delete" aria-label="' . esc_attr ( sprintf ( _x ( 'Delete %s' , 'plugin' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Delete' ) . '</a>' ;
2015-07-05 11:03:25 -04:00
}
2010-11-13 11:30:20 -05:00
} // end if $is_active
2014-08-09 10:46:17 -04:00
2013-03-08 22:52:27 -05:00
} // end if $screen->in_admin( 'network' )
2010-11-13 11:30:20 -05:00
2015-07-05 11:03:25 -04:00
if ( ( ! is_multisite () || $screen -> in_admin ( 'network' ) ) && current_user_can ( 'edit_plugins' ) && is_writable ( WP_PLUGIN_DIR . '/' . $plugin_file ) ) {
/* translators: %s: plugin name */
$actions [ 'edit' ] = '<a href="plugin-editor.php?file=' . $plugin_file . '" class="edit" aria-label="' . esc_attr ( sprintf ( __ ( 'Edit %s' ), $plugin_data [ 'Name' ] ) ) . '">' . __ ( 'Edit' ) . '</a>' ;
}
2010-11-13 11:30:20 -05:00
} // end if $context
2015-10-02 19:44:26 -04:00
$actions = array_filter ( $actions );
2014-03-02 15:48:14 -05:00
2015-10-02 19:44:26 -04:00
if ( $screen -> in_admin ( 'network' ) ) {
2014-03-02 15:48:14 -05:00
2015-10-02 19:44:26 -04:00
/**
2016-05-22 14:01:30 -04:00
* Filters the action links displayed for each plugin in the Network Admin Plugins list table .
2015-10-02 19:44:26 -04:00
*
* The default action links for the Network plugins list table include
* 'Network Activate' , 'Network Deactivate' , 'Edit' , and 'Delete' .
*
* @ since 3.1 . 0 As `{$prefix}_plugin_action_links`
* @ since 4.4 . 0
*
* @ param array $actions An array of plugin action links .
* @ param string $plugin_file Path to the plugin file relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $context The plugin context . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' ,
* 'Must-Use' , 'Drop-ins' , 'Search' .
*/
$actions = apply_filters ( 'network_admin_plugin_action_links' , $actions , $plugin_file , $plugin_data , $context );
/**
2016-05-22 14:01:30 -04:00
* Filters the list of action links displayed for a specific plugin in the Network Admin Plugins list table .
2015-10-02 19:44:26 -04:00
*
* The dynamic portion of the hook name , $plugin_file , refers to the path
* to the plugin file , relative to the plugins directory .
*
* @ since 3.1 . 0 As `{$prefix}_plugin_action_links_{$plugin_file}`
* @ since 4.4 . 0
*
* @ param array $actions An array of plugin action links .
* @ param string $plugin_file Path to the plugin file relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $context The plugin context . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' ,
* 'Must-Use' , 'Drop-ins' , 'Search' .
*/
$actions = apply_filters ( " network_admin_plugin_action_links_ { $plugin_file } " , $actions , $plugin_file , $plugin_data , $context );
} else {
/**
2016-05-22 14:01:30 -04:00
* Filters the action links displayed for each plugin in the Plugins list table .
2015-10-02 19:44:26 -04:00
*
* The default action links for the site plugins list table include
* 'Activate' , 'Deactivate' , and 'Edit' , for a network site , and
* 'Activate' , 'Deactivate' , 'Edit' , and 'Delete' for a single site .
*
* @ since 2.5 . 0 As `{$prefix}_plugin_action_links`
* @ since 4.4 . 0
*
* @ param array $actions An array of plugin action links .
* @ param string $plugin_file Path to the plugin file relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $context The plugin context . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' ,
* 'Must-Use' , 'Drop-ins' , 'Search' .
*/
$actions = apply_filters ( 'plugin_action_links' , $actions , $plugin_file , $plugin_data , $context );
/**
2016-05-22 14:01:30 -04:00
* Filters the list of action links displayed for a specific plugin in the Plugins list table .
2015-10-02 19:44:26 -04:00
*
* The dynamic portion of the hook name , $plugin_file , refers to the path
* to the plugin file , relative to the plugins directory .
*
* @ since 2.7 . 0 As `{$prefix}_plugin_action_links_{$plugin_file}`
* @ since 4.4 . 0
*
* @ param array $actions An array of plugin action links .
* @ param string $plugin_file Path to the plugin file relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $context The plugin context . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' ,
* 'Must-Use' , 'Drop-ins' , 'Search' .
*/
$actions = apply_filters ( " plugin_action_links_ { $plugin_file } " , $actions , $plugin_file , $plugin_data , $context );
}
2010-11-13 11:30:20 -05:00
$class = $is_active ? 'active' : 'inactive' ;
2010-12-24 09:19:41 -05:00
$checkbox_id = " checkbox_ " . md5 ( $plugin_data [ 'Name' ]);
2015-10-13 18:12:25 -04:00
if ( $restrict_network_active || $restrict_network_only || in_array ( $status , array ( 'mustuse' , 'dropins' ) ) ) {
2012-07-25 12:18:14 -04:00
$checkbox = '' ;
} else {
$checkbox = " <label class='screen-reader-text' for=' " . $checkbox_id . " ' > " . sprintf ( __ ( 'Select %s' ), $plugin_data [ 'Name' ] ) . " </label> "
. " <input type='checkbox' name='checked[]' value=' " . esc_attr ( $plugin_file ) . " ' id=' " . $checkbox_id . " ' /> " ;
}
2010-11-13 11:57:25 -05:00
if ( 'dropins' != $context ) {
2010-12-06 10:15:09 -05:00
$description = '<p>' . ( $plugin_data [ 'Description' ] ? $plugin_data [ 'Description' ] : ' ' ) . '</p>' ;
2010-11-13 11:30:20 -05:00
$plugin_name = $plugin_data [ 'Name' ];
}
2012-03-21 12:19:27 -04:00
if ( ! empty ( $totals [ 'upgrade' ] ) && ! empty ( $plugin_data [ 'update' ] ) )
$class .= ' update' ;
2010-11-13 11:30:20 -05:00
2016-01-06 17:40:26 -05:00
$plugin_slug = isset ( $plugin_data [ 'slug' ] ) ? $plugin_data [ 'slug' ] : sanitize_title ( $plugin_name );
printf ( '<tr class="%s" data-slug="%s" data-plugin="%s">' ,
esc_attr ( $class ),
esc_attr ( $plugin_slug ),
esc_attr ( $plugin_file )
2015-03-19 01:26:28 -04:00
);
2010-11-13 11:30:20 -05:00
2015-05-28 22:41:25 -04:00
list ( $columns , $hidden , $sortable , $primary ) = $this -> get_column_info ();
2010-11-13 11:57:25 -05:00
foreach ( $columns as $column_name => $column_display_name ) {
2015-06-10 15:47:27 -04:00
$extra_classes = '' ;
2015-05-28 22:41:25 -04:00
if ( in_array ( $column_name , $hidden ) ) {
2015-06-10 15:47:27 -04:00
$extra_classes = ' hidden' ;
2015-05-28 22:41:25 -04:00
}
2010-11-13 11:57:25 -05:00
switch ( $column_name ) {
case 'cb' :
echo " <th scope='row' class='check-column'> $checkbox </th> " ;
break ;
case 'name' :
2015-06-10 15:47:27 -04:00
echo " <td class='plugin-title column-primary'><strong> $plugin_name </strong> " ;
2015-06-10 15:31:25 -04:00
echo $this -> row_actions ( $actions , true );
2010-11-13 11:57:25 -05:00
echo " </td> " ;
break ;
case 'description' :
2015-05-28 22:41:25 -04:00
$classes = 'column-description desc' ;
2015-06-10 15:47:27 -04:00
echo " <td class=' $classes { $extra_classes } '>
2010-11-13 11:57:25 -05:00
< div class = 'plugin-description' > $description </ div >
< div class = '$class second plugin-version-author-uri' > " ;
$plugin_meta = array ();
if ( ! empty ( $plugin_data [ 'Version' ] ) )
$plugin_meta [] = sprintf ( __ ( 'Version %s' ), $plugin_data [ 'Version' ] );
if ( ! empty ( $plugin_data [ 'Author' ] ) ) {
$author = $plugin_data [ 'Author' ];
if ( ! empty ( $plugin_data [ 'AuthorURI' ] ) )
2014-06-05 00:52:16 -04:00
$author = '<a href="' . $plugin_data [ 'AuthorURI' ] . '">' . $plugin_data [ 'Author' ] . '</a>' ;
2010-11-13 11:57:25 -05:00
$plugin_meta [] = sprintf ( __ ( 'By %s' ), $author );
}
2014-08-04 14:49:17 -04:00
2014-08-25 11:28:17 -04:00
// Details link using API info, if available
if ( isset ( $plugin_data [ 'slug' ] ) && current_user_can ( 'install_plugins' ) ) {
2016-03-10 17:37:26 -05:00
$plugin_meta [] = sprintf ( '<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>' ,
2014-08-25 11:28:17 -04:00
esc_url ( network_admin_url ( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data [ 'slug' ] .
'&TB_iframe=true&width=600&height=550' ) ),
esc_attr ( sprintf ( __ ( 'More information about %s' ), $plugin_name ) ),
esc_attr ( $plugin_name ),
__ ( 'View details' )
);
} elseif ( ! empty ( $plugin_data [ 'PluginURI' ] ) ) {
$plugin_meta [] = sprintf ( '<a href="%s">%s</a>' ,
esc_url ( $plugin_data [ 'PluginURI' ] ),
__ ( 'Visit plugin site' )
);
2014-08-04 14:49:17 -04:00
}
2010-11-17 13:47:34 -05:00
2014-03-02 15:48:14 -05:00
/**
2016-05-22 14:01:30 -04:00
* Filters the array of row meta for each plugin in the Plugins list table .
2014-03-02 15:48:14 -05:00
*
* @ since 2.8 . 0
*
* @ param array $plugin_meta An array of the plugin ' s metadata ,
* including the version , author ,
* author URI , and plugin URI .
* @ param string $plugin_file Path to the plugin file , relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $status Status of the plugin . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' , 'Must-Use' ,
* 'Drop-ins' , 'Search' .
*/
2010-11-13 11:57:25 -05:00
$plugin_meta = apply_filters ( 'plugin_row_meta' , $plugin_meta , $plugin_file , $plugin_data , $status );
echo implode ( ' | ' , $plugin_meta );
2010-11-13 11:30:20 -05:00
2010-11-13 11:57:25 -05:00
echo " </div></td> " ;
break ;
default :
2015-05-28 22:41:25 -04:00
$classes = " $column_name column- $column_name $class " ;
2015-06-10 15:47:27 -04:00
echo " <td class=' $classes { $extra_classes } '> " ;
2014-03-02 15:48:14 -05:00
/**
* Fires inside each custom column of the Plugins list table .
*
* @ since 3.1 . 0
*
* @ param string $column_name Name of the column .
* @ param string $plugin_file Path to the plugin file .
* @ param array $plugin_data An array of plugin data .
*/
2010-11-13 12:01:57 -05:00
do_action ( 'manage_plugins_custom_column' , $column_name , $plugin_file , $plugin_data );
2015-05-28 22:41:25 -04:00
2010-11-13 11:57:25 -05:00
echo " </td> " ;
}
}
echo " </tr> " ;
2010-10-24 22:57:43 -04:00
2014-03-02 15:48:14 -05:00
/**
* Fires after each row in the Plugins list table .
*
* @ since 2.3 . 0
*
* @ param string $plugin_file Path to the plugin file , relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $status Status of the plugin . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' , 'Must-Use' ,
* 'Drop-ins' , 'Search' .
*/
2010-11-13 11:30:20 -05:00
do_action ( 'after_plugin_row' , $plugin_file , $plugin_data , $status );
2014-03-02 15:48:14 -05:00
/**
* Fires after each specific row in the Plugins list table .
*
2014-11-30 06:28:24 -05:00
* The dynamic portion of the hook name , `$plugin_file` , refers to the path
2014-03-02 15:48:14 -05:00
* to the plugin file , relative to the plugins directory .
*
* @ since 2.7 . 0
*
* @ param string $plugin_file Path to the plugin file , relative to the plugins directory .
* @ param array $plugin_data An array of plugin data .
* @ param string $status Status of the plugin . Defaults are 'All' , 'Active' ,
* 'Inactive' , 'Recently Activated' , 'Upgrade' , 'Must-Use' ,
* 'Drop-ins' , 'Search' .
*/
2010-11-13 11:30:20 -05:00
do_action ( " after_plugin_row_ $plugin_file " , $plugin_file , $plugin_data , $status );
2010-10-24 22:57:43 -04:00
}
2015-05-28 22:41:25 -04:00
/**
2015-07-13 13:46:26 -04:00
* Gets the name of the primary column for this specific list table .
2015-05-28 22:41:25 -04:00
*
* @ since 4.3 . 0
* @ access protected
*
2015-06-10 15:31:25 -04:00
* @ return string Unalterable name for the primary column , in this case , 'name' .
2015-05-28 22:41:25 -04:00
*/
2015-09-14 16:29:26 -04:00
protected function get_primary_column_name () {
2015-06-10 15:31:25 -04:00
return 'name' ;
2015-05-28 22:41:25 -04:00
}
2010-10-24 22:57:43 -04:00
}