2020-04-07 13:03:04 +00:00
< ? php
// Exit if accessed directly
2021-12-20 13:41:59 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
2020-04-07 13:03:04 +00:00
/**
* Allows plugins to use their own update API .
*
* @ author Easy Digital Downloads
2023-03-29 18:20:22 +00:00
* @ version 1.9 . 2
2020-04-07 13:03:04 +00:00
*/
2021-12-20 13:41:59 +00:00
class GeneratePress_Premium_Plugin_Updater {
private $api_url = '' ;
private $api_data = array ();
private $plugin_file = '' ;
private $name = '' ;
private $slug = '' ;
private $version = '' ;
private $wp_override = false ;
private $beta = false ;
2023-03-29 18:20:22 +00:00
private $failed_request_cache_key ;
2020-04-07 13:03:04 +00:00
/**
* Class constructor .
*
* @ uses plugin_basename ()
* @ uses hook ()
*
* @ param string $_api_url The URL pointing to the custom API endpoint .
* @ param string $_plugin_file Path to the plugin file .
* @ param array $_api_data Optional data to send with API calls .
*/
public function __construct ( $_api_url , $_plugin_file , $_api_data = null ) {
global $edd_plugin_data ;
2023-03-29 18:20:22 +00:00
$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 );
2020-04-07 13:03:04 +00:00
$edd_plugin_data [ $this -> slug ] = $this -> api_data ;
/**
* Fires after the $edd_plugin_data is setup .
*
* @ since x . x . x
*
* @ param array $edd_plugin_data Array of EDD SL plugin data .
*/
do_action ( 'post_edd_sl_plugin_updater_setup' , $edd_plugin_data );
// Set up hooks.
$this -> init ();
}
/**
* Set up WordPress filters to hook into WP ' s update process .
*
* @ uses add_filter ()
*
* @ return void
*/
public function init () {
add_filter ( 'pre_set_site_transient_update_plugins' , array ( $this , 'check_update' ) );
add_filter ( 'plugins_api' , array ( $this , 'plugins_api_filter' ), 10 , 3 );
2021-12-20 13:41:59 +00:00
add_action ( 'after_plugin_row' , array ( $this , 'show_update_notification' ), 10 , 2 );
2020-04-07 13:03:04 +00:00
add_action ( 'admin_init' , array ( $this , 'show_changelog' ) );
}
/**
* Check for Updates at the defined API endpoint and modify the update array .
*
* This function dives into the update API just when WordPress creates its update array ,
* then adds a custom API call and injects the custom plugin data retrieved from the API .
* It is reassembled from parts of the native WordPress plugin update code .
* See wp - includes / update . php line 121 for the original wp_update_plugins () function .
*
* @ uses api_request ()
*
* @ param array $_transient_data Update array build by WordPress .
* @ return array Modified update array with custom plugin data .
*/
public function check_update ( $_transient_data ) {
global $pagenow ;
if ( ! is_object ( $_transient_data ) ) {
2021-12-20 13:41:59 +00:00
$_transient_data = new stdClass ();
2020-04-07 13:03:04 +00:00
}
if ( ! empty ( $_transient_data -> response ) && ! empty ( $_transient_data -> response [ $this -> name ] ) && false === $this -> wp_override ) {
return $_transient_data ;
}
2021-07-25 23:25:02 +00:00
$current = $this -> get_repo_api_data ();
if ( false !== $current && is_object ( $current ) && isset ( $current -> new_version ) ) {
if ( version_compare ( $this -> version , $current -> new_version , '<' ) ) {
$_transient_data -> response [ $this -> name ] = $current ;
} else {
// Populating the no_update information is required to support auto-updates in WordPress 5.5.
$_transient_data -> no_update [ $this -> name ] = $current ;
}
2020-04-07 13:03:04 +00:00
}
2021-07-25 23:25:02 +00:00
$_transient_data -> last_checked = time ();
$_transient_data -> checked [ $this -> name ] = $this -> version ;
2020-04-07 13:03:04 +00:00
2021-07-25 23:25:02 +00:00
return $_transient_data ;
}
2020-04-07 13:03:04 +00:00
2021-07-25 23:25:02 +00:00
/**
* Get repo API data from store .
* Save to cache .
*
* @ return \stdClass
*/
public function get_repo_api_data () {
$version_info = $this -> get_cached_version_info ();
2020-04-07 13:03:04 +00:00
2021-07-25 23:25:02 +00:00
if ( false === $version_info ) {
$version_info = $this -> api_request (
'plugin_latest_version' ,
array (
'slug' => $this -> slug ,
'beta' => $this -> beta ,
)
);
if ( ! $version_info ) {
return false ;
2020-04-07 13:03:04 +00:00
}
2021-07-25 23:25:02 +00:00
// This is required for your plugin to support auto-updates in WordPress 5.5.
$version_info -> plugin = $this -> name ;
$version_info -> id = $this -> name ;
2023-03-29 18:20:22 +00:00
$version_info -> tested = $this -> get_tested_version ( $version_info );
2020-04-07 13:03:04 +00:00
2021-07-25 23:25:02 +00:00
$this -> set_version_info_cache ( $version_info );
2020-04-07 13:03:04 +00:00
}
2021-07-25 23:25:02 +00:00
return $version_info ;
2020-04-07 13:03:04 +00:00
}
2023-03-29 18:20:22 +00:00
/**
* 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 );
}
2020-04-07 13:03:04 +00:00
/**
2021-12-20 13:41:59 +00:00
* Show the update notification on multisite subsites .
2020-04-07 13:03:04 +00:00
*
* @ param string $file
* @ param array $plugin
*/
public function show_update_notification ( $file , $plugin ) {
2021-12-20 13:41:59 +00:00
// Return early if in the network admin, or if this is not a multisite install.
if ( is_network_admin () || ! is_multisite () ) {
2020-04-07 13:03:04 +00:00
return ;
}
2023-03-29 18:20:22 +00:00
// Allow single site admins to see that an update is available.
if ( ! current_user_can ( 'activate_plugins' ) ) {
2020-04-07 13:03:04 +00:00
return ;
}
2021-12-20 13:41:59 +00:00
if ( $this -> name !== $file ) {
2020-04-07 13:03:04 +00:00
return ;
}
2021-12-20 13:41:59 +00:00
// Do not print any message if update does not exist.
2020-04-07 13:03:04 +00:00
$update_cache = get_site_transient ( 'update_plugins' );
2021-12-20 13:41:59 +00:00
if ( ! isset ( $update_cache -> response [ $this -> name ] ) ) {
if ( ! is_object ( $update_cache ) ) {
$update_cache = new stdClass ();
2020-04-07 13:03:04 +00:00
}
2021-12-20 13:41:59 +00:00
$update_cache -> response [ $this -> name ] = $this -> get_repo_api_data ();
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
// Return early if this plugin isn't in the transient->response or if the site is running the current or newer version of the plugin.
if ( empty ( $update_cache -> response [ $this -> name ] ) || version_compare ( $this -> version , $update_cache -> response [ $this -> name ] -> new_version , '>=' ) ) {
return ;
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
printf (
'<tr class="plugin-update-tr %3$s" id="%1$s-update" data-slug="%1$s" data-plugin="%2$s">' ,
$this -> slug ,
$file ,
in_array ( $this -> name , $this -> get_active_plugins (), true ) ? 'active' : 'inactive'
);
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
echo '<td colspan="3" class="plugin-update colspanchange">' ;
echo '<div class="update-message notice inline notice-warning notice-alt"><p>' ;
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
$changelog_link = '' ;
if ( ! empty ( $update_cache -> response [ $this -> name ] -> sections -> changelog ) ) {
$changelog_link = add_query_arg (
array (
'edd_sl_action' => 'view_plugin_changelog' ,
'plugin' => urlencode ( $this -> name ),
'slug' => urlencode ( $this -> slug ),
'TB_iframe' => 'true' ,
'width' => 77 ,
'height' => 911 ,
),
self_admin_url ( 'index.php' )
);
2020-04-07 13:03:04 +00:00
}
2021-12-20 13:41:59 +00:00
$update_link = add_query_arg (
array (
'action' => 'upgrade-plugin' ,
'plugin' => urlencode ( $this -> name ),
),
self_admin_url ( 'update.php' )
);
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
printf (
/* translators: the plugin name. */
esc_html__ ( 'There is a new version of %1$s available.' , 'easy-digital-downloads' ),
esc_html ( $plugin [ 'Name' ] )
);
2020-04-07 13:03:04 +00:00
2023-03-29 18:20:22 +00:00
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 ' ' ;
2021-12-20 13:41:59 +00:00
printf (
/* translators: 1. opening anchor tag, do not translate 2. the new plugin version 3. closing anchor tag, do not translate. */
2023-03-29 18:20:22 +00:00
__ ( '%1$sView version %2$s details%3$s.' , 'easy-digital-downloads' ),
2021-12-20 13:41:59 +00:00
'<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 ) ) {
2023-03-29 18:20:22 +00:00
echo ' ' ;
2021-12-20 13:41:59 +00:00
printf (
2023-03-29 18:20:22 +00:00
__ ( '%1$sView version %2$s details%3$s or %4$supdate now%5$s.' , 'easy-digital-downloads' ),
2021-12-20 13:41:59 +00:00
'<a target="_blank" class="thickbox open-plugin-details-modal" href="' . esc_url ( $changelog_link ) . '">' ,
esc_html ( $update_cache -> response [ $this -> name ] -> new_version ),
'</a>' ,
'<a target="_blank" class="update-link" href="' . esc_url ( wp_nonce_url ( $update_link , 'upgrade-plugin_' . $file ) ) . '">' ,
'</a>'
);
} else {
printf (
' %1$s%2$s%3$s' ,
'<a target="_blank" class="update-link" href="' . esc_url ( wp_nonce_url ( $update_link , 'upgrade-plugin_' . $file ) ) . '">' ,
esc_html__ ( 'Update now.' , 'easy-digital-downloads' ),
'</a>'
);
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
do_action ( " in_plugin_update_message- { $file } " , $plugin , $plugin );
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
echo '</p></div></td></tr>' ;
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
/**
* Gets the plugins active in a multisite network .
*
* @ return array
*/
private function get_active_plugins () {
$active_plugins = ( array ) get_option ( 'active_plugins' );
$active_network_plugins = ( array ) get_site_option ( 'active_sitewide_plugins' );
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
return array_merge ( $active_plugins , array_keys ( $active_network_plugins ) );
2020-04-07 13:03:04 +00:00
}
/**
* Updates information on the " View version x.x details " page with custom data .
*
* @ uses api_request ()
*
* @ param mixed $_data
* @ param string $_action
* @ param object $_args
* @ return object $_data
*/
public function plugins_api_filter ( $_data , $_action = '' , $_args = null ) {
2021-12-20 13:41:59 +00:00
if ( 'plugin_information' !== $_action ) {
2020-04-07 13:03:04 +00:00
return $_data ;
}
2021-12-20 13:41:59 +00:00
if ( ! isset ( $_args -> slug ) || ( $_args -> slug !== $this -> slug ) ) {
2020-04-07 13:03:04 +00:00
return $_data ;
}
$to_send = array (
'slug' => $this -> slug ,
'is_ssl' => is_ssl (),
'fields' => array (
'banners' => array (),
'reviews' => false ,
'icons' => array (),
2021-12-20 13:41:59 +00:00
),
2020-04-07 13:03:04 +00:00
);
// Get the transient where we store the api request for this plugin for 24 hours
2020-08-13 14:53:39 +00:00
$edd_api_request_transient = $this -> get_cached_version_info ();
2020-04-07 13:03:04 +00:00
//If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now.
if ( empty ( $edd_api_request_transient ) ) {
$api_response = $this -> api_request ( 'plugin_information' , $to_send );
// Expires in 3 hours
2020-08-13 14:53:39 +00:00
$this -> set_version_info_cache ( $api_response );
2020-04-07 13:03:04 +00:00
if ( false !== $api_response ) {
$_data = $api_response ;
}
} else {
$_data = $edd_api_request_transient ;
}
// Convert sections into an associative array, since we're getting an object, but Core expects an array.
if ( isset ( $_data -> sections ) && ! is_array ( $_data -> sections ) ) {
$_data -> sections = $this -> convert_object_to_array ( $_data -> sections );
}
// Convert banners into an associative array, since we're getting an object, but Core expects an array.
if ( isset ( $_data -> banners ) && ! is_array ( $_data -> banners ) ) {
$_data -> banners = $this -> convert_object_to_array ( $_data -> banners );
}
// Convert icons into an associative array, since we're getting an object, but Core expects an array.
if ( isset ( $_data -> icons ) && ! is_array ( $_data -> icons ) ) {
$_data -> icons = $this -> convert_object_to_array ( $_data -> icons );
}
2020-08-13 14:53:39 +00:00
// Convert contributors into an associative array, since we're getting an object, but Core expects an array.
if ( isset ( $_data -> contributors ) && ! is_array ( $_data -> contributors ) ) {
$_data -> contributors = $this -> convert_object_to_array ( $_data -> contributors );
}
2021-12-20 13:41:59 +00:00
if ( ! isset ( $_data -> plugin ) ) {
2020-04-07 13:03:04 +00:00
$_data -> plugin = $this -> name ;
}
return $_data ;
}
/**
* Convert some objects to arrays when injecting data into the update API
*
* Some data like sections , banners , and icons are expected to be an associative array , however due to the JSON
* decoding , they are objects . This method allows us to pass in the object and return an associative array .
*
* @ since 3.6 . 5
*
* @ param stdClass $data
*
* @ return array
*/
private function convert_object_to_array ( $data ) {
2021-12-20 13:41:59 +00:00
if ( ! is_array ( $data ) && ! is_object ( $data ) ) {
return array ();
}
2020-04-07 13:03:04 +00:00
$new_data = array ();
foreach ( $data as $key => $value ) {
2020-08-13 14:53:39 +00:00
$new_data [ $key ] = is_object ( $value ) ? $this -> convert_object_to_array ( $value ) : $value ;
2020-04-07 13:03:04 +00:00
}
return $new_data ;
}
/**
* Disable SSL verification in order to prevent download update failures
*
* @ param array $args
* @ param string $url
* @ return object $array
*/
public function http_request_args ( $args , $url ) {
if ( strpos ( $url , 'https://' ) !== false && strpos ( $url , 'edd_action=package_download' ) ) {
2021-12-20 13:41:59 +00:00
$args [ 'sslverify' ] = $this -> verify_ssl ();
2020-04-07 13:03:04 +00:00
}
return $args ;
}
/**
* Calls the API and , if successfull , returns the object delivered by the API .
*
* @ uses get_bloginfo ()
* @ uses wp_remote_post ()
* @ uses is_wp_error ()
*
* @ param string $_action The requested action .
* @ param array $_data Parameters for the API action .
2023-03-29 18:20:22 +00:00
* @ return false | object | void
2020-04-07 13:03:04 +00:00
*/
private function api_request ( $_action , $_data ) {
2023-03-29 18:20:22 +00:00
$data = array_merge ( $this -> api_data , $_data );
2020-04-07 13:03:04 +00:00
2023-03-29 18:20:22 +00:00
if ( $data [ 'slug' ] !== $this -> slug ) {
return ;
}
2020-04-07 13:03:04 +00:00
2023-03-29 18:20:22 +00:00
// Don't allow a plugin to ping itself
if ( trailingslashit ( home_url () ) === $this -> api_url ) {
return false ;
2020-04-07 13:03:04 +00:00
}
2023-03-29 18:20:22 +00:00
if ( $this -> request_recently_failed () ) {
2021-07-25 23:25:02 +00:00
return false ;
2020-04-07 13:03:04 +00:00
}
2023-03-29 18:20:22 +00:00
return $this -> get_version_from_remote ();
}
2020-04-07 13:03:04 +00:00
2023-03-29 18:20:22 +00:00
/**
* 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 ;
2020-04-07 13:03:04 +00:00
}
2023-03-29 18:20:22 +00:00
/*
* 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 );
2021-12-20 13:41:59 +00:00
return false ;
2020-04-07 13:03:04 +00:00
}
2023-03-29 18:20:22 +00:00
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' ) );
2020-04-07 13:03:04 +00:00
}
2020-08-13 14:53:39 +00:00
/**
* If available , show the changelog for sites in a multisite install .
*/
2020-04-07 13:03:04 +00:00
public function show_changelog () {
2021-12-20 13:41:59 +00:00
if ( empty ( $_REQUEST [ 'edd_sl_action' ] ) || 'view_plugin_changelog' !== $_REQUEST [ 'edd_sl_action' ] ) {
2020-04-07 13:03:04 +00:00
return ;
}
2021-12-20 13:41:59 +00:00
if ( empty ( $_REQUEST [ 'plugin' ] ) ) {
2020-04-07 13:03:04 +00:00
return ;
}
2021-12-20 13:41:59 +00:00
if ( empty ( $_REQUEST [ 'slug' ] ) || $this -> slug !== $_REQUEST [ 'slug' ] ) {
2020-04-07 13:03:04 +00:00
return ;
}
2021-12-20 13:41:59 +00:00
if ( ! current_user_can ( 'update_plugins' ) ) {
wp_die ( esc_html__ ( 'You do not have permission to install plugin updates' , 'easy-digital-downloads' ), esc_html__ ( 'Error' , 'easy-digital-downloads' ), array ( 'response' => 403 ) );
2020-04-07 13:03:04 +00:00
}
2021-12-20 13:41:59 +00:00
$version_info = $this -> get_repo_api_data ();
if ( isset ( $version_info -> sections ) ) {
$sections = $this -> convert_object_to_array ( $version_info -> sections );
if ( ! empty ( $sections [ 'changelog' ] ) ) {
echo '<div style="background:#fff;padding:10px;">' . wp_kses_post ( $sections [ 'changelog' ] ) . '</div>' ;
}
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
exit ;
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
/**
* Gets the current version information from the remote site .
*
* @ return array | false
*/
private function get_version_from_remote () {
$api_params = array (
'edd_action' => 'get_version' ,
'license' => ! empty ( $this -> api_data [ 'license' ] ) ? $this -> api_data [ 'license' ] : '' ,
'item_name' => isset ( $this -> api_data [ 'item_name' ] ) ? $this -> api_data [ 'item_name' ] : false ,
'item_id' => isset ( $this -> api_data [ 'item_id' ] ) ? $this -> api_data [ 'item_id' ] : false ,
'version' => isset ( $this -> api_data [ 'version' ] ) ? $this -> api_data [ 'version' ] : false ,
'slug' => $this -> slug ,
'author' => $this -> api_data [ 'author' ],
'url' => home_url (),
'beta' => $this -> beta ,
'php_version' => phpversion (),
'wp_version' => get_bloginfo ( 'version' ),
);
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
/**
* Filters the parameters sent in the API request .
*
* @ param array $api_params The array of data sent in the request .
* @ param array $this -> api_data The array of data set up in the class constructor .
* @ param string $this -> plugin_file The full path and filename of the file .
*/
$api_params = apply_filters ( 'edd_sl_plugin_updater_api_params' , $api_params , $this -> api_data , $this -> plugin_file );
$request = wp_remote_post (
$this -> api_url ,
array (
'timeout' => 15 ,
'sslverify' => $this -> verify_ssl (),
'body' => $api_params ,
)
);
2020-04-07 13:03:04 +00:00
2023-03-29 18:20:22 +00:00
if ( is_wp_error ( $request ) || ( 200 !== wp_remote_retrieve_response_code ( $request ) ) ) {
$this -> log_failed_request ();
2021-12-20 13:41:59 +00:00
return false ;
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
$request = json_decode ( wp_remote_retrieve_body ( $request ) );
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
if ( $request && isset ( $request -> sections ) ) {
$request -> sections = maybe_unserialize ( $request -> sections );
} else {
$request = false ;
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
if ( $request && isset ( $request -> banners ) ) {
$request -> banners = maybe_unserialize ( $request -> banners );
}
2020-04-07 13:03:04 +00:00
2021-12-20 13:41:59 +00:00
if ( $request && isset ( $request -> icons ) ) {
$request -> icons = maybe_unserialize ( $request -> icons );
2020-04-07 13:03:04 +00:00
}
2021-12-20 13:41:59 +00:00
if ( ! empty ( $request -> sections ) ) {
foreach ( $request -> sections as $key => $section ) {
$request -> $key = ( array ) $section ;
2020-08-13 14:53:39 +00:00
}
2020-04-07 13:03:04 +00:00
}
2021-12-20 13:41:59 +00:00
return $request ;
2020-04-07 13:03:04 +00:00
}
2020-08-13 14:53:39 +00:00
/**
2021-12-20 13:41:59 +00:00
* Get the version info from the cache , if it exists .
2020-08-13 14:53:39 +00:00
*
* @ param string $cache_key
2021-12-20 13:41:59 +00:00
* @ return object
2020-08-13 14:53:39 +00:00
*/
2020-04-07 13:03:04 +00:00
public function get_cached_version_info ( $cache_key = '' ) {
2021-12-20 13:41:59 +00:00
if ( empty ( $cache_key ) ) {
$cache_key = $this -> get_cache_key ();
2020-04-07 13:03:04 +00:00
}
$cache = get_option ( $cache_key );
2021-12-20 13:41:59 +00:00
// Cache is expired
if ( empty ( $cache [ 'timeout' ] ) || time () > $cache [ 'timeout' ] ) {
return false ;
2020-04-07 13:03:04 +00:00
}
// We need to turn the icons into an array, thanks to WP Core forcing these into an object at some point.
$cache [ 'value' ] = json_decode ( $cache [ 'value' ] );
if ( ! empty ( $cache [ 'value' ] -> icons ) ) {
$cache [ 'value' ] -> icons = ( array ) $cache [ 'value' ] -> icons ;
}
return $cache [ 'value' ];
}
2020-08-13 14:53:39 +00:00
/**
* Adds the plugin version information to the database .
*
* @ param string $value
* @ param string $cache_key
*/
2020-04-07 13:03:04 +00:00
public function set_version_info_cache ( $value = '' , $cache_key = '' ) {
2021-12-20 13:41:59 +00:00
if ( empty ( $cache_key ) ) {
$cache_key = $this -> get_cache_key ();
2020-04-07 13:03:04 +00:00
}
$data = array (
'timeout' => strtotime ( '+3 hours' , time () ),
2021-12-20 13:41:59 +00:00
'value' => wp_json_encode ( $value ),
2020-04-07 13:03:04 +00:00
);
update_option ( $cache_key , $data , 'no' );
2020-08-13 14:53:39 +00:00
// Delete the duplicate option
delete_option ( 'edd_api_request_' . md5 ( serialize ( $this -> slug . $this -> api_data [ 'license' ] . $this -> beta ) ) );
2020-04-07 13:03:04 +00:00
}
/**
* Returns if the SSL of the store should be verified .
*
* @ since 1.6 . 13
* @ return bool
*/
private function verify_ssl () {
return ( bool ) apply_filters ( 'edd_sl_api_request_verify_ssl' , true , $this );
}
2021-12-20 13:41:59 +00:00
/**
* Gets the unique key ( option name ) for a plugin .
*
* @ since 1.9 . 0
* @ return string
*/
private function get_cache_key () {
$string = $this -> slug . $this -> api_data [ 'license' ] . $this -> beta ;
return 'edd_sl_' . md5 ( serialize ( $string ) );
}
2020-04-07 13:03:04 +00:00
}