+/**
+ * Determine the status we can perform on a plugin.
+ *
+ * @since 3.0.0
+ */
+function install_plugin_install_status($api, $loop = false) {
+ // this function is called recursivly, $loop prevents futhur loops.
+ if ( is_array($api) )
+ $api = (object) $api;
+
+ //Default to a "new" plugin
+ $status = 'install';
+ $url = false;
+
+ //Check to see if this plugin is known to be installed, and has an update awaiting it.
+ $update_plugins = get_site_transient('update_plugins');
+ if ( is_object( $update_plugins ) ) {
+ 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') )
+ $url = wp_nonce_url(admin_url('update.php?action=upgrade-plugin&plugin=' . $update_file), 'upgrade-plugin_' . $update_file);
+ break;
+ }
+ }
+ }
+
+ if ( 'install' == $status ) {
+ if ( is_dir( WP_PLUGIN_DIR . '/' . $api->slug ) ) {
+ $installed_plugin = get_plugins('/' . $api->slug);
+ if ( empty($installed_plugin) ) {
+ if ( current_user_can('install_plugins') )
+ $url = wp_nonce_url(admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug);
+ } else {
+ $key = array_shift( $key = array_keys($installed_plugin) ); //Use the first plugin regardless of the name, Could have issues for multiple-plugins in one directory if they share different version numbers
+ 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') )
+ $url = wp_nonce_url(admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug);
+ }
+ }
+ if ( isset($_GET['from']) )
+ $url .= '&from=' . urlencode(stripslashes($_GET['from']));
+
+ return compact('status', 'url', 'version');
+}
+