updated plugin GP Premium
version 2.3.0
This commit is contained in:
@ -9,7 +9,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||
* Allows plugins to use their own update API.
|
||||
*
|
||||
* @author Easy Digital Downloads
|
||||
* @version 1.9.0
|
||||
* @version 1.9.2
|
||||
*/
|
||||
class GeneratePress_Premium_Plugin_Updater {
|
||||
|
||||
@ -21,7 +21,7 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
private $version = '';
|
||||
private $wp_override = false;
|
||||
private $beta = false;
|
||||
private $health_check_timeout = 5;
|
||||
private $failed_request_cache_key;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
@ -37,14 +37,15 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
|
||||
global $edd_plugin_data;
|
||||
|
||||
$this->api_url = trailingslashit( $_api_url );
|
||||
$this->api_data = $_api_data;
|
||||
$this->plugin_file = $_plugin_file;
|
||||
$this->name = plugin_basename( $_plugin_file );
|
||||
$this->slug = basename( $_plugin_file, '.php' );
|
||||
$this->version = $_api_data['version'];
|
||||
$this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false;
|
||||
$this->beta = ! empty( $this->api_data['beta'] ) ? true : false;
|
||||
$this->api_url = trailingslashit( $_api_url );
|
||||
$this->api_data = $_api_data;
|
||||
$this->plugin_file = $_plugin_file;
|
||||
$this->name = plugin_basename( $_plugin_file );
|
||||
$this->slug = basename( $_plugin_file, '.php' );
|
||||
$this->version = $_api_data['version'];
|
||||
$this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false;
|
||||
$this->beta = ! empty( $this->api_data['beta'] ) ? true : false;
|
||||
$this->failed_request_cache_key = 'edd_sl_failed_http_' . md5( $this->api_url );
|
||||
|
||||
$edd_plugin_data[ $this->slug ] = $this->api_data;
|
||||
|
||||
@ -142,6 +143,7 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
// This is required for your plugin to support auto-updates in WordPress 5.5.
|
||||
$version_info->plugin = $this->name;
|
||||
$version_info->id = $this->name;
|
||||
$version_info->tested = $this->get_tested_version( $version_info );
|
||||
|
||||
$this->set_version_info_cache( $version_info );
|
||||
}
|
||||
@ -149,6 +151,38 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
return $version_info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the plugin's tested version.
|
||||
*
|
||||
* @since 1.9.2
|
||||
* @param object $version_info
|
||||
* @return null|string
|
||||
*/
|
||||
private function get_tested_version( $version_info ) {
|
||||
|
||||
// There is no tested version.
|
||||
if ( empty( $version_info->tested ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Strip off extra version data so the result is x.y or x.y.z.
|
||||
list( $current_wp_version ) = explode( '-', get_bloginfo( 'version' ) );
|
||||
|
||||
// The tested version is greater than or equal to the current WP version, no need to do anything.
|
||||
if ( version_compare( $version_info->tested, $current_wp_version, '>=' ) ) {
|
||||
return $version_info->tested;
|
||||
}
|
||||
$current_version_parts = explode( '.', $current_wp_version );
|
||||
$tested_parts = explode( '.', $version_info->tested );
|
||||
|
||||
// The current WordPress version is x.y.z, so update the tested version to match it.
|
||||
if ( isset( $current_version_parts[2] ) && $current_version_parts[0] === $tested_parts[0] && $current_version_parts[1] === $tested_parts[1] ) {
|
||||
$tested_parts[2] = $current_version_parts[2];
|
||||
}
|
||||
|
||||
return implode( '.', $tested_parts );
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the update notification on multisite subsites.
|
||||
*
|
||||
@ -162,7 +196,8 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! current_user_can( 'update_plugins' ) ) {
|
||||
// Allow single site admins to see that an update is available.
|
||||
if ( ! current_user_can( 'activate_plugins' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -223,17 +258,22 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
esc_html( $plugin['Name'] )
|
||||
);
|
||||
|
||||
if ( empty( $update_cache->response[ $this->name ]->package ) && ! empty( $changelog_link ) ) {
|
||||
if ( ! current_user_can( 'update_plugins' ) ) {
|
||||
echo ' ';
|
||||
esc_html_e( 'Contact your network administrator to install the update.', 'easy-digital-downloads' );
|
||||
} elseif ( empty( $update_cache->response[ $this->name ]->package ) && ! empty( $changelog_link ) ) {
|
||||
echo ' ';
|
||||
printf(
|
||||
/* translators: 1. opening anchor tag, do not translate 2. the new plugin version 3. closing anchor tag, do not translate. */
|
||||
__( ' %1$sView version %2$s details%3$s.', 'easy-digital-downloads' ),
|
||||
__( '%1$sView version %2$s details%3$s.', 'easy-digital-downloads' ),
|
||||
'<a target="_blank" class="thickbox open-plugin-details-modal" href="' . esc_url( $changelog_link ) . '">',
|
||||
esc_html( $update_cache->response[ $this->name ]->new_version ),
|
||||
'</a>'
|
||||
);
|
||||
} elseif ( ! empty( $changelog_link ) ) {
|
||||
echo ' ';
|
||||
printf(
|
||||
__( ' %1$sView version %2$s details%3$s or %4$supdate now%5$s.', 'easy-digital-downloads' ),
|
||||
__( '%1$sView version %2$s details%3$s or %4$supdate now%5$s.', 'easy-digital-downloads' ),
|
||||
'<a target="_blank" class="thickbox open-plugin-details-modal" href="' . esc_url( $changelog_link ) . '">',
|
||||
esc_html( $update_cache->response[ $this->name ]->new_version ),
|
||||
'</a>',
|
||||
@ -394,40 +434,9 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
*
|
||||
* @param string $_action The requested action.
|
||||
* @param array $_data Parameters for the API action.
|
||||
* @return false|object
|
||||
* @return false|object|void
|
||||
*/
|
||||
private function api_request( $_action, $_data ) {
|
||||
|
||||
global $edd_plugin_url_available;
|
||||
|
||||
// Do a quick status check on this domain if we haven't already checked it.
|
||||
$store_hash = md5( $this->api_url );
|
||||
if ( ! is_array( $edd_plugin_url_available ) || ! isset( $edd_plugin_url_available[ $store_hash ] ) ) {
|
||||
$test_url_parts = wp_parse_url( $this->api_url );
|
||||
|
||||
$scheme = ! empty( $test_url_parts['scheme'] ) ? $test_url_parts['scheme'] : 'http';
|
||||
$host = ! empty( $test_url_parts['host'] ) ? $test_url_parts['host'] : '';
|
||||
$port = ! empty( $test_url_parts['port'] ) ? ':' . $test_url_parts['port'] : '';
|
||||
|
||||
if ( empty( $host ) ) {
|
||||
$edd_plugin_url_available[ $store_hash ] = false;
|
||||
} else {
|
||||
$test_url = $scheme . '://' . $host . $port;
|
||||
$response = wp_remote_get(
|
||||
$test_url,
|
||||
array(
|
||||
'timeout' => $this->health_check_timeout,
|
||||
'sslverify' => $this->verify_ssl(),
|
||||
)
|
||||
);
|
||||
$edd_plugin_url_available[ $store_hash ] = is_wp_error( $response ) ? false : true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( false === $edd_plugin_url_available[ $store_hash ] ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = array_merge( $this->api_data, $_data );
|
||||
|
||||
if ( $data['slug'] !== $this->slug ) {
|
||||
@ -439,9 +448,56 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( $this->request_recently_failed() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->get_version_from_remote();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if a request has recently failed.
|
||||
*
|
||||
* @since 1.9.1
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function request_recently_failed() {
|
||||
$failed_request_details = get_option( $this->failed_request_cache_key );
|
||||
|
||||
// Request has never failed.
|
||||
if ( empty( $failed_request_details ) || ! is_numeric( $failed_request_details ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Request previously failed, but the timeout has expired.
|
||||
* This means we're allowed to try again.
|
||||
*/
|
||||
if ( time() > $failed_request_details ) {
|
||||
delete_option( $this->failed_request_cache_key );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs a failed HTTP request for this API URL.
|
||||
* We set a timestamp for 1 hour from now. This prevents future API requests from being
|
||||
* made to this domain for 1 hour. Once the timestamp is in the past, API requests
|
||||
* will be allowed again. This way if the site is down for some reason we don't bombard
|
||||
* it with failed API requests.
|
||||
*
|
||||
* @see EDD_SL_Plugin_Updater::request_recently_failed
|
||||
*
|
||||
* @since 1.9.1
|
||||
*/
|
||||
private function log_failed_request() {
|
||||
update_option( $this->failed_request_cache_key, strtotime( '+1 hour' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* If available, show the changelog for sites in a multisite install.
|
||||
*/
|
||||
@ -512,7 +568,9 @@ class GeneratePress_Premium_Plugin_Updater {
|
||||
)
|
||||
);
|
||||
|
||||
if ( is_wp_error( $request ) ) {
|
||||
if ( is_wp_error( $request ) || ( 200 !== wp_remote_retrieve_response_code( $request ) ) ) {
|
||||
$this->log_failed_request();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user