2011-11-02 05:14:14 +01:00
< ? php
2008-09-17 02:40:10 +02:00
/**
* WordPress Plugin Install Administration API
*
* @ package WordPress
* @ subpackage Administration
*/
/**
* Retrieve plugin installer pages from WordPress Plugins API .
*
* It is possible for a plugin to override the Plugin API result with three
* filters . Assume this is for plugins , which can extend on the Plugin Info to
* offer more choices . This is very powerful and must be used with care , when
2011-09-05 21:25:55 +02:00
* overriding the filters .
2008-09-17 02:40:10 +02:00
*
* The first filter , 'plugins_api_args' , is for the args and gives the action as
* the second parameter . The hook for 'plugins_api_args' must ensure that an
* object is returned .
*
* The second filter , 'plugins_api' , is the result that would be returned .
*
2008-10-10 20:21:16 +02:00
* @ since 2.7 . 0
*
2008-09-17 02:40:10 +02:00
* @ param string $action
* @ param array | object $args Optional . Arguments to serialize for the Plugin Info API .
2010-01-17 04:26:50 +01:00
* @ return object plugins_api response object on success , WP_Error on failure .
2008-09-17 02:40:10 +02:00
*/
function plugins_api ( $action , $args = null ) {
2008-08-04 23:17:42 +02:00
2010-01-18 21:34:48 +01:00
if ( is_array ( $args ) )
2008-08-04 23:17:42 +02:00
$args = ( object ) $args ;
2008-11-20 22:22:24 +01:00
if ( ! isset ( $args -> per_page ) )
$args -> per_page = 24 ;
2013-09-20 04:22:10 +02:00
/**
* Override the Plugin Install API arguments .
*
* Please ensure that an object is returned .
*
* @ since 2.7 . 0
*
* @ param object $args Plugin API arguments .
* @ param string $action The type of information being requested from the Plugin Install API .
*/
$args = apply_filters ( 'plugins_api_args' , $args , $action );
/**
* Allows a plugin to override the WordPress . org Plugin Install API entirely .
*
* Please ensure that an object is returned .
*
* @ since 2.7 . 0
*
2014-04-12 02:01:15 +02:00
* @ param bool | object $result The result object . Default false .
2013-09-20 04:22:10 +02:00
* @ param string $action The type of information being requested from the Plugin Install API .
* @ param object $args Plugin API arguments .
*/
$res = apply_filters ( 'plugins_api' , false , $action , $args );
2008-08-09 07:36:14 +02:00
2010-01-17 04:26:50 +01:00
if ( false === $res ) {
2013-10-27 22:09:10 +01:00
$url = $http_url = 'http://api.wordpress.org/plugins/info/1.0/' ;
if ( $ssl = wp_http_supports ( array ( 'ssl' ) ) )
2013-09-09 09:54:11 +02:00
$url = set_url_scheme ( $url , 'https' );
2013-10-27 22:09:10 +01:00
$args = array (
2013-09-09 09:54:11 +02:00
'timeout' => 15 ,
'body' => array (
'action' => $action ,
'request' => serialize ( $args )
)
2013-10-27 22:09:10 +01:00
);
$request = wp_remote_post ( $url , $args );
if ( $ssl && is_wp_error ( $request ) ) {
2014-04-16 02:38:14 +02:00
trigger_error ( __ ( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ) . ' ' . __ ( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent () || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );
2013-10-27 22:09:10 +01:00
$request = wp_remote_post ( $http_url , $args );
}
2013-09-09 09:54:11 +02:00
2008-10-14 17:56:33 +02:00
if ( is_wp_error ( $request ) ) {
2014-03-03 03:34:27 +01:00
$res = new WP_Error ( 'plugins_api_failed' , __ ( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ), $request -> get_error_message () );
2008-10-14 17:56:33 +02:00
} else {
2012-01-08 04:48:05 +01:00
$res = maybe_unserialize ( wp_remote_retrieve_body ( $request ) );
if ( ! is_object ( $res ) && ! is_array ( $res ) )
2014-03-03 03:34:27 +01:00
$res = new WP_Error ( 'plugins_api_failed' , __ ( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ), wp_remote_retrieve_body ( $request ) );
2008-10-14 17:56:33 +02:00
}
2009-06-16 21:36:48 +02:00
} elseif ( ! is_wp_error ( $res ) ) {
$res -> external = true ;
2008-08-04 23:17:42 +02:00
}
2013-09-20 04:22:10 +02:00
/**
* Filter the Plugin Install API response results .
*
* @ since 2.7 . 0
*
* @ param object | WP_Error $res Response object or WP_Error .
* @ param string $action The type of information being requested from the Plugin Install API .
* @ param object $args Plugin API arguments .
*/
return apply_filters ( 'plugins_api_result' , $res , $action , $args );
2008-08-04 23:17:42 +02:00
}
2008-09-17 02:40:10 +02:00
/**
2008-10-10 20:21:16 +02:00
* Retrieve popular WordPress plugin tags .
*
* @ since 2.7 . 0
2008-09-17 02:40:10 +02:00
*
2008-10-10 20:21:16 +02:00
* @ param array $args
* @ return array
2008-09-17 02:40:10 +02:00
*/
2008-08-04 23:17:42 +02:00
function install_popular_tags ( $args = array () ) {
2010-06-19 09:28:27 +02:00
$key = md5 ( serialize ( $args ));
if ( false !== ( $tags = get_site_transient ( 'poptags_' . $key ) ) )
return $tags ;
2008-08-04 23:17:42 +02:00
2008-08-05 19:06:42 +02:00
$tags = plugins_api ( 'hot_tags' , $args );
2008-08-04 23:17:42 +02:00
2008-10-14 17:56:33 +02:00
if ( is_wp_error ( $tags ) )
return $tags ;
2012-09-25 07:26:19 +02:00
set_site_transient ( 'poptags_' . $key , $tags , 3 * HOUR_IN_SECONDS );
2008-08-04 23:17:42 +02:00
return $tags ;
}
2008-10-10 20:21:16 +02:00
2008-10-14 01:39:56 +02:00
function install_dashboard () {
2008-08-04 23:17:42 +02:00
?>
2014-03-03 03:34:27 +01:00
< p >< ? php printf ( __ ( 'Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the <a href="%1$s">WordPress Plugin Directory</a> or upload a plugin in .zip format via <a href="%2$s">this page</a>.' ), 'https://wordpress.org/plugins/' , self_admin_url ( 'plugin-install.php?tab=upload' ) ); ?> </p>
2008-08-09 07:36:14 +02:00
2014-08-27 04:53:16 +02:00
< ? php display_plugins_table (); ?>
2008-12-09 19:03:31 +01:00
2014-08-27 04:53:16 +02:00
< h3 >< ? php _e ( 'Popular tags' ) ?> </h3>
< p >< ? php _e ( 'You may also browse based on the most popular tags in the Plugin Directory:' ) ?> </p>
2008-08-04 23:17:42 +02:00
< ? php
2008-10-10 20:21:16 +02:00
$api_tags = install_popular_tags ();
2008-08-04 23:17:42 +02:00
2009-03-20 01:14:57 +01:00
echo '<p class="popular-tags">' ;
2010-04-25 07:39:39 +02:00
if ( is_wp_error ( $api_tags ) ) {
echo $api_tags -> get_error_message ();
} else {
2011-09-03 16:18:10 +02:00
//Set up the tags in a way which can be interpreted by wp_generate_tag_cloud()
2010-04-25 07:39:39 +02:00
$tags = array ();
foreach ( ( array ) $api_tags as $tag )
$tags [ $tag [ 'name' ] ] = ( object ) array (
2010-10-20 16:16:03 +02:00
'link' => esc_url ( self_admin_url ( 'plugin-install.php?tab=search&type=tag&s=' . urlencode ( $tag [ 'name' ])) ),
2010-04-25 07:39:39 +02:00
'name' => $tag [ 'name' ],
'id' => sanitize_title_with_dashes ( $tag [ 'name' ]),
'count' => $tag [ 'count' ] );
2011-11-02 03:36:18 +01:00
echo wp_generate_tag_cloud ( $tags , array ( 'single_text' => __ ( '%s plugin' ), 'multiple_text' => __ ( '%s plugins' ) ) );
2010-04-25 07:39:39 +02:00
}
2009-03-10 19:31:55 +01:00
echo '</p><br class="clear" />' ;
2008-08-04 23:17:42 +02:00
}
2014-08-27 04:53:16 +02:00
add_action ( 'install_plugins_featured' , 'install_dashboard' );
2008-08-04 23:17:42 +02:00
2008-10-18 22:46:30 +02:00
/**
* Display search form for searching plugins .
*
* @ since 2.7 . 0
*/
2012-04-25 21:37:19 +02:00
function install_search_form ( $type_selector = true ) {
2013-03-01 18:00:25 +01:00
$type = isset ( $_REQUEST [ 'type' ]) ? wp_unslash ( $_REQUEST [ 'type' ] ) : 'term' ;
$term = isset ( $_REQUEST [ 's' ]) ? wp_unslash ( $_REQUEST [ 's' ] ) : '' ;
2014-07-18 06:50:15 +02:00
$input_attrs = '' ;
2014-08-25 18:03:16 +02:00
$button_type = 'button screen-reader-text' ;
2008-08-04 23:17:42 +02:00
2014-07-18 06:50:15 +02:00
// assume no $type_selector means it's a simplified search form
if ( ! $type_selector ) {
$input_attrs = 'class="wp-filter-search" placeholder="' . esc_attr__ ( 'Search Plugins' ) . '" ' ;
}
2014-08-25 18:03:16 +02:00
?> <form class="search-form search-plugins" method="get" action="">
2010-08-11 23:54:51 +02:00
< input type = " hidden " name = " tab " value = " search " />
2012-04-25 21:37:19 +02:00
< ? php if ( $type_selector ) : ?>
2008-08-04 23:17:42 +02:00
< select name = " type " id = " typeselector " >
2012-03-30 23:17:22 +02:00
< option value = " term " < ? php selected ( 'term' , $type ) ?> ><?php _e('Keyword'); ?></option>
2009-05-07 12:18:12 +02:00
< option value = " author " < ? php selected ( 'author' , $type ) ?> ><?php _e('Author'); ?></option>
2010-05-14 23:46:25 +02:00
< option value = " tag " < ? php selected ( 'tag' , $type ) ?> ><?php _ex('Tag', 'Plugin Installer'); ?></option>
2008-08-04 23:17:42 +02:00
</ select >
2012-04-25 21:37:19 +02:00
< ? php endif ; ?>
2014-07-18 06:50:15 +02:00
< label >< span class = " screen-reader-text " >< ? php _e ( 'Search Plugins' ); ?> </span>
< input type = " search " name = " s " value = " <?php echo esc_attr( $term ) ?> " < ? php echo $input_attrs ; ?> />
</ label >
< ? php submit_button ( __ ( 'Search Plugins' ), $button_type , false , false , array ( 'id' => 'search-submit' ) ); ?>
2008-08-04 23:17:42 +02:00
</ form >< ? php
}
2009-03-20 14:31:00 +01:00
/**
* Upload from zip
* @ since 2.8 . 0
2009-04-20 20:18:39 +02:00
*
2009-03-20 14:31:00 +01:00
* @ param string $page
*/
function install_plugins_upload ( $page = 1 ) {
?>
2014-08-27 03:32:18 +02:00
< div class = " upload-plugin " >
2012-11-08 00:54:03 +01:00
< p class = " install-help " >< ? php _e ( 'If you have a plugin in a .zip format, you may install it by uploading it here.' ); ?> </p>
< form method = " post " enctype = " multipart/form-data " class = " wp-upload-form " action = " <?php echo self_admin_url('update.php?action=upload-plugin'); ?> " >
< ? php wp_nonce_field ( 'plugin-upload' ); ?>
2009-05-13 00:40:56 +02:00
< label class = " screen-reader-text " for = " pluginzip " >< ? php _e ( 'Plugin zip file' ); ?> </label>
2009-05-01 23:52:34 +02:00
< input type = " file " id = " pluginzip " name = " pluginzip " />
2012-11-08 00:54:03 +01:00
< ? php submit_button ( __ ( 'Install Now' ), 'button' , 'install-plugin-submit' , false ); ?>
2009-03-20 14:31:00 +01:00
</ form >
2014-08-27 03:32:18 +02:00
</ div >
2009-03-20 14:31:00 +01:00
< ? php
}
2010-08-11 23:54:51 +02:00
add_action ( 'install_plugins_upload' , 'install_plugins_upload' , 10 , 1 );
2008-08-04 23:17:42 +02:00
2012-09-27 02:47:01 +02:00
/**
* Show a username form for the favorites page
* @ since 3.5 . 0
*
*/
function install_plugins_favorites_form () {
2013-03-01 18:00:25 +01:00
$user = ! empty ( $_GET [ 'user' ] ) ? wp_unslash ( $_GET [ 'user' ] ) : get_user_option ( 'wporg_favorites' );
2012-09-27 02:47:01 +02:00
?>
< p class = " install-help " >< ? php _e ( 'If you have marked plugins as favorites on WordPress.org, you can browse them here.' ); ?> </p>
< form method = " get " action = " " >
< input type = " hidden " name = " tab " value = " favorites " />
< p >
< label for = " user " >< ? php _e ( 'Your WordPress.org username:' ); ?> </label>
< input type = " search " id = " user " name = " user " value = " <?php echo esc_attr( $user ); ?> " />
< input type = " submit " class = " button " value = " <?php esc_attr_e( 'Get Favorites' ); ?> " />
</ p >
</ form >
< ? php
}
2008-10-10 20:21:16 +02:00
/**
* Display plugin content based on plugin list .
*
* @ since 2.7 . 0
*/
2010-08-11 23:54:51 +02:00
function display_plugins_table () {
2010-08-22 13:22:46 +02:00
global $wp_list_table ;
2008-08-04 23:17:42 +02:00
2012-09-27 02:47:01 +02:00
if ( current_filter () == 'install_plugins_favorites' && empty ( $_GET [ 'user' ] ) && ! get_user_option ( 'wporg_favorites' ) )
return ;
2010-08-22 13:22:46 +02:00
$wp_list_table -> display ();
2008-08-04 23:17:42 +02:00
}
2012-09-27 02:47:01 +02:00
add_action ( 'install_plugins_search' , 'display_plugins_table' );
add_action ( 'install_plugins_popular' , 'display_plugins_table' );
add_action ( 'install_plugins_new' , 'display_plugins_table' );
2014-06-12 20:09:13 +02:00
add_action ( 'install_plugins_beta' , 'display_plugins_table' );
2012-09-27 02:47:01 +02:00
add_action ( 'install_plugins_favorites' , 'display_plugins_table' );
2008-10-10 20:21:16 +02:00
2010-04-02 01:17:53 +02:00
/**
* Determine the status we can perform on a plugin .
*
* @ since 3.0 . 0
*/
function install_plugin_install_status ( $api , $loop = false ) {
2014-07-17 11:14:16 +02:00
// This function is called recursively, $loop prevents further loops.
2010-04-02 01:17:53 +02:00
if ( is_array ( $api ) )
$api = ( object ) $api ;
2014-07-17 11:14:16 +02:00
// Default to a "new" plugin
2010-04-02 01:17:53 +02:00
$status = 'install' ;
$url = false ;
2014-07-17 11:14:16 +02:00
/*
* Check to see if this plugin is known to be installed ,
* and has an update awaiting it .
*/
2010-04-02 01:17:53 +02:00
$update_plugins = get_site_transient ( 'update_plugins' );
2012-04-17 04:43:13 +02:00
if ( isset ( $update_plugins -> response ) ) {
2010-04-02 01:17:53 +02:00
foreach ( ( array ) $update_plugins -> response as $file => $plugin ) {
if ( $plugin -> slug === $api -> slug ) {
$status = 'update_available' ;
$update_file = $file ;
$version = $plugin -> new_version ;
if ( current_user_can ( 'update_plugins' ) )
2010-10-20 16:16:03 +02:00
$url = wp_nonce_url ( self_admin_url ( 'update.php?action=upgrade-plugin&plugin=' . $update_file ), 'upgrade-plugin_' . $update_file );
2010-04-02 01:17:53 +02:00
break ;
}
}
}
if ( 'install' == $status ) {
2011-12-14 00:45:31 +01:00
if ( is_dir ( WP_PLUGIN_DIR . '/' . $api -> slug ) ) {
2010-04-02 01:17:53 +02:00
$installed_plugin = get_plugins ( '/' . $api -> slug );
if ( empty ( $installed_plugin ) ) {
if ( current_user_can ( 'install_plugins' ) )
2010-10-20 16:16:03 +02:00
$url = wp_nonce_url ( self_admin_url ( 'update.php?action=install-plugin&plugin=' . $api -> slug ), 'install-plugin_' . $api -> slug );
2010-04-02 01:17:53 +02:00
} else {
2013-07-17 23:08:05 +02:00
$key = array_keys ( $installed_plugin );
$key = array_shift ( $key ); //Use the first plugin regardless of the name, Could have issues for multiple-plugins in one directory if they share different version numbers
2010-04-02 01:17:53 +02:00
if ( version_compare ( $api -> version , $installed_plugin [ $key ][ 'Version' ], '=' ) ){
$status = 'latest_installed' ;
} elseif ( version_compare ( $api -> version , $installed_plugin [ $key ][ 'Version' ], '<' ) ) {
$status = 'newer_installed' ;
$version = $installed_plugin [ $key ][ 'Version' ];
} else {
//If the above update check failed, Then that probably means that the update checker has out-of-date information, force a refresh
if ( ! $loop ) {
delete_site_transient ( 'update_plugins' );
wp_update_plugins ();
return install_plugin_install_status ( $api , true );
}
}
}
} else {
// "install" & no directory with that slug
if ( current_user_can ( 'install_plugins' ) )
2010-10-20 16:16:03 +02:00
$url = wp_nonce_url ( self_admin_url ( 'update.php?action=install-plugin&plugin=' . $api -> slug ), 'install-plugin_' . $api -> slug );
2010-04-02 01:17:53 +02:00
}
}
2010-05-27 13:04:08 +02:00
if ( isset ( $_GET [ 'from' ]) )
2013-03-01 18:00:25 +01:00
$url .= '&from=' . urlencode ( wp_unslash ( $_GET [ 'from' ] ) );
2010-04-02 01:17:53 +02:00
return compact ( 'status' , 'url' , 'version' );
}
2008-10-10 20:21:16 +02:00
/**
* Display plugin information in dialog box form .
*
* @ since 2.7 . 0
*/
2008-08-04 23:17:42 +02:00
function install_plugin_information () {
global $tab ;
2008-08-09 07:36:14 +02:00
2014-07-13 00:08:16 +02:00
$api = plugins_api ( 'plugin_information' , array (
'slug' => wp_unslash ( $_REQUEST [ 'plugin' ] ),
'is_ssl' => is_ssl (),
'fields' => array ( 'banners' => true , 'reviews' => true )
) );
2008-08-04 23:17:42 +02:00
2014-07-13 00:08:16 +02:00
if ( is_wp_error ( $api ) ) {
2014-03-16 19:28:17 +01:00
wp_die ( $api );
2014-07-13 00:08:16 +02:00
}
2008-10-14 17:56:33 +02:00
2012-01-08 10:18:56 +01: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 (),
2014-08-16 05:07:18 +02:00
'div' => array ( 'class' => array () ), 'span' => array ( 'class' => array () ),
'p' => array (), 'ul' => array (), 'ol' => array (), 'li' => array (),
2012-01-08 10:18:56 +01:00
'h1' => array (), 'h2' => array (), 'h3' => array (), 'h4' => array (), 'h5' => array (), 'h6' => array (),
'img' => array ( 'src' => array (), 'class' => array (), 'alt' => array () )
);
2012-01-08 06:39:49 +01:00
$plugins_section_titles = array (
2014-07-13 00:08:16 +02:00
'description' => _x ( 'Description' , 'Plugin installer section title' ),
'installation' => _x ( 'Installation' , 'Plugin installer section title' ),
'faq' => _x ( 'FAQ' , 'Plugin installer section title' ),
'screenshots' => _x ( 'Screenshots' , 'Plugin installer section title' ),
'changelog' => _x ( 'Changelog' , 'Plugin installer section title' ),
'reviews' => _x ( 'Reviews' , 'Plugin installer section title' ),
'other_notes' => _x ( 'Other Notes' , 'Plugin installer section title' )
2012-01-08 10:18:56 +01:00
);
2012-01-08 06:39:49 +01:00
2014-07-13 00:08:16 +02:00
// Sanitize HTML
foreach ( ( array ) $api -> sections as $section_name => $content ) {
$api -> sections [ $section_name ] = wp_kses ( $content , $plugins_allowedtags );
2014-03-16 19:28:17 +01:00
}
2011-08-23 17:56:14 +02:00
foreach ( array ( 'version' , 'author' , 'requires' , 'tested' , 'homepage' , 'downloaded' , 'slug' ) as $key ) {
2014-07-13 00:08:16 +02:00
if ( isset ( $api -> $key ) ) {
2011-08-23 17:56:14 +02:00
$api -> $key = wp_kses ( $api -> $key , $plugins_allowedtags );
2014-07-13 00:08:16 +02:00
}
2011-08-23 17:56:14 +02:00
}
2008-10-14 17:56:33 +02:00
2014-03-16 19:28:17 +01:00
$_tab = esc_attr ( $tab );
2014-07-13 00:08:16 +02:00
$section = isset ( $_REQUEST [ 'section' ] ) ? wp_unslash ( $_REQUEST [ 'section' ] ) : 'description' ; // Default to the Description tab, Do not translate, API returns English.
2013-09-02 15:54:10 +02:00
if ( empty ( $section ) || ! isset ( $api -> sections [ $section ] ) ) {
$section_titles = array_keys ( ( array ) $api -> sections );
$section = array_shift ( $section_titles );
}
2008-08-09 07:36:14 +02:00
2014-07-13 00:08:16 +02:00
iframe_header ( __ ( 'Plugin Install' ) );
2014-08-15 19:17:16 +02:00
2014-07-09 19:28:17 +02:00
$_with_banner = '' ;
2014-07-13 00:08:16 +02:00
if ( ! empty ( $api -> banners ) && ( ! empty ( $api -> banners [ 'low' ] ) || ! empty ( $api -> banners [ 'high' ] ) ) ) {
2014-07-09 19:28:17 +02:00
$_with_banner = 'with-banner' ;
2014-07-13 00:08:16 +02:00
$low = empty ( $api -> banners [ 'low' ] ) ? $api -> banners [ 'high' ] : $api -> banners [ 'low' ];
$high = empty ( $api -> banners [ 'high' ] ) ? $api -> banners [ 'low' ] : $api -> banners [ 'high' ];
2014-07-09 19:28:17 +02:00
?>
< style type = " text/css " >
#plugin-information-title.with-banner {
2014-07-13 00:08:16 +02:00
background - image : url ( < ? php echo esc_url ( $low ); ?> );
2014-07-09 19:28:17 +02:00
}
2014-07-13 00:08:16 +02:00
@ media only screen and ( - webkit - min - device - pixel - ratio : 1.5 ) {
2014-07-09 19:28:17 +02:00
#plugin-information-title.with-banner {
2014-07-13 00:08:16 +02:00
background - image : url ( < ? php echo esc_url ( $high ); ?> );
2014-07-09 19:28:17 +02:00
}
}
</ style >
< ? php
}
2014-08-13 01:02:16 +02:00
echo '<div id="plugin-information-scrollable">' ;
2014-07-09 19:28:17 +02:00
echo " <div id=' { $_tab } -title' class=' { $_with_banner } '><div class='vignette'></div><h2> { $api -> name } </h2></div> " ;
echo " <div id=' { $_tab } -tabs' class=' { $_with_banner } '> \n " ;
2014-03-16 19:28:17 +01:00
2014-07-13 00:08:16 +02:00
foreach ( ( array ) $api -> sections as $section_name => $content ) {
if ( 'reviews' === $section_name && ( empty ( $api -> ratings ) || 0 === array_sum ( ( array ) $api -> ratings ) ) ) {
2014-07-09 19:28:17 +02:00
continue ;
2014-07-13 00:08:16 +02:00
}
2008-08-09 07:36:14 +02:00
2014-07-13 00:08:16 +02:00
if ( isset ( $plugins_section_titles [ $section_name ] ) ) {
2012-01-08 06:39:49 +01:00
$title = $plugins_section_titles [ $section_name ];
2014-07-13 00:08:16 +02:00
} else {
2012-01-08 06:39:49 +01:00
$title = ucwords ( str_replace ( '_' , ' ' , $section_name ) );
2014-07-13 00:08:16 +02:00
}
2008-08-04 23:17:42 +02:00
2014-07-13 00:08:16 +02:00
$class = ( $section_name === $section ) ? ' class="current"' : '' ;
2008-08-04 23:17:42 +02:00
$href = add_query_arg ( array ( 'tab' => $tab , 'section' => $section_name ) );
2014-03-16 19:28:17 +01:00
$href = esc_url ( $href );
2012-01-08 06:39:49 +01:00
$san_section = esc_attr ( $section_name );
2014-03-16 19:28:17 +01:00
echo " \t <a name=' $san_section ' href=' $href ' $class > $title </a> \n " ;
2008-08-04 23:17:42 +02:00
}
2014-03-16 19:28:17 +01:00
2008-08-04 23:17:42 +02:00
echo " </div> \n " ;
2014-03-16 19:28:17 +01:00
2008-08-04 23:17:42 +02:00
?>
2014-07-09 19:28:17 +02:00
< div id = " <?php echo $_tab ; ?>-content " class = '<?php echo $_with_banner; ?>' >
2014-03-16 19:28:17 +01:00
< div class = " fyi " >
2008-08-04 23:17:42 +02:00
< ul >
2014-07-13 00:08:16 +02:00
< ? php if ( ! empty ( $api -> version ) ) { ?>
< li >< strong >< ? php _e ( 'Version:' ); ?> </strong> <?php echo $api->version; ?></li>
< ? php } if ( ! empty ( $api -> author ) ) { ?>
< li >< strong >< ? php _e ( 'Author:' ); ?> </strong> <?php echo links_add_target( $api->author, '_blank' ); ?></li>
< ? php } if ( ! empty ( $api -> last_updated ) ) { ?>
< li >< strong >< ? php _e ( 'Last Updated:' ); ?> </strong> <span title="<?php echo $api->last_updated; ?>">
< ? php printf ( __ ( '%s ago' ), human_time_diff ( strtotime ( $api -> last_updated ) ) ); ?>
</ span ></ li >
< ? php } if ( ! empty ( $api -> requires ) ) { ?>
< li >< strong >< ? php _e ( 'Requires WordPress Version:' ); ?> </strong> <?php printf( __( '%s or higher' ), $api->requires ); ?></li>
< ? php } if ( ! empty ( $api -> tested ) ) { ?>
< li >< strong >< ? php _e ( 'Compatible up to:' ); ?> </strong> <?php echo $api->tested; ?></li>
< ? php } if ( ! empty ( $api -> downloaded ) ) { ?>
< li >< strong >< ? php _e ( 'Downloaded:' ); ?> </strong> <?php printf( _n( '%s time', '%s times', $api->downloaded ), number_format_i18n( $api->downloaded ) ); ?></li>
< ? php } if ( ! empty ( $api -> slug ) && empty ( $api -> external ) ) { ?>
< li >< a target = " _blank " href = " https://wordpress.org/plugins/<?php echo $api->slug ; ?>/ " >< ? php _e ( 'WordPress.org Plugin Page »' ); ?> </a></li>
< ? php } if ( ! empty ( $api -> homepage ) ) { ?>
< li >< a target = " _blank " href = " <?php echo esc_url( $api->homepage ); ?> " >< ? php _e ( 'Plugin Homepage »' ); ?> </a></li>
< ? php } if ( ! empty ( $api -> donate_link ) && empty ( $api -> contributors ) ) { ?>
2014-08-15 19:17:16 +02:00
< li >< a target = " _blank " href = " <?php echo esc_url( $api->donate_link ); ?> " >< ? php _e ( 'Donate to this plugin »' ); ?> </a></li>
2014-07-13 00:08:16 +02:00
< ? php } ?>
2008-08-04 23:17:42 +02:00
</ ul >
2014-07-13 00:08:16 +02:00
< ? php if ( ! empty ( $api -> rating ) ) { ?>
< h3 >< ? php _e ( 'Average Rating' ); ?> </h3>
2013-11-26 03:25:21 +01:00
< ? php wp_star_rating ( array ( 'rating' => $api -> rating , 'type' => 'percent' , 'number' => $api -> num_ratings ) ); ?>
2014-07-13 00:08:16 +02:00
< small >< ? php printf ( _n ( '(based on %s rating)' , '(based on %s ratings)' , $api -> num_ratings ), number_format_i18n ( $api -> num_ratings ) ); ?> </small>
< ? php }
2014-07-09 19:28:17 +02:00
if ( ! empty ( $api -> ratings ) && array_sum ( ( array ) $api -> ratings ) > 0 ) {
2014-07-13 00:08:16 +02:00
foreach ( $api -> ratings as $key => $ratecount ) {
2014-07-17 11:14:16 +02:00
// Avoid div-by-zero.
2014-07-09 19:28:17 +02:00
$_rating = $api -> num_ratings ? ( $ratecount / $api -> num_ratings ) : 0 ;
?>
< div class = " counter-container " >
2014-07-13 00:08:16 +02:00
< a href = " <?php echo esc_url( self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $api->slug . '&section=reviews' ) ); ?> "
title = " <?php echo esc_attr( sprintf( _n( 'Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $key ), $key ) ); ?> " >
2014-08-15 22:51:16 +02:00
< span class = " counter-label " >< ? php printf ( _n ( '%d star' , '%d stars' , $key ), $key ); ?> </span>
2014-07-13 00:08:16 +02:00
< span class = " counter-back " >
< span class = " counter-bar " style = " width: <?php echo 92 * $_rating ; ?>px; " ></ span >
2014-07-09 19:28:17 +02:00
</ span >
</ a >
2014-08-15 22:51:16 +02:00
< span class = " counter-count " >< ? php echo number_format_i18n ( $ratecount ); ?> </span>
2014-07-09 19:28:17 +02:00
</ div >
2014-07-13 00:08:16 +02:00
< ? php
2014-07-09 19:28:17 +02:00
}
}
2014-07-13 00:08:16 +02:00
if ( ! empty ( $api -> contributors ) ) { ?>
< h3 >< ? php _e ( 'Contributors' ); ?> </h3>
2014-07-09 19:28:17 +02:00
< ul class = " contributors " >
< ? php
foreach ( ( array ) $api -> contributors as $contrib_username => $contrib_profile ) {
2014-07-13 00:08:16 +02:00
if ( empty ( $contrib_username ) && empty ( $contrib_profile ) ) {
2014-07-09 19:28:17 +02:00
continue ;
2014-07-13 00:08:16 +02:00
}
if ( empty ( $contrib_username ) ) {
2014-07-09 19:28:17 +02:00
$contrib_username = preg_replace ( '/^.+\/(.+)\/?$/' , '\1' , $contrib_profile );
2014-07-13 00:08:16 +02:00
}
2014-07-09 19:28:17 +02:00
$contrib_username = sanitize_user ( $contrib_username );
2014-07-13 00:08:16 +02:00
if ( empty ( $contrib_profile ) ) {
echo " <li><img src='https://wordpress.org/grav-redirect.php?user= { $contrib_username } &s=36' width='18' height='18' /> { $contrib_username } </li> " ;
} else {
echo " <li><a href=' { $contrib_profile } ' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user= { $contrib_username } &s=36' width='18' height='18' /> { $contrib_username } </a></li> " ;
}
2014-07-09 19:28:17 +02:00
}
?>
</ ul >
2014-07-13 00:08:16 +02:00
< ? php if ( ! empty ( $api -> donate_link ) ) { ?>
< a target = " _blank " href = " <?php echo esc_url( $api->donate_link ); ?> " >< ? php _e ( 'Donate to this plugin »' ); ?> </a>
< ? php } ?>
< ? php } ?>
2008-08-04 23:17:42 +02:00
</ div >
2008-08-05 19:06:42 +02:00
< div id = " section-holder " class = " wrap " >
2008-10-14 01:39:56 +02:00
< ? php
2014-07-13 00:08:16 +02:00
if ( ! empty ( $api -> tested ) && version_compare ( substr ( $GLOBALS [ 'wp_version' ], 0 , strlen ( $api -> tested ) ), $api -> tested , '>' ) ) {
2014-08-22 05:57:19 +02:00
echo '<div class="error"><p>' . __ ( '<strong>Warning:</strong> This plugin has <strong>not been tested</strong> with your current version of WordPress.' ) . '</p></div>' ;
2014-07-13 00:08:16 +02:00
} else if ( ! empty ( $api -> requires ) && version_compare ( substr ( $GLOBALS [ 'wp_version' ], 0 , strlen ( $api -> requires ) ), $api -> requires , '<' ) ) {
2014-08-22 05:57:19 +02:00
echo '<div class="error"><p>' . __ ( '<strong>Warning:</strong> This plugin has <strong>not been marked as compatible</strong> with your version of WordPress.' ) . '</p></div>' ;
2014-07-13 00:08:16 +02:00
}
2009-03-10 19:31:55 +01:00
2014-07-13 00:08:16 +02:00
foreach ( ( array ) $api -> sections as $section_name => $content ) {
2014-03-16 19:28:17 +01:00
$content = links_add_base_url ( $content , 'https://wordpress.org/plugins/' . $api -> slug . '/' );
$content = links_add_target ( $content , '_blank' );
2008-08-09 07:36:14 +02:00
2012-01-08 06:39:49 +01:00
$san_section = esc_attr ( $section_name );
2008-08-09 07:36:14 +02:00
2014-07-13 00:08:16 +02:00
$display = ( $section_name === $section ) ? 'block' : 'none' ;
2008-08-09 07:36:14 +02:00
2012-01-08 06:39:49 +01:00
echo " \t <div id='section- { $san_section } ' class='section' style='display: { $display } ;'> \n " ;
2008-08-05 19:06:42 +02:00
echo $content ;
echo " \t </div> \n " ;
}
2008-08-04 23:17:42 +02:00
echo " </div> \n " ;
2014-03-16 19:28:17 +01:00
echo " </div> \n " ;
2014-08-13 01:02:16 +02:00
echo " </div> \n " ; // #plugin-information-scrollable
2014-03-16 19:28:17 +01:00
echo " <div id=' $tab -footer'> \n " ;
2014-07-13 00:08:16 +02:00
if ( ! empty ( $api -> download_link ) && ( current_user_can ( 'install_plugins' ) || current_user_can ( 'update_plugins' ) ) ) {
$status = install_plugin_install_status ( $api );
2014-03-16 19:28:17 +01:00
switch ( $status [ 'status' ] ) {
case 'install' :
2014-07-13 00:08:16 +02:00
if ( $status [ 'url' ] ) {
echo '<a class="button button-primary right" href="' . $status [ 'url' ] . '" target="_parent">' . __ ( 'Install Now' ) . '</a>' ;
}
2014-03-16 19:28:17 +01:00
break ;
case 'update_available' :
2014-07-13 00:08:16 +02:00
if ( $status [ 'url' ] ) {
echo '<a class="button button-primary right" href="' . $status [ 'url' ] . '" target="_parent">' . __ ( 'Install Update Now' ) . '</a>' ;
}
2014-03-16 19:28:17 +01:00
break ;
case 'newer_installed' :
2014-07-13 00:08:16 +02:00
echo '<a class="button button-primary right disabled">' . sprintf ( __ ( 'Newer Version (%s) Installed' ), $status [ 'version' ] ) . '</a>' ;
2014-03-16 19:28:17 +01:00
break ;
case 'latest_installed' :
2014-07-13 00:08:16 +02:00
echo '<a class="button button-primary right disabled">' . __ ( 'Latest Version Installed' ) . '</a>' ;
2014-03-16 19:28:17 +01:00
break ;
}
}
echo " </div> \n " ;
2008-08-05 19:06:42 +02:00
2008-10-14 01:39:56 +02:00
iframe_footer ();
2008-08-04 23:17:42 +02:00
exit ;
}
2010-08-11 23:54:51 +02:00
add_action ( 'install_plugins_pre_plugin-information' , 'install_plugin_information' );